-
-
[原创]【2019看雪CTF】Q1赛季 第五题 青梅竹马 WP
-
发表于: 2019-3-23 20:55 3228
-
这是一个窗体程序,程序流程比较简洁,直接在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
。
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; }
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; }
ABCyVPGHTJKLMNOFQRSIUEWDYZgbc8sfah1jklmnopqret5v0xX9wi234u67dz+/
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); } }
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
他的文章
看原图
赞赏
雪币:
留言: