buuctf 刮開有獎 wp

2021-10-22 18:51:33 字數 4314 閱讀 3034

是個exe檔案首先開啟看一下,只有乙個帶有刮開有獎的訊息框,沒有什麼線索然後老套路拉進exeinfo pe檢視是32位的檔案

}粗略的看一下我們可以知道我們要找的flag應該是string,長度為8;`

memset

(&string,0,

0xffffu);

getdlgitemtexta

(hdlg,

1000

,&string,

0xffff);

if(strlen

(&string)

==8

然後看第51行函式sub_4010f0在對v7~v17進行某種操作,進入sub_4010f0函式

int __cdecl sub_4010f0

(int a1,

int a2,

int a3)

if( i >= result )

break

; v5 =

4* i;

*(_dword *

)(a1 +

4* result)=*

(_dword *)(

4* i + a1);}

--result;

}while

( i < result );}

label_13:

*(_dword *

)(a1 +

4* result)

= v6;

sub_4010f0

(a1, a2, i -1)

; result = a3;

++i;

}return result;

}

一步步分析這個有點太複雜了,我們將其轉換成可執行c語言**執行一下,記得把*(_dword*) 刪掉,因為這是彙編的表示,然後將各種基址+偏移的表示也換成陣列的定址,如下

#include

#include

intsub_4010f0

(char

* a1,

int a2,

int a3)

if(i >= result)

break

; v5 = i;

a1[result]

= a1[i];}

--result;

}while

(i < result);}

label_13:

a1[result]

= v6;

sub_4010f0

(a1, a2, i -1)

; result = a3;

++i;

}return result;

}int

main

(void

)

執行後的結果為3cehjnszagn

這就是v7~v17執行後的所對應的字串

回到dialogfunc函式,通過觀察變數v7到v25定義時的位址(或者雙擊變數名),我們知道它們在位址中是相鄰的`

);那麼可以理解,dialogfunc函式中,是把經過sub_4010f0處理後的字串的倒數第3位到倒數第1位的值賦給v4,sub_401000是將倒數第6~倒數第4位賦給v5。

接下來就進入sub_401000看看了

**如下

_byte *__cdecl sub_401000

(int a1,

signed

int a2)

while

( v10 <3)

; v11 = v9 <<8*

(3- v10)

; v12 =0;

v17 = v3;

v13 =18;

doelse

*v8++

= byte_407830[*(

(_byte *

)&v18 + v12)];

v13 -=6

;++v12;

v16 = v8;

}while

( v13 >-6

);v3 = v17;

if( v17 >= a2 )

break

; v7 = a2;

} v6 = v15;

} result = v6;

*v8 =0;

return result;

}

同樣是很複雜的**,但是往下拉看見乙個byte_407830,點進去看看,

再次回到dialogfunc通過觀察**if判斷語句判斷完了就彈出乙個messageboxa,這個 if 判斷應該很關鍵,先是 v7 + 34,算一下,得到 u ( 51+34),string[0]便是u,然後 v19 == v11,v19排在string[1],所以string[1]是j,下面的兩個strcmp應該是上面的base64加密後得到的結果與 ak1w 和 u1ax 對比.

if

( string == v7 +

34&& v19 == v11

&&4* v20 -

141==

3* v9

&& v21 /4==

2*(v14 /9)

&&!strcmp

(v4,

"ak1w")&&

!strcmp

(v5,

"v1ax"))

然後通過python指令碼解密ak1w和v1ax

import base64

str1 =

'ak1w'

str2 =

'v1ax'

flag1 = base64.b64decode(str1)

flag2 = base64.b64decode(str2)

print

(flag1)

print

(flag2)

得到 jmp和wp1

然後就是誰前誰後的問題了,看if判斷語句中的

&&

4* v20 -

141==

3* v9

&& v21 /4==

2*(v14 /

9)

應該是來驗證的,我們算一下第一條,v9是』e』為69,j是106,w是87,一通計算下來,v20是w,那麼就是wp1先.

再加上flag格式 即flag

BUUCTF 刮開有獎 WriteUp

用ida開啟,按f5反編譯,雙擊進入dialogfunc函式。如下 1 bool stdcall dialogfunc hwnd hdlg,uint a2,wparam a3,lparam a4 2 69 70return 0 71 72if word a3 1 word a3 2 73return...

BUUCTF REVERSE 刮開有獎

附件 步驟 例行檢查,無殼,32位程式 32位ida載入,shift f12檢索程式裡的字串,看到了乙個base64加密的特徵字串,猜想這題用到了base64加密 if a2 272 return 1 if a2 273 return 0 if word a3 1001 a3 1001 return...

BUUCTF RE 刮開有獎!!!!

這題一開始我以為是動調修改彈出框,我以為dialogbox刪掉之後會顯示出其他被擋住的彈窗 所以才說刮開有獎啊!結果把dialogbox搞掉之後仍然沒有彈出,甚至我都跳轉不到messagebox的地方。嗚 思路失敗,潤去看別人題解,發現居然是ida逆向qaq 一開始看見ida那麼多函式而且沒有mai...