[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()里的数据进行了异或处理。
我们直接数据异或回去 还原就好了

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)

浙公网安备 33010602011771号