forgot
打开题目checksec一下
是32位文件就放到32位的ida中反编译一下,看到经过一系列对v2数组的判断和v14的赋值,最后返回图中这一串指向的地址中的内容
刚好又发现了cat flag的字符串和system,所以这道题应该就是要覆盖掉这个地址,是它指向cat flag和system这个地址
再运行一下文件看看
发现有两个地方是可以输入的,看回到ida找到这两个地方很有可能就存在栈溢出漏洞,然后发现第一处的输入限制了输入32,并不能实现溢出,但是在第二输入时是没有限制长度的,所以这里就是栈溢出的点
v3和v2的距离也可以得到
现在就可以开始写payload的啦
payload1.0版本
运行了一下发现成功连接上了,但是flag并没有输出???所以又返回ida看看是什么原因,发现是因为前面本来以为没什么用的循环一直退出不了,所以才不能执行最后一步。这个循环是当v14=10的时候就会退出的,最开始给v14的初始值就是10,所以在循环中就不能让它有机会更改v14的值。查看各判断条件,
当输入给v2数组的溢出字符不满足这其中条件就不会更改v14的值,所以这里我选择了‘/’
payload2.0版
成功拿到flag
pwn100
checksec:
放进64位ida中反编译,看到有read函数和puts函数,但是没有\bin\sh和system
可以利用read函数进行栈溢出,可以看到可读入200个字符远大于0x40,从而可以泄露read的got表中的内容,把read的地址用puts函数打印出来,再把puts的返回地址设为main函数以此来再次利用栈溢出写入\bin\sh和system,因为是64位程序所以要先利用寄存器来传参,这里puts只有一个参数所以使用rdi就可以了
rdi的地址貌似一般都是在如图中pop的寄存器后而在retn前(貌似做过的题都是,还没找出什么原理,待挖掘…),但是也可以用命令行找一下edi的地址
得到rdi的地址为0x400763,然后就可以开始写payload的了,这里libc库的查找和system,/bin/sh的地址用wiki中推荐的LibcSea工具来辅助查找,这里贴上该工具的使用模板
pwn200
checkse一下
放进32位ida中反汇编,无system和\bin\sh,但发现write函数和read函数,其中read函数明显可以看到存在栈溢出,可以利用write来写入system和\bin\sh。
由于动态绑定机制,所以我们需要两次调用函数,第二次调用时write函数就是绑定的got表的真实地址,可以进行写入,实现则利用read函数的栈溢出漏洞,修改返回地址为main函数地址,下面开始构造payload,system和\bin\sh的地址同样利用LibcSearcher来查找
dice_game
其实这道题特别像新手区里的guess_num,所以也可以用两种方法来实现,前提还是要了解c语言中rand和srand伪随机数生成函数的机制(http://c.biancheng.net/view/2043.html)
放进ida中看一下代码逻辑
一眼看上去输入好像没有溢出点,继续往下看是要进行50次游戏,点开sub_A20()看看游戏的流程具体是什么
看到这就觉得特别眼熟了,就是要每次都猜中随机数(1-6)是哪个,这时就想起之前新手区做的guess_num,又有rand和srand函数,所以两种方法
首先,两种方法都要把seed控制成想要的值,否则按照时间戳来设置seed的话就猜不中了。可以看到刚刚开始输入name的时候,是将我们输入的放入buf中,可以输入0x50个,而buf离seed的地址只有0x40,所以输入0x40个数就可以成功到达seed的地址,然后就是后续的操作了
方法一
写一个c语言程序来生成这50个随机数
首先输入64个字符,我这里选的是0x30303030(0000),所以接着输入0000,然后将这50个数按顺序输入,得到flag
方法二
ldd查询文件动态链接库,这道题其实题目的压缩包中也有直接给出是哪个动态链接库
exp:
Mary_Morton
ida看一下代码逻辑,发现题目给了三种选择,分别对应两个函数
函数一(choice1):
函数二(choice2):
choice3:
结束程序
可以看出函数一中read函数有栈溢出漏洞,而函数二有格式化字符串漏洞,其实选项中也有提示。并且这里很明显有个canary,这两个函数的结尾都有return一个异或的表达式,而看汇编语言也很明显可以看出函数结尾都有一个让rax与fs:28h进行异或的操作
所以可以首先利用格式化字符串漏洞来得到canary的值,
可以看到buf的地址和v2的地址差了0x88而且还有6的偏移量,所以(0x88÷0x8)=0x11,0x11=17,17+6=23(64位8位为一个字节),知道了canary的值就可以利用choice1中的栈溢出漏洞来返回到system函数进行执行
exp: