Bugku-CTF逆向篇之游戲過關


游戲過關

 
 
 
 
本題要點:IDA使用 、OD使用、修改程序代碼並保存
 
 
 
-------------------------------
玩一個游戲
 
n是燈的序列號,m是燈的狀態
 
如果第n盞燈的m是1,它是亮的,如果不是,它是滅的
 
起初所有的燈都是關着的
 
現在你可以輸入n來改變它的狀態
 
但是你要注意一件事,如果你改變第N盞燈的狀態,第(N-1)和第(N+1)的狀態也會改變
 
當所有的燈都亮時,就會出現flag
 
現在,輸入n
-------------------------------
 
 
 
 
 
筆者打算先隨便輸一些數字玩一玩.....
 
直接按照從小到大順序試一下吧...........12345678..........結果.........
 
flag就出來了........
 
  zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t} 
 
但是老實講,很多逆向題目不會這么容易得到flag
 
我們本着學習技術的態度,還是老老實實用  IDA和OD 分析分析吧~
 
 
 

一、查殼

 
第一步當然是先查殼啦~
 
查殼 ,無殼。
我們發現是   Visual C++ 編寫的。
 
 
 
 

二、IDA靜態分析

 
 
既然沒有殼,那我們下面就用IDA來靜態分析一下:
 
先用IDA里的搜索功能,搜索一下flag這樣的關鍵字~
 
 
 
 
 
 
我們雙擊點擊  .text:0045F4E1或者.text:0045E968 ,都會定位到圖下這一塊位置。
 
我們觀察一下,  .text:0045F940 應該是核心代碼運算判斷的部分。
 
 
 
繼續往下翻一翻,我們看到了程序運行顯示字符串的那段代碼:
 
 
我們可以轉化成 c語言代碼,更加容易理解一些。
 
(筆者用IDA 64位的F5反匯編不了c語言,不知道是不是版本的問題,用32位的就可以使用F5的反匯編功能qwq)
 
反匯編成c語言之后,我們看到了判斷燈亮的語句。
 
 
 
往下再翻一翻,我們看到了最后面的運算:
 
關鍵函數的主要邏輯就是上面說的游戲規則的實現。
 
看一下輸出flag的函數:就是將兩個已經初始化的數組求與之后,再按位和  0x13 求與之后,轉化成字符串輸出即可~
 
 
 
 
借用一位大佬的py3代碼:
 
(大佬的文章在參考資料里面,有需要的小伙伴可以參考~)
 
# py 3
# coding:utf-8
 
 
array1 = [18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16,0]
#第一個數組
 
 
array2 = [123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126,0]
#第二個數組
 
 
flag = ''
for i in range(len(array1)):
    flag+= chr(array1[i] ^ array2[i] ^ 0x13 )
    #兩個數組求與,然后每一位與0x13求與
    
print (flag)
 

 

 
 
 

三、OD動態調試

 
當然,我們也可以利用OD進行動態調試~
 
首先我們可以通過  中文搜索引擎=》智能搜索 
 
搜索flag
 
 
 
 
 
雙擊點擊進入
 
 
 
我們發現跳轉來自  00427AB4 ,因此我們往上轉到00427AB4
 
 
 
 
  0042E940=ConsoleA.0042E940  表明了它指向了輸出flag的函數;
 
  本地調用來自 0042F66C :說明它是由0042F66C調用的,所以我們再往回轉到 0042F66C:
 
 
 
 
 
 
我們可以在開頭下一個斷點,運行之后,單步運行幾次,就會發現:
 
一旦只要由一個判斷不滿足,程序就跳轉到輸出flag的函數的下一條去了,這樣就不會輸出flag而重新開始循環要求你輸出n了
 
 
所以我們要修改源代碼使得程序不管怎樣都會進入輸出flag的函數,這樣我們只要運行程序就能得到flag了。
 
 
 
 
 
 
 
修改完就是這個樣子啦~
 
 
保存文件
(沒有直接保存的選項,所以需要右鍵  復制到可執行文件=》選擇  )
 
 
 
 
選擇路徑保存。
 
運行我們修改之后的程序~
 
 
回車,我們就看到答案啦~
 
 
 
   zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t} 
 
 
 
 

參考資料

 
https://blog.csdn.net/Onlyone_1314/article/details/89414568
https://blog.csdn.net/weixin_42528089/article/details/85114846
 
 


免責聲明!

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



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