ret2syscall
再来check一下保护,发现开了NX
这次我先看一下应该填充的字符串长度为多少,爆出来发现是112
然后在Ida里看main
发现这是个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的)
然后发现有几个地址可以用,那就随便选第二个啦,地址:0x080bb196
接下来继续找ebx的
然后找到三个寄存器(ebx、ecx、edx),地址为:0x0806eb90
接着找,int 0x80,这是一个系统调用的中断号(有这个才能用系统调用)
地址为:0x08049421
然后我们再看看有没有/bin/sh这种东西
然后找到了它的地址:0x080be408
最后就开始考虑脚本了
运行exp,就发现OK了啊