首页
社区
课程
招聘
[原创]蒸米ROP level 5 - 通用gadget
发表于: 2024-6-4 10:44 19362

[原创]蒸米ROP level 5 - 通用gadget

2024-6-4 10:44
19362

1. 环境

ubuntu1~16.04.12
pwndbg
python

2.目标

学习通用gedget 构造

3. 流程

栈溢出函数, 漏洞函数

1
2
3
4
5
ssize_t vulnerable_function()
{
  char buf[128]; // [rsp+0h] [rbp-80h] BYREF
 
  return read(0, buf, 0x200uLL);

没有system函数需要去libc里找
图片描述

4.思路

可以使用write打印出内存write_got的内存地址,使用内存地址相减
write_got - libc.symbols['write'] = write的内存地址地址,然后使用read函数把libc的system地址写进bss段构造恶意栈空间控制程序执行流执行栈空间的system函数。
在程序中有一个__libc_csu_init函数是通用的gedget, 可以使用这个代码段来构造自己想要的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
400600:       4c 89 ea                mov    rdx,r13
400603:       4c 89 f6                mov    rsi,r14
400606:       44 89 ff                mov    edi,r15d
400609:       41 ff 14 dc             call   QWORD PTR [r12+rbx*8]
40060d:       48 83 c3 01             add    rbx,0x1
400611:       48 39 eb                cmp    rbx,rbp
400614:       75 ea                   jne    400600 <__libc_csu_init+0x40>
400616:       48 83 c4 08             add    rsp,0x8
40061a:       5b                      pop    rbx
40061b:       5d                      pop    rbp
40061c:       41 5c                   pop    r12
40061e:       41 5d                   pop    r13
400620:       41 5e                   pop    r14
400622:       41 5f                   pop    r15
400624:       c3                      ret 

可以操作寄存器的代码段是0x400616,其中rbx可以设置为0,剩下的寄存器都和
0x400600有关,rbx=控制0x400614的确保相等就不会往上跳转设置为1,r12=0x400609因为rbx是0只要r12存放的是函数的地址就会call过去,r13=0x400600会间接控制rdx,r14=0x400603间接控制rsi,, r15=0x400606间接控制edi
利用执行流程
0x400624->0x400600->(0x400624)再次跳转的位置


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回