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