LCTF2018-pwn4fun-详细解析

 

LCTF-pwn4fun-详细解析

LCTF真的有一点劝退的意思。。。膜一波出题人,当时自己没有做出来,和大佬交流了一下思路之后会了。感觉题目是很新奇的,因为有点像是现实环境中逻辑漏洞利用。

 

程序分析

题目的代码很多这里列出一些主要的

运行图

main


我这里标出了一些函数的大概名字,这里说一些简单的函数首先admin是把字符串admin先放在一个地址里,然后接下来name函数就是输入自己的名字,就如上面运行图片展示的,然后开始游戏

dont_know


这个函数刚开始标为dont_know是因为我开始看的时候并不知道是什么意思。。然后就继续看了下面,现在我们来看看这个函数,首先我这里将一个变量命名为了file_neme因为我发现它把值赋给了file,然后后面有一个openfile的操作,感觉这里有些不对劲,可能可以有些打开flag文件的操作,因为有一个congratulate的字符串在这里,但是这里并没有被怎么调用

输入比较函数


这里会有一个比较让我们输入不能等于admin

menu


这里有4个操作数,首先是do something,然后是do something again,然后是do something else,然后是do nothing,这里do nothing会执行一个退出的操作.接下里具体讲讲其他选项

choose 1 & do something


可以发现它对一个byte类型数进行了一个赋值,这里原来是一个数字,但是我发现这个是在可见字符的范围里所以我直接r了一下,进行了一个转换。看看这个地方并没有什么bug额。

choose 2 & do something again


这里和第一个操作时差不多的,所以就不多解释了,也是对那个位置进行一个赋值,先记住这个字符串以为之后可能会用到。接下里的3就不进行分析了,是差不多的函数,无非就是blood不相同

最后一个函数


这里有一个很明显的格式化字符串漏洞,但是我怎么也做不到成功的赢,在上面blood循环之中,这个游戏类似于卡牌游戏一样,可以进攻然后可以放弃此轮回合,也可以吃了对方的牌,当然对于题目本身来说肯定是会有丢弃卡牌的环节,这里就是一个可以利用的地方了

溢出点在丢牌处


这里在第二次丢牌的时候没有检查下表所以可以直接进行一个数组越界的覆盖

 

动态调试

这个地方是我用ida动态调试的时候发现的,在admin的情况下会进行一个open file的操作,可是open出来的是一个。。。

这里可以发现是一个假的flag。。。太服气了这一点了,所以我们还是要继续寻找。继续寻找的过程中可以发现在丢牌的时候有一个下表溢出会让我们可以覆盖到flag那个地方,这也就用到了

这个地方可以进行一个下表越界-5对4进行一个a覆盖

思路分析

进入第二个选项的丢牌然后让下标进行一个溢出,溢出-5,进行一个flag的布置然后就可以读取flag了,当让这里的admin需要加上‘’将9个字符串填满

EXP

 from pwn import *
 p=process('sgs.dms')
 def get(x):
     p.recvuntil(str(x))
 def put(x):
     p.sendline(str(x))
 p=remote('212.64.75.161', 2333)
 get(name)
 put('n')
 get(?)
 put(U)
 get(name)
 put(Hadreys)
 p.sendline('2')
 #这里就开始自己手打游戏了,首先进入第二次弃牌阶段然后,然后输入-5使的file_name被我们覆盖,这里要
 #进行6次成功覆盖后,就可以执行下面的脚本按ctrl + c就可以了。
 p.interactive()
 put('admin'.ljust(9.'')) #远程端可以通。。本地不太行额
 p.interactive()

ps:这里请教了一下lm0963,膜一波,一个人拿了两个pwn-fd

 

总结

这几次的比赛在pwn上会有很多的新题,其中最大的感受就是对pwn手的逆向要求更高的了,就比如湖湘杯的pwn1,代码量也很大,而还有这个lctf的这道题目需要先知道程序的功能才能pwn。还有之前出现过的vmpwn。。。

(完)