May 24, 2022

DASCTF2022 X VOID-WER

0x00 日常查壳

无壳64位

image-20220524195301895

0x01 分析主函数?

想分析F8按烂掉,看WP说是ECC点加法…一开始认为着只是代码多了点,真正的逻辑不难,结果调麻了

直到现在才想起void师傅教我出题不要脑洞不要脑洞,所以题目名是就是这题的关键啊!

WER

那么如果简单看完这三篇文档可以理下逻辑

  1. 在初始化时注册ApplicationRecoveryCallback函数
  2. 在OnExit调用WerReportHang触发异常
  3. 之前注册的回调函数发挥作用,进行了真正的逻辑处理

问了Void师傅,OnExit函数就在main函数里,不过每次调用WerReportHang就会关闭调试器!!(所以为什么每次断不到

0x02 Real logic!

那么直接在import库里直接找,然后找调用即可

image-20220524201454269

同样也可以找到回调函数(以后没思路一定去搜搜回调函数!!)

image-20220524201623940

唯一的一个问题就是到底是哪调用的OnExit函数发生了异常?理清所有问题问问void师傅

那么真正的逻辑函数就在回调函数后的那个,有位师傅直接通过Messagebox函数找到这了,以后思路一定要打开!!

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
int sub_7FF6DA5FF3B0()
{
__int64 v0; // rdx
int result; // eax
CHAR Text[16]; // [rsp+20h] [rbp-30h] BYREF
int v3[8]; // [rsp+30h] [rbp-20h]
BOOL pbCancelled; // [rsp+68h] [rbp+18h] BYREF

v0 = 0i64;
v3[0] = 89457413;
pbCancelled = 0;
v3[1] = 1415448324;
v3[2] = 38799109;
v3[3] = 1348424451;
v3[4] = 89346131;
v3[5] = 1431568469;
v3[6] = 33882967;
v3[7] = 1397837906;
strcpy(Text, "Correct!");
while ( (*((unsigned __int8 *)v3 + v0) ^ *((char *)&xmmword_7FF6DA625C20 + v0)) == 102 )
{
if ( ++v0 >= 32 )
{
result = MessageBoxA(0i64, Text, 0i64, 0);
if ( pbCancelled )
return result;
ApplicationRecoveryInProgress(&pbCancelled);
if ( pbCancelled )
{
ApplicationRecoveryFinished(0);
return 0;
}
ApplicationRecoveryFinished(1);
return 0;
}
}
return 0;
}

0x03 GetFlag

简答的异或脚本,我也很异或呢

1
2
3
data = [  0x05, 0x03, 0x55, 0x05, 0x04, 0x07, 0x5E, 0x54, 0x05, 0x07, 0x50, 0x02, 0x03, 0x53, 0x5F, 0x50, 0x53, 0x50, 0x53, 0x05, 0x55, 0x00, 0x54, 0x55, 0x57, 0x03, 0x05, 0x02, 0x52, 0x50, 0x51, 0x53]
for i in range(len(data)):
print(chr(data[i] ^ 102), end = "")

GetFlag!

image-20220524201929112

DASCTF X SU
🍬
HFCTF2022
🍪

About this Post

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