BugkuCTF-Reverse题不好用的ce
解題
方法一
下載程序,運行一下:
點確定,有會彈出一個新的窗口:
點擊Command按鈕,左上角的數(shù)字就會增加,大概是要我們點擊一萬次:
PEiD查加殼:
并沒有加殼,是MFC編程的小軟件。所以我們用IDA打開,是沒法查看偽代碼的:
查看字符串也沒有找到有用的信息,只有一個標(biāo)題的From1:
直接用OD打開,動態(tài)調(diào)試:
MFC程序停在統(tǒng)一的外層入口處7770A9E0,直接Ctrl+G或者點擊斷點跳轉(zhuǎn)到我們內(nèi)層程序:
右鍵->查找->所有參考文本:
其實上面的DeZmqMUhRcP8NgJgzLPdXa就是加密后的flag,有人直接就知道它是flag了,但我開始沒注意到,我是看到之前按我們運行程序的時候看到的字符串“點擊一萬次有flag”,點擊它查看一下:
單步調(diào)試,發(fā)現(xiàn)程序調(diào)用了msvbvm60.rtcMsgBox(調(diào)用一個消息框):
運行了這行匯編之后就會顯示這個框:
點擊確定之后,就到了這一行代碼:
再往下就是返回msvbvm60.66051D33的程序領(lǐng)空:
返回到msvbvm60.66051D33里調(diào)用工程4模塊的函數(shù):
之后就是在msvbvm60模塊里逐層的返回、交叉調(diào)用:
最終再回到最里層的函數(shù):
它再調(diào)用工程4模塊的函數(shù):
這個函數(shù)再跳轉(zhuǎn)到比較點擊次數(shù)最終輸出函數(shù),00401880:jmp 工程4.00401C80:
往下到00401E21:test ah,0x40; 判斷點擊的次數(shù),決定跳轉(zhuǎn)的方向,測試ah的第7位(0100 0000)是否為1。ah的第7位是1,則說明它已經(jīng)計數(shù)到了一萬次,則test的結(jié)果是1,ZF標(biāo)志位置0,不跳轉(zhuǎn),輸出flag;否則ah的第7位不是1,則說明它還沒有計數(shù)到了一萬次,則test的結(jié)果是0,ZF標(biāo)志位置1,跳轉(zhuǎn),不輸出flag。
00401E24:je short 工程4.00401E97; 跳轉(zhuǎn),不輸出flag。JE看零標(biāo)志位,zf = 1則JE跳轉(zhuǎn),ZF = 0則JE不跳
所以我們只要在這修改標(biāo)志位ZF、修改0x40的大小或者修改JE等多類方法阻止程序的跳轉(zhuǎn),讓它正常輸出flag即可:
我們直接把ZF標(biāo)志位修改成0,讓程序不跳轉(zhuǎn)輸出flag:
DeZmqMUhRcP8NgJgzLPdXa明顯是加密后的flag,為Base58
Base58在線解碼的網(wǎng)站:http://www.metools.info/code/c74.html:
得到flag:flag{c1icktimes}
方法二:
這道題其實挺簡單的,首先運行程序,搜一下字符串:
定位到“ghjljzlkaslkkndnl”這里,為什么不定位到“點擊一萬次有flag”呢,因為他是程序一開始的消息框,后面觸發(fā)的按鈕事件才是主程序。
接下來我們只能一個一個試了,在主程序里的各個跳轉(zhuǎn)都下斷,然后運行一下程序,看看那個跳轉(zhuǎn)了,哪一個就是關(guān)鍵跳咯:
最后我們定位到了這個je,把它改為jnz,成功彈窗:
這里需要注意以下一下,這一串字符串是base58加密的
成功拿到flag:flag{c1icktimes}
總結(jié)
以上是生活随笔為你收集整理的BugkuCTF-Reverse题不好用的ce的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React之回调函数形式的ref
- 下一篇: C语言 函数值传递和址传递 - C语言零