-
-
[原创]蒸米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)再次跳转的位置
赞赏
他的文章
赞赏
雪币:
留言: