-
-
[原创]【2019看雪CTF】Q1赛季 第五题 青梅竹马 WP
-
发表于: 2019-3-23 20:55 3386
-
这是一个窗体程序,程序流程比较简洁,直接在WinMain
中通过DialogBoxParamA
设置对话框的事件处理函数DialogFunc
。
函数DialogFunc
伪代码如下:
按钮响应函数mainroutine_402652
主要流程如下:
程序中的信息解码及输入编解码校验用的是改了表的base64。所用表如下:
输入格式检查规则如下:
以下是输入的编解码及最终校验的调用代码:
输入先base64解码再编码后与原始输入比较,如正确则进入最终校验。最终校验返回2,则解码成功提示信息,最后弹窗显示。因为解码信息的函数第一个参数是解码字串的index,这些字串后解码后是这样的:
最终校验代码如下:
大致流程是:生成100以内的素数数组,输入debase后值转成大数记为m,0x4f(隐藏文本框中的值)以内的素数相乘记为大数n,然后求pow(m,0x53,n) == 2
。
明显的RSA,只不过n不是两个素数相乘,而是多素数相乘。求解是差不多的,(p-1)*(q-1)
换成各素乘数减1相乘即可。其它都是一样的。
再用上面的base64表做下base64编码,加上分隔符'V'就是答案了:PEDIyV9102dVreadyu
。
1 2 3 4 5 6 7 8 9 10 | int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { int v4; / / eax v4 = GetTickCount(); sub_403371(v4); ::hInstance = hInstance; DialogBoxParamA(hInstance, (LPCSTR) 0x65 , 0 , DialogFunc, 0 ); return 0 ; } |
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 | BOOL __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4) { switch ( a2 ) { case WM_CLOSE: goto LABEL_14; case WM_INITDIALOG: sub_402B3A(hDlg); return 0 ; case WM_COMMAND: switch ( (unsigned __int16)a3 ) { case 2u : goto LABEL_14; case 0x3EAu : mainroutine_402652(hDlg); return 0 ; case 0x3ECu : LABEL_14: EndDialog(hDlg, 0 ); break ; } break ; } return 0 ; } |
1 | ABCyVPGHTJKLMNOFQRSIUEWDYZgbc8sfah1jklmnopqret5v0xX9wi234u67dz + / |
1 2 3 4 5 6 7 8 9 10 11 12 | gen_402889( 80 , v10, 0x40u ); gen_base_re_table_402270(v10); v6 = debase_402297((unsigned __int8 * )v11, v13); enbase_40231E((unsigned __int8 * )v13, v9, v6); if ( v13[ 0 ] ) { if ( !memcmp(v9, v11, v17) ) { v7 = check_4024E1( 100 , v5, v13, v6); decode_info_402A90(( int )v7, Text); } } |
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
赞赏
雪币:
留言: