[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)权限。因此,7111 代表这个内存区域将被设置为可读、可写、可执行。

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

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

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

 

 

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)

 

posted @ 2023-12-27 02:11  wakappxc  阅读(29)  评论(0编辑  收藏  举报