buuctf-re-刮开有奖

什么都别说,上来就是直接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

你可能感兴趣的:(buuctf-re-刮开有奖)