buf
的空间大小为0x400,read()
的读入长度也为0x400。进入echo()
函数继续查找。
字符串s2
长度为0x10,内容从buf
进行拷贝,当遇到\x00
时特,停止拷贝。栈布局如下
size | data |
---|---|
0x10 | s2 |
0x08 | saved ebp |
0x08 | return address |
0x400 | buf |
构造如下payload
:
1 | payload = 'a' * 24 + return_addr |
由于字符串复制遇\x00
终止,因此最多只能传入一个地址。但由于返回地址之后就是我们所输入的buf
,所以需要利用buf
进行控制。buf
的前32字节为上述payload
,因此需要利用gadget从栈中移除32字节,使用pop四次返回即可,随后便进入预先设计好的控制流中。由于原先的返回地址非\x00
长度与pop4_addr
相同,因此可以成功写入。leak函数设计如下:
1 | def leak(addr): |
获取system
地址后:
1 | payload = 'a' * 24 + p64(pop4_addr) |
参考文章和bin下载:https://www.anquanke.com/post/id/85129