XCTF 4th-WHCTF-2017 creakme


exe文件 運行一下

隨便輸一下

ps.這個曹操身邊的故事挺有意思的 但是沒啥卵用.......

查一下殼無殼

ida載入 發現找不到main函數 直接看start感覺邏輯亂亂的(萌新求不噴.....)

百度之,可能是MFC寫的,小白真的是純小白 一臉蒙蔽,第一次接觸MFC 看一下大神的題解照着復現了一遍 但是大佬中間有的地方講的不明白,可能是覺得太簡單不需要講了吧....我盡量寫的詳細一點

我們知道(其實並不知道MessageBoxA函數是於創建、顯示並操作一個消息對話框的,像這種題目基本上都是將用戶的輸入進行各種異或啊,調整順序啊之類的和正確密碼比對,正確就會提示你輸入正確或者干脆直接顯示出來flag之類的,所以如果我們能找到提示用戶輸入正確的對話框,再往上追溯調用就大概率找到判斷函數!找到之后分析里面的邏輯就可以反向算出flag。

於是在各個函數里面尋找,其中有兩個函數調用了MessageBoxA這個函數,分別是sub_4016E0和sub_401720,尋找一下他們的調用關系 發現都是sub_4015E0函數調用的,看一下它的邏輯:

可以看出來我們的判斷並沒有錯!肯定是if里面的判定條件決定了是否調用MessageBoxA輸出正確的提示,所以我們看一下sub_401630這個函數

我們直接看函數的主體部分 首先是一個srand生成隨機數,然后令v4=rand[0]%10 再將v2和v3對應的某一位數值進行比對

我們知道(其實並不知道)srand函數是隨機數發生器的初始化函數。srand和rand()配合使用產生偽隨機數序列。

什么意思呢,就是rand()函數是通過系統所給定的數字作為種子,生成一串隨機序列的函數,但是如果種子一樣rand()得到的序列也是不變的,而srand()是可以改變種子值的函數。

不過對於這道題的邏輯,由於初始以10作為種子,rand[0]為0x47(71);以1作為種子,rand[0]為0x29(41),模10后都令v4=1,所以產生的v4不會有變化,一直是1

解決了v4的問題,判斷的邏輯就很清楚了:a2的每一個值和v3+96的第n*10+1個值比對

往上找了一下

這里有一個strcpy函數,將內存中的一串字符串賦值到了v2+96上,繼續往下分析就會知道在這里的v2+96就是v3+96,所以現在已經很明白了,只要將這個字符串每隔十個取出來(直到取到320就結束)就是最后的flag啦!

s = ";f1K3{c5:efl21t4;1t1zaxpim9}5+?gtux;=vc9v{v7+buhU{bT=-am2q}=fh[xk{y?xrqe{?}l5-sd2-Mo+:j{9=sY[dalvpx?z3{?no{[k5ll{zjsu5[kfla+r6Zg72o0skq6cGl5cw[=d?3v9q5-vkjSv{4sqtg=f0cz{+jurjfl[tb]lrfF1;2}udhb?0g8{om:T4dh;z:oz-Dn=m=ux;o[gs9{+zqx+sq-dsxctcvykUs2oddrt43pwv:f0;njkrb9los6g0{ih?rqantfx$sslqd:rvqixr;j{?o:sn+[i[yA11;gsmr8lm0?3};+iv+Tf:4Gtv2:-20upi0]7?77=;qzx{m-W;0vtueh]ko8d?=w:fbhd{E:;19?p=k:b+}doht6wpEq-z]2qbV1}dh416qw9:xm[;ed;:ecb-0:ni-s4u2kf6]2wn45amzjrun=ofkx-=hmgo-lz;j909=rmo7xcj4le0hxs[i]-vjl[?o12:sv4upio7ma1hRy7556+57krev:hLQ+1cx65z5v5];6n=[p83;n={zm{k2p"
flag=''
for i in range(len(s)//10):
    flag+=s[i*10+1]
    if(i*10==320):
        break
print(flag)

最后得到:

flag{The-Y3ll0w-turb4ns-Upri$ing}

第一次提交不對,只提交{}里面的內容就好啦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM