re | [WUSTCTF2020]level3
阿新 • • 發佈:2020-09-17
這是一個x64的elf逆向題。
被坑的很慘,也學到不少。
主程式是如下一個邏輯:
通過隨機的方式選擇是加密你給的字串還是輸出提示資訊。
提示的資訊裡是base64編碼以後的東西,猜測是flag。
我一開始的思路是上圖中的base64_encode函式有問題,加密的過程可能有問題,做了特殊處理,所以進入base64函式進行分析:
如果出問題的話,問題片段應該就在其中,但是我來回分析了幾遍,甚至重新複習了一下base64的編碼原理,甚至想到了會不會是算數右移導致的誤差,但是還是沒能找到問題所在:
之後選擇使用ubuntu來進行動態除錯,被逼無奈,重新學了一下gdb的除錯方法,我的gdb裝了peda的外掛:
附上一篇簡明的peda除錯指令彙總文章:https://blog.csdn.net/weixin_30920853/article/details/97711357
發現程式加密Mz1的時候出來是AX0x而不是TXox,更是納悶了。
這才反應過來被坑了,應該是有的函式執行了修改了base64的表格,而我從主程式跟進的時候早就執行完了。
動態除錯檢視base64表的位置:
果然是被修改過了。【氣炸,看了好半天以為是加密的問題】
再回到IDA,發現這樣一個函式:
就是這個壞東西對base表進行了修改。
由於我還沒深入學習linux,所以對這個函式執行的時機和流程並不瞭解,不過好歹下次有經驗了。
最終的處理辦法是,對加密後的字串按表的替換順序進行替換,我寫了如下指令碼:
1 encoded_flag = "d2G0ZjLwHjS7DmOzZAY0X2lzX3CoZV9zdNOydO9vZl9yZXZlcnGlfD" 2 3 #TSRQPONMLKJIHGFEDCBAUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 4 #ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 5 _list = list("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/") 6 7_flag = "" 8 9 for i in encoded_flag: 10 _in = _list.index(i) 11 if _in <= 19: 12 _in = 19-_in 13 _flag += _list[_in] 14 15 print(_flag)
然後丟進工具解碼就可以了。