GWCTF-2019-re3
萧禾财 Lv4

看题目

PE查壳

image-20220718181121475

无壳64位的linux程序

用IDA打开

找到main函数

image-20220718181449490

接受一个 32位的 字符串

存在一个mprotect 函数 紧接着一个大循环 猜测是加密后解密

image-20220718182140500

查看汇编窗口 果然如此

image-20220718182242789

因为是Linux程序 本人暂时不知道如何利用动态调试去“去除“这个函数的”壳“

去壳

只能利用IDC脚本静态”去壳“

image-20220718183316472

shift + F2 就可以调出脚本编辑器 输入脚本后点击Run 即可

1
2
3
4
5
6
7
8
9
10
11
12
#include <idc.idc>

static main()
{
auto addr = 0x402219;
auto i = 0;
for(i=0;i<224;i++)
{
PatchByte(addr+i,Byte(addr+i)^0x99);
}
}

image-20220718183609445

image-20220718184427550

image-20220718184753270

仔细观看这些函数 都是一些比较复杂的 用findcrypt 插件(需要自行下载)

image-20220718185328869

sub_40207B函数

image-20220718185440691

其中sub_401CF9是MD5加密函数

a1是函数导入的参数 我们盯着 a1看

a1只和V2产生联系

image-20220719091558704

按理说:只要将base64的码表 MD5加密俩次就可以获得 a1的值了 但是事实并非如此 其中的原因 本人暂时还不知 只能利用动调得到unk_603170

image-20220719093553883

1
CB8D493521B47A4CC1AE7E62229266CE

sub_40221A函数

由findcrypt插件可知此函数中存在AES加密

image-20220719093830523

byte_6030A0中存放的就是A1最后AES加密出的密文

1
BC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B

其中unk_603170就是我们AES中的密钥

写脚本

1
2
3
4
5
6
7
8
from Crypto.Cipher import AES
from Crypto.Util.number import *

password = long_to_bytes(0xCB8D493521B47A4CC1AE7E62229266CE)
aes = AES.new(password,mode=AES.MODE_ECB)
en_text = long_to_bytes(0xBC0AADC0147C5ECCE0B140BC9C51D52B46B2B9434DE5324BAD7FB4B39CDB4B5B)
den_text = aes.decrypt(en_text)
print((den_text))

flag{924a9ab2163d390410d0a1f670}

  • 本文标题:GWCTF-2019-re3
  • 本文作者:萧禾财
  • 创建时间:2022-07-18 18:02:08
  • 本文链接:https://ipartmentxhc.github.io/2022/07/18/GWCTF-2019-re3/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!