今天给学弟演示最简单的pwn题的时候居然翻车了,没想到还是这个xmm寄存器的问题,我tcl,记录一下。
原来的exp是这样。
就是很简单的调用这个callsystem
结果本地打不通。试了下远程,发现能打通,太奇怪了。
1 | from pwn import* |
通过gdb调试发现,跳到这里就断了。
我本地调试系统是ubuntu 18,在bin群里问了问,组长肥猫嘤嘤告诉我是xmm寄存器的问题,当glibc版本大于2.27的时候,系统调用system(“/bin/sh”)之前有个xmm寄存器使用。要确保rsp是与16对齐的,也就是末尾必须是0.

由于xmm寄存器是128bit又用了movaps指令,故必须让rsp的地址能够整除16,解决方法就是少push一个寄存器。
让指令跳转到400597,本地exp如下:
1 | from pwn import* |
使用cat /proc/version发现我的本地调试环境是ubuntu 18而jarvis oj本地的环境也是ubuntu18 那么为什么会不同呢,就是glibc版本的问题,使用
1 | ldd --version |
查看发现我的glibc版本是
1 | ldd (Ubuntu GLIBC 2.27-3ubuntu1.2) 2.27 |
jarvisOJ的版本是:
1 | ldd (Ubuntu EGLIBC 2.19-0ubuntu6.15) 2.19 |
看来就是libc的问题,与系统版本无关。
说些什么吧!