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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章