[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)