April 27, 2022

DASCTF2022 X FATE-Crackme

考点

  1. 反调试(sharpOD当我没说)
  2. wincrypt加密库

0x00 日常查壳

32位的无壳MFC题

image-20220427203125597

0x01 分析主函数

拉进IDA,让IDA跑一会(注意IDA左下角),通过shift + F12找字符串可以找到Success,Crtl + X交叉引用到主函数

image-20220427204537822

不经想起Buu上的CrackRTF,好像还是我写的第一篇Re文章

通过官方的文档可以知道不同数字对应不同加密,比如这个MD5加密

image-20220427204742290

0x02 GetData

那么直接动调拿取数据!

找到我们的目标方法一个方法是算偏移地址(方法很多不一一举例)

首先得知我们目标函数的在IDA的起始地址是4031E0,拉到最上面知道IDA基地址是401000

4031E0 - 401000 = 21E0得到函数的偏移地址

image-20220427205328722

我OD里的程序领空的起始地址是8E1000

image-20220427205551148

相加可得 8E1000 + 21E0 = 8E 31E0,即得主函数地址,下断点开跑

image-20220427205714600

可以通过IDA的压栈地址,在OD里找到我们的数据(中间注意input是32位key是8位别跳飞)

image-20220427205918766

反调试 ZwSetInformationThread

所以为什么没在IDA提,因为还要过个这个,打比赛时间比较少就没什么时间找到底IDA哪里出问题了

当然赛后复现要认真看每一处考点,看一位师傅的博客得知是这个反调试(通过反复调试各位自己也可以找到

但我在IDA的导入函数一直没找到,不过通过字符串搜索找到了,完成是作者自写调用的反调试

那么过他的方法直接patch掉或者该值都可以,可以参考这篇文章

随后即可在IDA调试!

image-20220427210814671

0x03 GetFlag

那么现在问题就是HashAES那个函数了

通过查阅这篇文章可以知道这是生成了AES加密,并且我们的密钥就是我们的key经过了MD5

一个比较好的方法就是模拟HASH值直接Decrypt

image-20220427211307374

把CryptEncrypt改成CryptDecrypt,注意一下数据的类型即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <windows.h>
#include <windef.h>
#include <wincrypt.h>
#include <stdio.h>

int main(void)
{
BOOL v6; // [esp+4h] [ebp-18h]
HCRYPTKEY phKey; // [esp+Ch] [ebp-10h] BYREF
HCRYPTPROV phProv; // [esp+10h] [ebp-Ch] BYREF
HCRYPTHASH phHash; // [esp+14h] [ebp-8h] BYREF

phProv = 0;
phHash = 0;
phKey = 0;

BYTE key[] = { 0x5c, 0x53, 0xa4, 0xa4, 0x1d, 0x52, 0x43, 0x7a, 0x9f, 0xa1, 0xe9, 0xc2, 0x6c, 0xa5, 0x90, 0x90 };
BYTE input[] = { 0x5B, 0x9C, 0xEE, 0xB2, 0x3B, 0xB7, 0xD7, 0x34, 0xF3, 0x1B, 0x75, 0x14, 0xC6, 0xB2, 0x1F, 0xE8, 0xDE, 0x33, 0x44, 0x74, 0x75, 0x1B, 0x47, 0x6A, 0xD4, 0x37, 0x51, 0x88, 0xFC, 0x67, 0xE6, 0x60, 0xDA, 0x0D, 0x58, 0x07, 0x81, 0x43, 0x53, 0xEA, 0x7B, 0x52, 0x85, 0x6C, 0x86, 0x65, 0xAF, 0xB4 };
DWORD keyLen = 0x10;
DWORD inputLen = 0x20;
DWORD * t = &inputLen;

v6 = CryptAcquireContextA(&phProv, 0, 0, 0x18u, 0xF0000000);
if (v6)
{
v6 = CryptCreateHash(phProv, 0x8003u, 0, 0, &phHash);
if (v6)
{
v6 = CryptHashData(phHash, key, keyLen, 0);
if (v6)
{
v6 = CryptDeriveKey(phProv, 0x660Eu, phHash, 1u, &phKey);
if (v6)
v6 = CryptDecrypt(phKey, 0, 1, 0, input, t);
printf("%s", input);
}
}
}
if (phKey)
CryptDestroyKey(phKey);
if (phHash)
CryptDestroyHash(phHash);
if (phProv)
CryptReleaseContext(phProv, 0);

return 0;
}

GetFlag!

image-20220427211502174

(emmm,在想DAS的题要不要录下)

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

This post is written by P.Z, licensed under CC BY-NC 4.0.