什么都别说,上来就是直接ida(如果函数不对就是有壳)
很快乐,没有壳
直接在winMain上F5, DialogBoxParamA(hInstance, (LPCSTR)0x67, 0, DialogFunc, 0);
众所周知,对话框的处理函数是自己传进去的也就是 DialogFunc
点进去
找到了{
MessageBoxA(hDlg, "U g3t 1T!", "@_@", 0);
}
大概这里就是获得了正确的flag
然后上面一个好长的if
获得v5 == VlAx
v4 == ak1w
v21 /4 == 2*(v14/9)
4*v20 -141 == 3*v9
v19 == v11
string == v7+34
所以flag应该是string开始到v25
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]
明显26,27,28不是
然后再往上看v5 = sub_401000((int)&v26, strlen(&v26));
跟进去有个v2=a2/3 if(a2%3>0) ++v2 特别像base64(不知道的话自己百度,base64就是把3*8变成 4*(2+6))
然后直接base64解码
v27 = v21;
v26 = v20;
v28 = v22;
然后获得了v20,21,22
同理获得23,24,25
再往上sub_4010F0((int)&v7, 0, 10);
也就是把v7到v17字符串处理一下
直接把这个函数放在编译器里执行,得到新的字符串
3 C E H J N
v7 v8 v9 v10 v11 v12
S Z a g n
v13 v14 v15 v16 v17
可以求出string(v18) 到v21
v20和v21大概是让你验算的
从而得到答案UJWP1jMp