首页
社区
课程
招聘
1
[原创]【2019看雪CTF】Q2赛季 第四题 达芬奇密码 WP
发表于: 2019-7-2 00:12 5901

[原创]【2019看雪CTF】Q2赛季 第四题 达芬奇密码 WP

2019-7-2 00:12
5901

此题是窗体程序,可通过字符串直接定位到按钮响应函数sub_401EA0
流程比较简单,先检查输入是16字节且不为0,然后进入主校验函数sub_4010E0进行校验,返回1则打印成功信息。

主校验函数sub_4010E0在执行前被函数sub_5647B8覆写,大小为816字节,而sub_5647B8则在窗体初始化时在OnInitDialog函数中进行了改写,具体操作是与0xAB异或。

真正的主校验函数看起来代码有点多,就不贴了,实际上就表示了一个式子,具体过程为:

计算好久没出结果,最后拿出mathematica:

X,Y的hex值为5aa5e1b9b3f35705de38bdb288090502,与常量异或后得到原始输入:

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
v1 = this;
 v7 = this;
 String[0] = 0;
 memset(&String[1], 0, 0x1FEu);
 v5[0] = 0;
 memset(&v5[1], 0, 0xFFu);
 CWnd::GetDlgItemTextW(v1, 1000, String, 20);
 if ( wcslen(String) == 16 )
 {
   v2 = 0;
   while ( !(String[v2] & 0xFF00) )
   {
     v5[v2] = String[v2];
     if ( ++v2 >= 16 )
     {
       v6 = 64;
       flOldProtect = 0;
       VirtualProtect(sub_4010E0, 0xD17u, 0x40u, &flOldProtect);
       if ( GetLastError() )
         return CWnd::MessageBoxW(v1, L"Wrong!", 0, 0);
       qmemcpy(sub_4010E0, sub_5647B8, 0x330u);
       VirtualProtect(sub_4010E0, 0xD17u, flOldProtect, &v6);
       if ( !GetLastError() )
       {
         v8 = 0;
         v8 = sub_4010E0();
         if ( v8 == 1 )
           return CWnd::MessageBoxW(v7, L"Congratulations! You are right!", 0, 0);
       }
       v1 = v7;
       return CWnd::MessageBoxW(v1, L"Wrong!", 0, 0);
     }
   }
 }
 return CWnd::MessageBoxW(v1, L"Wrong!", 0, 0);
1
2
3
4
5
6
7
8
v1 = this;
CDialog::OnInitDialog(this);
SendMessageW(*((HWND *)v1 + 8), 0x80u, 1u, *((_DWORD *)v1 + 29));
SendMessageW(*((HWND *)v1 + 8), 0x80u, 0, *((_DWORD *)v1 + 29));
v2 = 0;
do
  *((_BYTE *)sub_5647B8 + v2++) ^= 0xABu;
while ( v2 < 0x330 );

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-1-24 05:24
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册