是個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...