逆向之旅001_攻防世界game
- 寫在前面
- 攻防世界的第一題game
- 第一步:運行這個exe
- 使用IDA反編譯
- 總結
寫在前面
這是我的第一篇博客,從大二開始接觸網路安全的知識,現在已經大四了.回首過去,課外的實踐主要是在跟著導師做態勢感知的專案,從寫爬蟲到搭網站再到寫定位演算法再到去參加信安作品賽,,,,在這個程序中,我的正向開發能力確實提高了,但逆向作為網安人必不可少的能力,我之前沒有花時間鉆研過,目前掌握的關于逆向的基礎知識都是在課堂上學到的,例如堆疊溢位,堆溢位,UAF,pe檔案格式,代碼保護技術,匯編語言,編譯和反編譯原理等等等等,比較瑣碎,而且沒有去實踐過,總覺得缺點什么,
因此從現在開始,我決定做ctf里的逆向題目,利用動手實踐的程序來對已經學到的知識進行更深刻的理解,以及學習更多的知識,了解更多計算機底層的技術,我決定每做一個題后,就在csdn上記錄一下程序以及感想,總結,借此也督促我要持之以恒,
只要現在開始,都不算晚!希望我能堅持下去,一步一步的往前走,從入門到發現其中的樂趣,
同時也跟大家分享一下我的思路,歡迎大家與我交流,我們一起共同進步,我的郵箱是 18029261561@163.com
攻防世界的第一題game
攻防世界的逆向第一題:game
鏈接:(https://adworld.xctf.org.cn/task/answer?type=reverse&number=4&grade=0&id=5074&page=1)
第一步:運行這個exe

翻譯:玩游戲,n是燈的序列號,m是燈的狀態,如果第n個燈的m是1,它就亮,如果不是,它就滅,
起初所有的燈都關了,現在你可以輸入n來改變它的狀態,
但是你要注意一件事,如果你改變第N個燈的狀態,(N-1)th和(N+1)th的狀態也會改變,
當所有燈都亮起時,將出現flag,
現在,輸入n,n的值域是[1,8]
使用IDA反編譯
第一步找主函式,在函式名串列中使用crtl+f,輸入main,找到_main0_函式,然后fn+F5反編譯,查看反編譯的代碼,如下圖所示:



結合第一步中,這個程式說的“當所有燈都亮起時,將出現flag,”以及代碼中的第79行至88行,推斷出第88行的函式,應該就是會生成flag的函式,所以我把這個函式命名為gen_flag,然后分析這個函式,還是定位到這個函式后,用f5反編譯生成偽代碼,這個函式的代碼描述了一個生成flag的演算法,可以使用python腳本復現這個演算法然后得到flag,
但我有點不想算,于是我就換了個方法,可以看到_main0_函式的第77行,有個字串“CLS”,
然后我用od打開這個exe,然后右鍵,選擇超級字串參考->1ASCII,然后查找“CLS”,(使用的快捷鍵是ctrl+F),然后點擊這個字串,從而會定位到這個字串,如下圖所示:

cls所在代碼的后面緊跟了8個JNZ指令,JNZ指令是 結果不為零則轉移,正好對應了ida中_main0_函式的第79-86行:

我們的目的是想讓程式執行是生成flag的函式,所以我們要修改if里面的判斷條件,讓這個判斷條件特別容易實作,那么我們就可以很快得到flag了,因此我們將這個判斷條件改為:
if ( byte_532E28[0] == 1
&& byte_532E28[1] == 1
&& byte_532E28[2] == 1
&& byte_532E28[3] != 1
&& byte_532E28[4] != 1
&& byte_532E28[5] != 1
&& byte_532E28[6] != 1
&& byte_532E28[7] != 1 )
這樣的話,我們再玩這個游戲時,只要輸入2,就可以讓1,2,3號燈亮,4~8號燈不亮,就跟這個判斷條件對上了,然后程式就會執行后面的生成flag的代碼了,
怎么改呢? 原來的代碼中用的是JNZ,對應的是“==”,現在我們要反過來,JNZ反過來就是JZ,
JNZ是結果不為零則轉移,對應的機器碼為 0F85 或者 75
JZ是結果為零則轉移 ,對應的機器碼為0F84 或者 74
在這給個鏈接,是我從 吾愛破解論壇上找的,指令與其對應的機器碼的手冊:
提取碼是heii
所以接下來使用od修改后面5個JNZ指令,修改方法我大概說一下:
1.滑鼠指要修改的那一行代碼處,然后右鍵,然后選擇“復制到可執行檔案”->選擇,
2.會彈出來一個不同顏色的框,然后找到你要修改的代碼處,然后ctrl+E,
3.把5個JNZ指令改完后,滑鼠右鍵,選擇“保存檔案”,然后重新命個名字,于是就得到了一個修改后的exe檔案,
我們用ida打開這個修改后的檔案,反編譯一下看一看我們的修改成功了沒有,如下圖:我成功了

然后運行這個修改后的exe,然后輸入2,就得到flag了,如下圖所示:

ps:我主要是在想記錄做題時整體的思路,但是考慮到可能會有跟我一樣的小白會看到這篇文章,所以我也寫了一些具體的操作方法,
不過有些地方我寫的還是不清楚,所以有疑問的同學可以留言我,或者發郵件,我會盡快回復你,咱們一起進步,
如果你覺得這篇文章對你有用或者覺得還可以,那就幫我點個贊吧,謝謝啦!
總結
1.使用ida進行反編譯后,總是慣性的想搞清楚每一行代碼,于是看了每一個函式,這樣效率太低了,所以我覺得正確的做法是先看主函式,搞清楚程式的整個實作框架和流程,先從全域去把握這個程式,然后結合我們對這個程式的了解,來分析出對我們最重要的代碼,然后再詳細的對這一步分代碼進行分析,
2.這是我的第一個逆向題目,要堅持下去,持之以恒,別忘了一萬小時定律!!! 堅信只要堅持下去,就會有好的結果,
3.要用心去找去體會其中的樂趣! 樂趣可以幫助我堅持下去!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/240463.html
標籤:其他
