栈溢出-warmup_csaw_2016

 

 打开IDA观察,存在gets函数。并且有提示sub_40060D这个函数。

 

 观察这个函数,可以发现,是查看flag的。到这里就能够确定思路了,利用gets函数修改返回地址到sub_40060D读取flag就可以了。

在这里可以看到,gets函数是用的v5指针,它的地址是rbp-40h.又因为是64位程序,所以需要再覆盖掉8个字节(返回地址前的那个栈帧),所以想要覆盖掉返回地址,需要40h+8h个字节的填充数据。

 

 然后执行动态调试,验证一下IDA中显示的是否正确,在这里没法用 b main来设置断点,因此用地址形式下断点。

 

当程序执行完gets返回后,暂停观察。可以发现这里的gets返回调用函数后,并没有对栈进行操作,那么这个gets应该就不是cdcall,这样的话,现在的栈就是main函数的栈了。 

 

 在这里我输入的是一串0. 可以发现,输入的数据存放在了0xde70的地方,而栈底EBP在0xde30的地方。正好是40h。与IDA中显示的一致。

1 from pwn import *
2 io=remote('node3.buuoj.cn',27451)
3 #io=process('./warmup')
4 payload=b'A'*72+p64(0x40060D)
5 print(io.recv())
6 io.sendline(payload)
7 print(io.recvline())

但是这里如果用本地文件打开的方式,会在第7行出现读取文件错误,原因不知。

 

 然后我在BUUCTF网站上找到了相同的题目,就成功了。

posted @ 2020-12-04 10:13  大金刚仔  阅读(117)  评论(0编辑  收藏  举报