[撰文 Leaf]
感謝ISDA協會裡的樂大,除了AIS3課程教導的解題辦法之外,我們討論出了另外一種解法,藉此機會來跟大家介紹逆向工程實際操作。
題目
題目是這樣的,一打開是這樣一個視窗,開啟的過程中做了什麼事我不曉得,在畫面上點一下,跑出了Please don’t click me!,如果之後再點一下整個視窗就會關閉。
看到I’ve printed out the flag這段,我有幾個想法:
1.是在開玩笑嗎?看不到半點東西!
2.可能是字串print出來了,只是被顏色擋住了。
想法就是分析的開始,如果是這種可能,那搜尋binary的字串應該就有解了,當然事實上沒這麼簡單,在字串堆中找不到半點可能性。
那接下來要做什麼事呢?如果只是單看執行畫面,是一輩子也看不出來的,那只能透過反組譯來分析程式的執行流程及可疑的地方,這也是逆向的目標所在。
發現一個可疑的東西:_print_flag的函式,點擊IDA-View中左邊函式視窗中的_print_flag。
如果看不懂組語沒關係,轉成C語言來看吧。
當然這功能也不是神器,逆向分析可不是只是看個C語言就能解出東西來的,要能分析出有用的東西,都是憑著經驗與技術得來的。(這部分可能就要請教樂大或是其他高手了xD)
那看來這段程式碼就是關鍵所在了,上面有AIS3沒錯,的確是我要找的flag的開頭,不過flag的內容在哪裡啊?
觀察程式碼中,發現一個奇怪的東西strtof,它的作用是將字串轉換為浮點數,那我要的東西會不會就在那個浮點數當中呢?
找尋浮點數中,發現有個字元陣列在這裡,裡頭當然是存放著字串啦!看來離成功不遠了。
進去那個變數後,就能看到我的目標了,不過它是不是我要找的flag就難說了,畢竟在打Wargame的過程中,這種事情經常發生,常常找到了可疑之處,結果反而是一場空。
那接下來就是解碼的動作。
我的作法是直接將上面反編譯後的C語言寫成一隻小程式,然後去執行它,看它跑出來的結果是怎樣,唯一要做的就是把那堆浮點數丟到上面宣告的字元陣列內,而str1是陣列的變數名稱。
執行完就是結果了。
最後我要說的是,逆向分析會是一個枯燥的過程,學習逆向更是個漫長的距離,最近聽幾位大大分享到,真正會逆向的人都只是把逆向當作工具。
小編目前也沒聽懂,不過就…大家一起努力吧!
我們是ISDA(台灣資訊安全聯合發展協會)。
為了要讓更多人了解資訊安全,除了基礎資訊安全教育訓練以外,偶而也會有一些資安技術的解說。
歡迎認同我們的朋友給我們一點鼓勵,到我們的FB粉絲頁按個讚加分享。
https://www.facebook.com/ISDA.tw/
有任何活動相關訊息,我們也會第一時間張貼在ISDA粉絲團喔!