题目信息:
这是一个赌博程序,快去赚钱吧!!!!!!!!!!!!!!!!!!!!!!!!!!!(在编辑框中的输入值,即为flag,提交即可)
无壳无花,IDA 可以直接看到具体过程
关键函数就是这个
(IDA静态分析出来的直接看的话有点问题 需要结合动态调试具体情况)
BOOL __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4)
{
const char *v4; // esi
const char *v5; // edi
int v7; // [esp+8h] [ebp-20030h]
int v8; // [esp+Ch] [ebp-2002Ch]
int v9; // [esp+10h] [ebp-20028h]
int v10; // [esp+14h] [ebp-20024h]
int v11; // [esp+18h] [ebp-20020h]
int v12; // [esp+1Ch] [ebp-2001Ch]
int v13; // [esp+20h] [ebp-20018h]
int v14; // [esp+24h] [ebp-20014h]
int v15; // [esp+28h] [ebp-20010h]
int v16; // [esp+2Ch] [ebp-2000Ch]
int v17; // [esp+30h] [ebp-20008h]
CHAR String; // [esp+34h] [ebp-20004h]
char v19; // [esp+35h] [ebp-20003h]
char v20; // [esp+36h] [ebp-20002h]
char v21; // [esp+37h] [ebp-20001h]
char v22; // [esp+38h] [ebp-20000h]
char v23; // [esp+39h] [ebp-1FFFFh]
char v24; // [esp+3Ah] [ebp-1FFFEh]
char v25; // [esp+3Bh] [ebp-1FFFDh]
char v26; // [esp+10034h] [ebp-10004h]
char v27; // [esp+10035h] [ebp-10003h]
char v28; // [esp+10036h] [ebp-10002h]
if ( a2 == 0x110 )
return 1;
if ( a2 != 0x111 )
return 0;
if ( (_WORD)a3 == 0x3E9 )
{
memset(&String, 0, 0xFFFFu);
GetDlgItemTextA(hDlg, 1000, &String, 0xFFFF);
if ( strlen(&String) == 8 )
{
v7 = 0x5A;
v8 = 0x4A;
v9 = 0x53;
v10 = 0x45;
v11 = 0x43;
v12 = 0x61;
v13 = 0x4E;
v14 = 0x48;
v15 = 0x33;
v16 = 0x6E;
v17 = 0x67;
sub_11E10F0((int)&v7, 0, 10);
memset(&v26, 0, 0xFFFFu);
v26 = v23;
v28 = v25;
v27 = v24;
v4 = sub_11E1000((int)&v26, strlen(&v26));// 标准base64编码
memset(&v26, 0, 0xFFFFu);
v27 = v21;
v26 = v20;
v28 = v22;
v5 = sub_11E1000((int)&v26, strlen(&v26));
if ( String == v7 + 0x22 // 输入的第一位需要等于0x33 + 0x22 = 0x55 "U"
&& v19 == v11 // 第二位需要等于0x4a "J"
&& 4 * v20 - 0x8D == 3 * v9 // 第三位*4 - 0x8d = 0x45 *3 也就是说第三位等于(0xcf+0x8d)/4 "W"
&& v21 / 4 == 2 * (v14 / 9) // 第四位/4 = 2 * (0x5a / 9) "P"
&& !strcmp(v4, "ak1w") // 最后三位base64编码后等于ak1w
&& !strcmp( // 三四五位base64编码后等于V1Ax
v5,
"V1Ax") )
{ // UJWP1jMp
MessageBoxA(hDlg, "U g3t 1T!", "@_@", 0);
}
}
return 0;
}
if ( (_WORD)a3 != 1 && (_WORD)a3 != 2 )
return 0;
EndDialog(hDlg, (unsigned __int16)a3);
return 1;
}
OllyDbg动态调试 改两次ZF标志位 让程序成功走向GetDlgItemTextA
长度是8,第一次直接赋值12345678 可以得到具体运算过程
可以得到flag就是UJW1Mp 可以到OD中再次验证