入門逆向
本題要點:ASCII編碼、IDA中main函數查看、OD的單步運行操作
解壓后發現是一個
.exe 文件
先用
Exeinfo PE 查看一下是否加殼
可以看到寫了gcc編譯的。應該是沒有加殼的。
簡要補充一點~
筆者是個初學者,所知有限,難免會有錯誤,如果有小伙伴發現了錯誤,還請指正~
1.殼的概念
在計算機軟件里有一段專門負責保護軟件不被非法修改或反編譯的程序。它們一般都是先於程序運行,拿到控制權,然后完成它們保護軟件的任務。
2.加殼的概念
通過數學運算,將可執行程序文件或動態鏈接庫文件的編碼進行改變, 以達到縮小文件體積或加密程序編碼的目的。
例如:黑客使用病毒加殼,主要是對使用的木馬等惡意程序進行保護,從而避免它們被殺毒軟件查殺; 程序作者想對程序資源壓縮、注冊保護的目的,在計算機軟件里也有一段專門負責保護軟件不被非法修改或反編譯的殼; 有一些版權信息需要保護起來,不想讓別人隨便改動,如作者的姓名,即為了保護軟件不被破解,通常都是采用加殼來進行保護......
常見的殼有壓縮殼、密碼殼、加密殼。
3.脫殼的概念
對應加殼的概念來說,是指除掉程序的保護(殼),修改程序資源。
脫殼的兩種方法: 硬脫殼和動態脫殼
(1) 硬脫殼。這是指找出加殼軟件的加殼算法,寫出逆向算法,就像壓縮和解壓縮一樣。
(2) 動態脫殼。由於加殼的程序運行時必須還原成原始形態,即加殼程序會在運行時自行脫殼, 抓取(Dump)內存中的鏡像,再重構成標准的執行文件。
我們先拖入
IDA 中,定位
main 函數 ,發現有許多
mov 指令 ,66H 是
f ,6CH 是
l ,推測這就是 flag 的
ASCII 碼值 。
鼠標點擊
66H ,按鍵盤
R鍵 ,就可以顯示出字符得到 flag。
當然,我們也可以用
OD 進行
動態調試 ,單步運行看看棧里的變化。
從IDA中先搜索
0x00401475 這個地址。
在 OD 中,
Ctrl+G ,搜索地址,找到指令之后按
F2 下斷點。
flag 值是從
ESP+0x2F 開始,可以用計算器算一下,ESP 是
0x61FEF0 ,加 0x2F 就是
0x61FF1F ,按照這個地址去棧中看。
在棧這個窗口,右鍵=》顯示ASCII數據
前面我們說到0x61FF1F這個地址,但是我們單步運行后,自動跳轉之后發現沒有0x61FF1F這個地址,最近的就是
0x61FF1C ,(此處筆者也不知道是為什么,有大佬可以指點一下~)那我們就看一下0x61FF1C吧~
補充:
我們單步執行了三步,看到輸出了
lf ,再單步執行一步,
mov 了一個
61 進去也就是
a ,然后往里面輸a進去,應該是大小端的問題,所以是往前打印的,也就是往前站了一個字節a,所以是
alf ,往后類推.......
雖然
L 后面是一個中文,但是看 ASCII 碼的話他是 0x7D,也就是
} ,只不過跟后面的 0xBB 放在一起,OD就翻譯成一個中文了
得到答案:
flag{Re_1s_S0_C0OL}
參考資料:
http://bhhacker.lofter.com/post/38b021_6899f31
https://blog.csdn.net/thmail/article/details/72781649
https://blog.csdn.net/Selukwe/article/details/88429093
