赛后马后炮---canary+字符串泄露+ROP构造

分析

二话不说,直接拉到IDA,然后F5走起。

之后我们跟进
main.png

recvid.png

很明显,这个是接收ID的,其中sub_400ABE函数应该就是接收函数了。我们看一看
recv.png
果然,大概意思就是两个参数,一个字符串地址,一个接收的长度。然后for长度,用read接收字符,遇到n就break。

之后跟进第二个函数,是接收文本的,发现上面的recv长度可控。
大概逻辑就是接收文本长度,然后接收文本,然后把文本返回
recvstory.png

然而因为接收的长度是严格按照我们输入的大小来控制的,在接收函数那似乎并不能溢出。
但是!看到第一个参数s。我们这个参数是一个字符串地址,往这里写入的长度是我们可以控制的,那么,这个s的内存是在哪里申请的呢?
我们往上找,在接收story长度的那里
mems.png
size.png
看到了这个20ull
只要我们输入的长度大于这个20ull,理论就能覆盖返回地址。

虽说这里判断接收的size,如果>128,就默认是1024ll,但是我们看小于0,并没有判断大小
if.png
所以我们只需要在前面加个符号就能绕过判断了。
典型的ROP,之后就是我们要获取到libc地址。

代码直接使用了printf(%s),就是和明显的字符串泄露了
在此之前,先用checksec分析一下。
TIM截图20190412003915.png
发现开启了canary。这时候就需要泄露canary地址了

打开IDA/gdp,给printf下断点,执行。然后查看栈。

找到xor ebp,ebp

TIM截图20190412004130.png

数一数距离printf的栈顶有多远,这里是15,也就是cannary的地址了。

接下来得构造ROP调用system来执行我们的代码,就得用ROP构造了,不过在此之前我们得先找到libc的地址来构造。

因此我们先找个函数来计算libc基地址。到时候再更具基地址查找版本,再查找system函数的偏移就行了。

首先我们先用ldd来查看libc,got地址或者直接使用pwntools的elf功能。

大致思路就是这样,好困我先睡觉去了,明天找时间再写

代码

Tags: none

赛后马后炮2--TTL隐写

题目

我们截获了一些IP数据报,发现报文头中的TTL值特别可疑,怀疑是通信方嵌入了数据到TTL,我们将这些TTL值提取了出来,你能看出什么端倪吗?

TIM截图20190410134946.jpg

下载:ttl.zip

分析

一开始以为是转成ascii,然后发现并不是。

结果去重复之后,发现只有127,63,191,255四个结果。

转换为ascii后发现一个是正问好一个是反问号和两个奇怪的东西。

然后把问好当成点划,其他当成换行符空格,用摩斯电码,也不是。

把四个结果当成上下左右,也不是。

最后问了问dalao。是吧四个结果当成00 01 10 11.

IP报文在路由间穿梭的时候每经过一个路由,TTL就会减1,当TTL为0的时候,该报文就会被丢弃。TTL所占的位数是8位,也就是0-255的范围,但是在大多数情况下通常只需要经过很小的跳数就能完成报文的转发,远远比上限255小得多,所以我们可以用TTL值的前两位来进行传输隐藏数据。

如:须传送H字符,只需把H字符换成二进制,每两位为一组,每次填充到TTL字段的开头两位并把剩下的6位设置为1(xx111111),这样发4个IP报文即可传送1个字节。

因为是255,所以转换为二进制的最大长度也就是8位了。
然后禁制查看
63转二进制是00111111,127是01111111,191是10111111,255是11111111
然后再取前两位,因为后面6位都被设置为1。
即可对应63->00,127->01,191->10,255->11
TIM截图20190410144434.jpg

之后,试试转换为hex。
TIM截图20190410144434.jpg
看到ffd8头,就知道这是图片了
然而这些只是hex的文本形式,我们得把这些转换成文件流。

写出后打开,发现是部分二维码
TIM截图20190410154935.jpg

使用Stegsolve后发现,有6个frame,全部提取出来,之后用画图拼起来
TIM截图20190410155120.jpg

最后给拼出了个这个
TIM截图20190410160042.jpg
然后去解析,得出

key:AutomaticKey cipher:fftu{2028mb39927wn1f96o6e12z03j58002p}

然后更具key,google一下,找到了自动密码钥密码,在线解密一波

TIM截图20190410160322.jpg

因为这种加密方式只对字母有效,我们还得手动把括号和数字加上去

得出 flag{2028ab39927df1d96e6a12b03e58002e}

Tags: none

继续赛后马后炮系列--一个搜索题目

前言

西湖论剑,错过了。只有现在才可以。只好先把题目下载下来,半夜三根的慢慢做。

我的顺序是先misc->web->pwn,其他题目我就真的做不来啦。

现在也先写一个Misc题目吧,题目如下:

资深宅“flag{”在朋友邀请下,参加了一场聚会。
在聚会上看到了美女“75D}”,一时心花荡漾、不能自己,坚信彼此就是天造地设的一双。
想通过层层朋友的关系认识她,却无奈性格问题,不敢劳师动众。
好在朋友帮忙搞到一张聚会人员关系图,如下:

[('FloraPrice','E11'),('FloraPrice','E9'),('FloraPrice','75D}'),('NoraFayette','E11'),('NoraFayette','E10'),('NoraFayette','E13'),('NoraFayette','E12'),('NoraFayette','E14'),('NoraFayette','E9'),('NoraFayette','E7'),('NoraFayette','E6'),('E10','SylviaAvondale'),('E10','MyraLiddel'),('E10','HelenLloyd'),('E10','KatherinaRogers'),('VerneSanderson','E7'),('VerneSanderson','E12'),('VerneSanderson','E9'),('VerneSanderson','E8'),('E12','HelenLloyd'),('E12','KatherinaRogers'),('E12','SylviaAvondale'),('E12','MyraLiddel'),('E14','SylviaAvondale'),('E14','75D}'),('E14','KatherinaRogers'),('FrancesAnderson','E5'),('FrancesAnderson','E6'),('FrancesAnderson','E8'),('FrancesAnderson','E3'),('DorothyMurchison','E9'),('DorothyMurchison','E8'),('EvelynJefferson','E9'),('EvelynJefferson','E8'),('EvelynJefferson','E5'),('EvelynJefferson','E4'),('EvelynJefferson','E6'),('EvelynJefferson','E1'),('EvelynJefferson','E3'),('EvelynJefferson','E2'),('RuthDeSand','E5'),('RuthDeSand','E7'),('RuthDeSand','E9'),('RuthDeSand','E8'),('HelenLloyd','E11'),('HelenLloyd','E7'),('HelenLloyd','E8'),('OliviaCarleton','E11'),('OliviaCarleton','E9'),('EleanorNye','E5'),('EleanorNye','E7'),('EleanorNye','E6'),('EleanorNye','E8'),('E9','TheresaAnderson'),('E9','PearlOglethorpe'),('E9','KatherinaRogers'),('E9','SylviaAvondale'),('E9','MyraLiddel'),('E8','TheresaAnderson'),('E8','PearlOglethorpe'),('E8','KatherinaRogers'),('E8','SylviaAvondale'),('E8','BrendaRogers'),('E8','LauraMandeville'),('E8','MyraLiddel'),('E5','TheresaAnderson'),('E5','BrendaRogers'),('E5','LauraMandeville'),('E5','CharlotteMcDowd'),('E4','CharlotteMcDowd'),('E4','TheresaAnderson'),('E4','BrendaRogers'),('E7','TheresaAnderson'),('E7','SylviaAvondale'),('E7','BrendaRogers'),('E7','LauraMandeville'),('E7','CharlotteMcDowd'),('E6','TheresaAnderson'),('E6','PearlOglethorpe'),('E6','BrendaRogers'),('E6','LauraMandeville'),('E1','LauraMandeville'),('E1','BrendaRogers'),('E3','TheresaAnderson'),('E3','BrendaRogers'),('E3','LauraMandeville'),('E3','CharlotteMcDowd'),('E3','flag{'),('E2','LauraMandeville'),('E2','TheresaAnderson'),('KatherinaRogers','E13'),('E13','SylviaAvondale')]

你能在让最少人知道的情况下,帮助flag先生联系上75D小姐姐吗?
求节点“flag{”到“75D”的最短路径,即为flag,比如:flag{E3AliceBobXXXXXXXXXXXXXXXX75D}

很明显一个BFS搜索最短路径。

虽然说直接用手算就行,但是我一定要整一个软件出来

分析

我们先看上面这么多数据,我们假设把名字当成节点,En当成line。

我们就能分为两种分类,一种是 名字开头,成员是线的标准node maps。

friendship = {'FloraPrice': ['E11', 'E9', '75D}'], 'NoraFayette': ['E11', 'E10', 'E13', 'E12', 'E14', 'E9', 'E7', 'E6'], 'VerneSanderson': ['E7', 'E12', 'E9', 'E8'], 'FrancesAnderson': ['E5', 'E6', 'E8', 'E3'], 'DorothyMurchison': ['E9', 'E8'], 'EvelynJefferson': ['E9', 'E8', 'E5', 'E4', 'E6', 'E1', 'E3', 'E2'], 'RuthDeSand': ['E5', 'E7', 'E9', 'E8'], 'HelenLloyd': ['E11', 'E7', 'E8'], 'OliviaCarleton': ['E11', 'E9'], 'EleanorNye': ['E5', 'E7', 'E6', 'E8'], 'KatherinaRogers': ['E13']}

另一种就是已线为节点,名字为成员的 初始Line搜索的图。

line = {'E10': ['SylviaAvondale', 'MyraLiddel', 'HelenLloyd', 'KatherinaRogers'], 'E12': ['HelenLloyd', 'KatherinaRogers', 'SylviaAvondale', 'MyraLiddel'], 'E14': ['SylviaAvondale', '75D}', 'KatherinaRogers'], 'E9': ['TheresaAnderson', 'PearlOglethorpe', 'KatherinaRogers', 'SylviaAvondale', 'MyraLiddel'], 'E8': ['TheresaAnderson', 'PearlOglethorpe', 'KatherinaRogers', 'SylviaAvondale', 'BrendaRogers', 'LauraMandeville', 'MyraLiddel'], 'E5': ['TheresaAnderson', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd'], 'E4': ['CharlotteMcDowd', 'TheresaAnderson', 'BrendaRogers'], 'E7': ['TheresaAnderson', 'SylviaAvondale', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd'], 'E6': ['TheresaAnderson', 'PearlOglethorpe', 'BrendaRogers', 'LauraMandeville'], 'E1': ['LauraMandeville', 'BrendaRogers'], 'E3': ['TheresaAnderson', 'BrendaRogers', 'LauraMandeville', 'CharlotteMcDowd', 'flag{'], 'E2': ['LauraMandeville', 'TheresaAnderson'], 'E13': ['SylviaAvondale']}

之后就很简单啦,首先我们line搜索出flag{的初始线E3。之后去friendship查找关系,更具line查找到Node名,然后加入queue防止重复搜索,然后继续遍历Node下的line依次反复,直到找到end。

代码


queue = []

def get_line(txt):
    for i in line:
        if txt in line[i]:
            return i
def dfs(txt,target,vector):
    for i in friendship:
        if txt in friendship[i]:
            queue.insert(0,(i,txt))
            new = vector + i
            for j in friendship[i]:
                if j == target:
                    print(new+"75D}")
                    return
                if (i,j) not in queue:
                    new = new + j
                    
                    dfs(j,target,new)
    queue.pop()
dfs(get_line("flag{"), '75D}',"")

结果

TIM截图20190410133022.jpg

从结果列表中找到最短的,然后加上flag。

最后得出flag就是

flag{E3EvelynJeffersonE9FloraPrice75D}

Tags: none
文章总数:127篇 分类总数:3个