[GWCTF 2019]re3

1.分析

mprotect(&dword_400000, 0xF000uLL, 7);

在这段代码中,mprotect 是一个 Unix/Linux 系统调用,用于更改一个进程地址空间中某个区域的保护属性。

  • &dword_400000:这是要更改保护属性区域的起始地址。
  • 0xF000uLL:这指定了区域的大小,0xF000 是十六进制数,表示区域大小为 61440 字节(60 KB)。
  • 7:这是新的保护属性,7 是一个八进制数,对应的二进制为 111,它指定了区域的保护属性。在大多数 Unix/Linux 系统中,这三个二进制位分别代表了读(4)、写(2)、执行(1)权限。因此,7 或 111 代表这个内存区域将被设置为可读、可写、可执行。

总的来说,这个 mprotect 调用将地址 0x400000 开始的 60 KB 内存区域设置为可读、可写、可执行。这通常用于动态代码生成,如 JIT 编译器,或者更改加载到内存的数据的权限,以允许执行。

mprotect函数将dword_400000处的0xF000长度地址修改成了可读可写可执行,sub_402219()里的数据进行了异或处理。

我们直接数据异或回去 还原就好了

reasonml

import ida_bytes
addr=0x402219
for i in range(224):
    patch_byte(addr+i,ida_bytes.get_byte(addr+i)^0x99)

还原后按C 找到函数头P建立函数

 然后patch一下重新打开即可

 可以看到我们已经修改完毕

 base64码表两次MD5加密存入V1(判断MD5可以通过特征码或者是Findcrypt插件)

这里是AES加密

动调提取两次MD5加密的数据

 AES的数据

 然后进行解密就行

cyberchef也行

2.exp

from Crypto.Cipher import AES
from binascii import unhexlify

# AES key and ciphertext in hex format
key_hex = 'CB8D493521B47A4CC1AE7E62229266CE'
ciphertext_hex = 'BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B'

# Convert hex to bytes
key = unhexlify(key_hex)
ciphertext = unhexlify(ciphertext_hex)

# Create AES cipher instance
cipher = AES.new(key, AES.MODE_ECB)

# Decrypt the ciphertext
plaintext = cipher.decrypt(ciphertext)

# Since we don't know the padding, we print the plaintext as is
print(plaintext)
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值