1. 程式人生 > 實用技巧 >re | [WUSTCTF2020]level3

re | [WUSTCTF2020]level3

這是一個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)

然後丟進工具解碼就可以了。