-
-
[原创]【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 ); |
赞赏
他的文章
赞赏
雪币:
留言: