攻防世界Reverse进阶区-EasyRE-writeup
1. 介紹
本題是xctf攻防世界中Reverse的進階區的題EasyRE。
下載下來以后是一個exe文件:210f1e18ac8d4a15904721a2383874f5.exe
2. 分析
首先看下文件格式為windows 下的32位程序
$ file 210f1e18ac8d4a15904721a2383874f5.exe 210f1e18ac8d4a15904721a2383874f5.exe: PE32 executable (console) Intel 80386, for MS Windows先在windows下運行一下,輸入時提示:input:,輸入以后按下回車卻沒有輸出。
2.1 靜態分析
先拖進IDA 里看看吧!找到之前命令行中的提示字符串 input ,找到交叉引用該字符串的地方為函數sub_401080。(在查看strings windows的時候眼前一亮發現有個 flag{NP2NiaNXx1ClGYVQ50} ,但是輸入以后發現并不是真正的flag…
F5查看函數sub_401080的偽代碼。字符串 input 的地址為0x402150,結合代碼,可以判斷sub_401020函數為printf函數。再往下發現地址0x402158開始的字符串為%s,說明sub_401050應該是scanf函數,將用戶輸入保存到v7中。
得到輸入以后,對v7的長度進行檢查,從代碼中可知v7長度必須為24個字符。
接下來以 v8地址+7 位置處的字符賦值給v2,根據IDA的分析提示,v7的起始地址為ebp-24h(ebp-36), v8的起始地址為ebp-14h(ebp-20)。假設我輸入的是abcdefghijklmnopqrstuvwx ,那么在棧中應該是下面的情況。也就是v2的初始值是用戶輸入的最后一個字符x。
| 高地址 | ebp-13 | x |
| | | ebp-14 | w |
| | | … | … |
| | | ebp-20 | q |
| | | … | … |
| ↓ | ebp-35 | b |
| 低地址 | ebp-36 | a |
每次循環中通過v1控制對用戶輸入字符串的遍歷,將v2的值賦值給v3,然后v2地址自減1,也就是逆序取下一個字符。將v3保存的當前字符賦值給數組 byte_40336C[v1]。所以這個部分其實就是逆序提取用戶輸入,保存到數組byte_40336C的過程。
接下來對數組byte_40336C的每個值x進行 (x+1)^6的操作。
最后將數組byte_40336C,也就是一個字符串,與地址0x402124開始的字符串進行比較。如果相同,即strcmp返回值為0,則調用printf函數輸出 right\n
雙擊unk_402124,選中24個字符,按下 Shift + E 提取,選擇 string literal ,得到的字符串為: xIrCj~<r|2tWsv3PtI\x7Fzndka 。
至此,整個程序的邏輯很清楚了:
- 在第1個部分中,讀取用戶輸入
- 在第2部分中,判斷用戶輸入的長度。逆序提取用戶輸入,保存到數組中(其實是個字符串)
- 在第3部分中,對數組每個值x進行 (x+1)^6的操作
- 在第4部分中,檢查得到的數組(字符串)與xIrCj~<r|2tWsv3PtI\x7Fzndka 是否相等,相等則成功解決。
用python寫腳本逆出正確的輸入 flag{xNqU4otPq3ys9wkDsN}:
# user_input逆序,存到arr數組中 # arr中的每個字符,進行 (each+1)^6 的操作 # 將arr與target比較,相同的時候輸出"right" res = "" for each in target:tmp = (ord(each) ^ 6) - 1 # 異或的優先級!!tmp_char = chr(tmp)# print("tmp:{}, tmp_char:{}".format(tmp, tmp_char))res += tmp_charres = res[::-1] print("flag:", res) # flag{xNqU4otPq3ys9wkDsN}編寫腳本的過程中有兩個需要注意的:
2.2 動態調試
一開始逆序提取那個部分有點迷,主要是不清楚那個v8的含義,也沒注意到IDA在函數的前面有提示v8的地址。于是我通過Ollydbg動態調試幫助理解。
首先需要在動態調試過程中定位之前IDA分析的sub_401080函數。可以用字符串來定位。
也可以通過程序運行的方式來定位:
運行到0x1A134E時,控制臺輸出了 input:,說明這里可能就是我們需要分析調試的地方,但是不知道是printf函數還是就是IDA里的sub_401080函數。因此我輸入以后直接F8運行,發現沒有經過之前分析過的循環邏輯,程序就終止了。說明0x1A134E調用的函數應該是sub_401080函數。
在0x1A134E按F2 打斷點,按ctrl+F2 重新運行。當再次運行到這里的時候,按F7 也就是Step Into,進入到函數中去調試。
0x1A1080就是sub_401080函數的起始地址。
需要分析IDA中 v2 = (char *)&v8 + 7; 的值是什么。通過調試可知是輸入的最后一個字符開始,也就是x
3. 總結
可以根據輸出字符串找到需要分析的函數,然后通過靜態分析尋找用戶輸入在函數中的變換,如果有不懂的先跳過,后續用Ollydbg動態調試輔助理解。先對整個函數的邏輯,每個塊的作用有個宏觀的了解。
總結
以上是生活随笔為你收集整理的攻防世界Reverse进阶区-EasyRE-writeup的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MicroMsg.SDK.WXApiIm
- 下一篇: 北航机试 16逆序数