逆向破解入門
一個(gè)簡單的程序
程序功能是判斷用戶輸入,如果是"burning",則輸出"success",否則,輸出"fail"。程序代碼如下:
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main(){
char buff[1024];
char *password = "burning";
? ? ? ?scanf("%s",buff);
if (strncmp(password,buff,strlen(password)) == 0){
? ? ? ? ? ? ? ?printf("success\n");
}
else{
? ? ? ? ? ? ? ?printf("fail\n");
}
return 0;
}
可執(zhí)行文件生成過程
預(yù)處理過程
主要處理源文件中以“#”開頭的預(yù)編譯指令,經(jīng)過預(yù)編譯處理后,得到的是預(yù)處理文件(如,test.i) ,它還是一個(gè)可讀的文本文件 。
gcc –E test.c –o test.i
編譯
將預(yù)處理后得到的預(yù)處理文件(如 test.i)進(jìn)行詞法分析、語法分析、語義分析、優(yōu)化后,生成匯編代碼文件。經(jīng)過編譯后,得到的匯編代碼文件(如 test.s)還是可讀的文本文件,CPU無法理解和執(zhí)行它。
gcc ?-S test.i -o test.s
匯編過程
匯編程序(匯編器)用來將匯編語言源程序轉(zhuǎn)換為機(jī)器指令序列(機(jī)器語言程序)。匯編結(jié)果是一個(gè)可重定位目標(biāo)文件(如 test.o),其中包含的是不可讀的二進(jìn)制代碼,必須用相應(yīng)的工具軟件來查看其內(nèi)容。
gcc –c test.s –o test.o
預(yù)處理、編譯和匯編三個(gè)過程針對(duì)一個(gè)模塊(一個(gè).c文件)進(jìn)行處理,得到對(duì)應(yīng)的一個(gè)可重定位目標(biāo)文件(一個(gè).o文件)。
鏈接過程
將多個(gè)可重定位目標(biāo)文件合并以生成可執(zhí)行目標(biāo)文件。
一步到位
直接將.c文件轉(zhuǎn)化為可執(zhí)行目標(biāo)程序(ELF)。
gcc test.c -o test
破解test程序
運(yùn)行程序

程序破解
如果輸入任何內(nèi)容,都顯示success,則說明test程序破解成功。
Radare2
Radare2在逆向方面是可以比肩IDA Pro的,從學(xué)習(xí)的角度來說,更建議使用Radare2。因?yàn)镮DA的F5功能具有反匯編的功能可以直接把匯編代碼翻譯成C語言,這樣反倒不會(huì)關(guān)注匯編語言了,同時(shí)在Linux下,IDA破解版也不太好用。
在這里對(duì)Radare2進(jìn)行簡單的介紹。
查看程序信息
使用如下 rabin2-I test
命令查看test程序信息。

通過 rabin2-z test
查看來自數(shù)據(jù)段的字符串。

破解之旅
打開Radare2。?
r2-w test
分析信息。?
aa
查看所有的flag。Radare2會(huì)將所有有用的信息和特定的名字綁定在一起,比如區(qū)段、函數(shù)、符號(hào)、字符串,這些都被稱作 'flags', flags 被整合進(jìn) ,一個(gè) flag 是所有類似特征的集合。?
fs
查看字符串引用 1.?
fs strings;f
?輸出結(jié)果是:0x000008ef 8 str.success 2.?axt@@str.sucess
?'axt' 命令用來在 data/code段里找尋某個(gè)地址相關(guān)的引用地址跳轉(zhuǎn)?
s0x81c

查看匯編代碼?
pdf

進(jìn)入可視化頁面,查看流程圖。?
v

通過流程圖,很容易看出存在條件跳轉(zhuǎn),如果能夠讓所有的條件都走success流程,那么程序就算破解成功了。
修改?
jne0x82a
?為?jne0x81c
,則無論怎樣,都會(huì)走success流程而不會(huì)走fail的流程。跳轉(zhuǎn)到?
jne0x82a
。?s0x0000081a
修改指令,所有流程都走0x81c。?
wx7500
查看修改內(nèi)容。?
pd3

退出。?
q
驗(yàn)證
運(yùn)行test程序,無論輸入什么內(nèi)容,都是會(huì)輸出success的?。。?!

Rasm2
rasm2 is an inline assembler/disassembler。在上面修改代碼的時(shí)候,是通過 wx7500
來讓所有的流程都走success流程的,這個(gè)機(jī)器碼7500是怎么來的?通過如下的命令就可以獲得,其中的0x02是0x81c和0x82a的偏移。
rasm2 -a x86 -b 32 "jne 0x02"
web頁面
Radare2自帶了內(nèi)嵌的Web服務(wù)器,服務(wù)器提供了純html/js接口可發(fā)送ajax請求。可以使用下面的命令進(jìn)行啟動(dòng):
r2 -c=H test
界面效果如下:

公眾號(hào)
更多內(nèi)容,歡迎關(guān)注我的公眾號(hào):無情劍客。
