pwn — ret2syscall
2019-04-01 本文已影响217人
YeeZi_
ret2syscall
再来check一下保护,发现开了NX
![](https://img.haomeiwen.com/i16737923/4a330e2d03369eca.png)
这次我先看一下应该填充的字符串长度为多少,爆出来发现是112
![](https://img.haomeiwen.com/i16737923/cec40d51481199e8.png)
然后在Ida里看main
![](https://img.haomeiwen.com/i16737923/cf3fb36f09a79deb.png)
发现这是个no system又no shellcode 的题,然后又开了NX,不能用直接调用shell,也不能自己往栈里填一段代码获得shell,那就只能考虑用系统调用了(貌似是这么一个格式execve(‘/bin/sh’,NULL,NULL))
分别把参数存进相应的寄存器里面:
Eax:存系统调用号的(然后查到execve的系统调用号是0xb)
Ebx:存函数的第一个参数(这里是’/bin/sh’)
Ecx、edx:分别存剩下两个NULL
所以我们就要找这些寄存器的地址,这里就会用到gadget这个小工具
ROPgadget --binary rop(文件名) --only ‘pop|ret’ | grep ‘eax’(查找语句里有pop、ret、eax的)
![](https://img.haomeiwen.com/i16737923/11e9df0b0376e8e3.png)
然后发现有几个地址可以用,那就随便选第二个啦,地址:0x080bb196
接下来继续找ebx的
![](https://img.haomeiwen.com/i16737923/e0dc42ac008b29a2.png)
然后找到三个寄存器(ebx、ecx、edx),地址为:0x0806eb90
接着找,int 0x80,这是一个系统调用的中断号(有这个才能用系统调用)
![](https://img.haomeiwen.com/i16737923/78fb8c36ab859a20.png)
地址为:0x08049421
然后我们再看看有没有/bin/sh这种东西
![](https://img.haomeiwen.com/i16737923/9e51ced8779dcef8.png)
然后找到了它的地址:0x080be408
最后就开始考虑脚本了
![](https://img.haomeiwen.com/i16737923/7f3b5d23fc8ef45d.png)
运行exp,就发现OK了啊
![](https://img.haomeiwen.com/i16737923/a4c68681fa2a84d9.png)