IDA Pro 使用技巧總結

俗話說,工欲善其事,必先利其器,在二進制安全的學習中,使用工具尤爲重要,而IDA又是玩二進制的神器,以前在使用IDA的時候,只是用幾個比較常用的功能,對於IDA的其他功能沒有去研究,於是本着學習的精神,參考着《IDA pro權威指南》(第二版),寫下這篇文章,記錄自己的學習心得,下面的記錄都是在Windows平臺下的IDA pro7.0進行的

一些二進制工具

在《IDA pro權威指南》的開篇一兩章中,先是介紹了幾款常用於二進制研究的工具,我這裏簡單的記了幾個,介紹一波:

C++filt:
可以用於顯示出c++中複雜的重載後的函數名稱

PE tools:
是一組用於分析Windows系統中正在運行的進程和可執行文件的工具

string:
可以用於直接搜索出elf文件中的所有字符串
參數-a 表示搜索整個文件,參數-t 可以顯示出每一個字符串的偏移,參數-e 可以用於搜索更多的字符編碼的字符串,如Unicode編碼

strip:

可用於elf去符號,去符號後仍然保持正常功能但增加了逆向的難度,出題惡人必備

開發了IDA的天才是Ilfak,他的個人博客有很多IDA的教程
https://www.hexblog.com/

IDA目錄結構

在IDA的安裝根目錄下有許多文件夾,各個文件夾存儲不同的內容

cfg:包含各種配置文件,基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg,文本模式用戶界面配置文件idatui.cfg,
idc:包含IDA內置腳本語言IDC所需要的核心文件
ids:包含一些符號文件
loaders:包含用於識別和解析PE或者ELF
plugins:附加的插件模塊
procs:包含處理器模塊

常用快捷鍵

IDA中的快捷鍵都是和菜單欄的各個功能選項一一對應的,基本上你只要能在菜單欄上找到某個功能,也就能看到相應的快捷鍵,這裏記錄幾個常用的:

a:將數據轉換爲字符串

f5:一鍵反彙編

esc:回退鍵,能夠倒回上一部操作的視圖(只有在反彙編窗口才是這個作用,如果是在其他窗口按下esc,會關閉該窗口)

shift+f12:可以打開string窗口,一鍵找出所有的字符串,右擊setup,還能對窗口的屬性進行設置

ctrl+w:保存ida數據庫

ctrl+s:選擇某個數據段,直接進行跳轉

ctrl+鼠標滾輪:能夠調節流程視圖的大小

x:對着某個函數、變量按該快捷鍵,可以查看它的交叉引用

g:直接跳轉到某個地址

n:更改變量的名稱

y:更改變量的類型

/ :在反編譯後僞代碼的界面中寫下注釋

\:在反編譯後僞代碼的界面中隱藏/顯示變量和函數的類型描述,有時候變量特別多的時候隱藏掉類型描述看起來會輕鬆很多

;:在反彙編後的界面中寫下注釋

ctrl+shift+w:拍攝IDA快照

u:undefine,取消定義函數、代碼、數據的定義

常用設置

拍攝快照

由於IDA不提供撤銷的功能,如果你不小心按到某個鍵,導致ida數據庫發生了改變,就得重新來過,所以要記得在經常操作的時候,加上快照:file-->take database snapshot
加完快照後,會生成一個新的ida數據庫文件,本質上是有點像另存的操作

快捷鍵:ctrl+shift+w

菜單欄常用設置

view-->open subviews: 可以恢復你無意中關閉的數據顯示窗口

windows-->reset desktop: 可以恢復初始ida佈局

option-->font: 可以改變字體的相關屬性

在流程視圖中添加地址偏移

IDA中的流程視圖可以說是非常的好用,簡單明瞭地能看出程序的執行流程,尤其是在看if分支代碼和循環代碼的時候,能夠非常直觀

但是,我們還可以改得更加好用,在這個視圖中添加地址偏移的話,我們取地址就非常方便,不再需要按空格切換視圖去找,在菜單欄中設置:option-->general

將該選項打鉤後就可以看到效果了:

自動添加反彙編註釋

這個功能對於萌新來說非常友好,在剛剛初學彙編的時候, 難免遇到幾個不常用的蛇皮彙編指令,就得自己一個個去查,很麻煩,開啓了自動註釋的功能後,IDA就可以直接告訴你彙編指令的意思

同樣是在菜單欄中設置:option-->general

效果如下:

常用操作

創建數組

在操作IDA的時候,經常會遇到需要創建數組的情況,尤其是爲了能方便我們看字符串的時候,創建數組顯得非常必要,以下我隨便找了個數據來創建數組

首先點擊選中你想要轉換成數組的一塊區域:

接着在菜單欄中選擇:edit-->array,就會彈出如下的選項框

下面來解釋一下各個參數的意思:

Array element size 這個值表示各數組元素的大小(這裏是1個字節),是根據你選中的數據值的大小所決定的

Maximum possible size 這個值是由自動計算得出的,他表示數組中的元素的可能的最大值

Array size 表示數組元素的數量,一般都根據你選定的自動產生默認值

Items on a line 這個表示指定每個反彙編行顯示的元素數量,它可以減少顯示數組所需的空間

Element print width 這個值用於格式化,當一行顯示多個項目時,他控制列寬

Use “dup” construct :使用重複結構,這個選項可以使得相同的數據值合併起來,用一個重複說明符組合成一項

Signed elements 表示將數據顯示爲有符號數還是無符號數

Display indexes 顯示索引,使得數組索引以常規的形式顯示,如果選了這個選項,還會啓動右邊的Indexes選項欄,用於選擇索引的顯示格式

Create as array 創建爲數組,這個一般默認選上的

創建好了以後,就變成了這樣:


)

可以看到這些數據已經被當成一個數組摺疊到了一起,其中2 dup(0FFh)這樣的,表示有兩個重複的數據0xff

流程圖

摺疊流程圖中的分支

在流程視圖中,分支過多的時候,可以在窗口標題處右擊選擇group nodes,就能把當前塊摺疊起來

效果如下:

分支塊是可以自己命名的,方便自己逆向理解

函數調用圖

菜單欄中:view-->graphs-->Function calls(快捷鍵Ctrl+F12)

這個圖能很清楚地看到函數之間是如何相互調用的

函數流程圖

菜單欄中:view-->graphs-->flowt chart(快捷鍵F12)

這個其實跟IDA自帶的反彙編流程視圖差不多,他可以導出來作爲單獨的一張圖

創建結構體:

手工創建結構體

創建結構體是在IDA的structures窗口中進行的,這個操作在堆漏洞的pwn題中經常使用

可以看到,這裏已經存在了四個結構體,程序本身存在的,可以右擊選擇hide/unhide,來看具體的結構體的內容

創建結構體的快捷鍵是:insert

在彈出的窗口中,可以編輯結構體的名字

這底下有三個複選框,第一個表示顯示在當前結構體之前(就會排列在第一位,否則排列在你鼠標選定的位置),第二個表示是否在窗口中顯示新的結構體,第三個表示是否創建聯合體。

需要注意的是,結構體的大小是它所包含的字段大小的總和,而聯合體的大小則等於其中最大字段的大小

在單擊ok以後,就定好了一個空的結構體:

將鼠標放在 ends這一行,單擊快捷鍵D即可添加結構體成員,成員的命名默認是以field_x表示的,x代表了該成員在結構體中的偏移

同時,可以把鼠標放在結構體成員所在的行,按D,就可以切換不同的字節大小

默認情況下可供選擇的就只有db,dw,dd(1,2,4字節大小)

如果想添加型的類型,可以在option-->setup data types(快捷鍵Alt+D),進行設置

如圖,勾選了第五個和第九個的話,就會出現dq和xmmword了(代表了8字節和16字節)

如果要添加數組成員則可以對着成員所在的那一行,右擊選擇array

如圖,要創建的是16個元素的4字節數組

如果要刪除結構體,那麼對着結構體按下delete鍵即可刪除

如果要刪除成員,則對着成員按下u(undefine)但是需要注意的是,這裏只是刪除了成員的名字,而沒有刪除它所分配的空間

如圖,我們刪除了中間的field_10的數組成員:

會變成這樣:

數組所分配的20個字節的空間並沒有被刪除,這時如果要刪除掉這些空間,就需要在原來數組成員所在的第一行中按下Ctrl+S,刪除空間(Edit-->shrink struct types)

就可以真正的刪除掉成員

給結構體的成員重命名可以用快捷鍵N

我們在IDA中創建好了結構體以後,就是去應用它了

如圖,這是一個典型的堆的題目

可以看到v1是一個新建的chunk的地址指針,而後的操作都是往chunk不同的偏移位置寫入內容,爲了方便我們逆向觀察,可以將其變成一個結構體,通過v1 v1+4 v1+0x48 這樣的偏移,創建好結構體後,將char *v1的類型改成mail *v1,(快捷鍵Y可以更改函數、變量的類型和參數)這個mail是我們創建的結構體的名稱,效果如下:

導入C語言聲明的結構體

實際上,IDA有提供一個更方便的創建結構體的方法,就是直接寫代碼導入

在View-->Open Subviews-->Local Types中可以看到本地已有的結構體,在該窗口中右擊insert

可以添加新的結構體:

這樣就導入了新的結構體:

但同時我們發現structure視圖裏面,並沒有這個結構體,我們需要對着my_structure右擊,選擇 synchronize to idb

這樣structure視圖就有了,如圖

這裏你會發現,多出來兩個db的undefined的成員,這是因爲ida默認是會把結構體統一4字節對齊的,滿足結構體的大小爲0x28

IDA動態調試elf:

這裏我以一個在Ubuntu虛擬機中的elf爲例子,進行調試

首先把ida目錄中的dbgsrv文件夾中的linux_server64拷貝到Ubuntu的elf的文件夾下,這個elf是64位的所有用的是linux_server64,如果你調試的是32位的程序,你就需要拷貝linux_server

記得給他們權限,然後在終端運行,這個程序的作用就像是連接ida和虛擬機中elf的橋樑

然後再到ida中進行配置:

在菜單欄中選擇:debugger-->process options

注意,application和input file 都是填寫在虛擬機中的elf的路徑,記得要加文件名

而directory 填寫elf所在目錄,不用加文件名

hostname是虛擬機的ip地址,port是默認的連接端口

parameter和password一般都不用填

設置好了以後點擊ok

接着可以直接在反彙編視圖中下斷點,只要點擊左邊的小藍點即可

這時按下快捷鍵F9,可以直接開始調試

按下快捷鍵F4,則直接運行到斷點處停下

這個就是基本的各個功能區的介紹,上面是我比較喜歡的常用佈局,和ida默認的不太一樣,想要自定義添加一些視圖的話,可以在debugger-->quick debug view中添加

另外可以在Windows-->save desktop來保持當前的視圖佈局,以後就可以直接加載使用

下面介紹一些常用的快捷鍵

F7 單步步入,遇到函數,將進入函數代碼內部
F8 單步步過,執行下一條指令,不進入函數代碼內部
F4 運行到光標處(斷點處)
F9 繼續運行
CTRL+F2 終止一個正在運行的調試進程
CTRL+F7 運行至返回,直到遇到RETN(或斷點)時才停止.

知道了這些快捷鍵後,調試起來就比較容易了,ida調試有個比較方便的地方在於能直接看到函數的真實地址,下斷點也非常直觀易操作

IDA-python

在IDA的最下面有個不起眼的Output Window的界面,其實是一個終端界面,這裏有python終端和IDC終端

這裏的python是2.7的版本,雖然老了點,但已經足夠我們用了,在IDA的運用中,我們經常需要計算地址,計算偏移,就可以直接在這個終端界面進行操作,非常方便


當然上面說的只是很簡單的python用法,真正的IDA-python的用法是這樣的:

這裏以簡單的一道逆向題來做個例子

這個程序很簡單,一開始來個for循環,把judge函數的內容全部異或0xc,這樣就導致了程序一運行就會直接破壞掉judge函數

從而使得沒法進行後面的flag判斷

這裏我們就需要寫一個腳本來先把被破壞的內容還原,這裏IDA提供了兩種寫腳本操作的方法,一種就是IDC腳本,一種就是python腳本

這裏只簡單的介紹IDA-python

而IDA-python通過三個python模塊將python代碼注入IDA中:

idaapi模塊負責訪問核心IDA API

idc模塊負責提供IDA中的所有函數功能

idautils模塊負責提供大量實用函數,其中許多函數可以生成各種數據庫相關對象的python列表

所有的IDApython腳本會自動導入idc和idautils模塊,而idaapi模塊得自己去導入

這裏貼上IDApython的官方函數文檔,這裏包含了所有函數,值得一看

針對以上的題目,我們只需要做一個腳本,指定judg函數的0-181範圍的字節異或0xc,即可恢復

judge=0x600B00
for i in range(182):
    addr=0x600B00+i
    byte=get_bytes(addr,1)#獲取指定地址的指定字節數
    byte=ord(byte)^0xC
    patch_byte(addr,byte)#打patch修改字節

在菜單欄中file-->script file,加載python腳本

接着在judge函數中undefined掉原來的函數,在重新生成函數(快捷鍵p),就可以重新f5了
腳本中出現的函數都是已經封裝在idc模塊中的,具體可查官方文檔

這只是一個簡單的IDApython的使用例子,實際上這個功能非常強大,能弄出非常騷的操作

打PATCH

打patch,其實就是給程序打補丁,本質上是修改程序的數據,指令等,這在CTF中的AWD賽制中經常用到,發現程序漏洞後馬上就要用這個功能給程序打好patch,防止其他隊伍攻擊我們的gamebox

這裏,我是用一個叫keypatch的插件進行操作的,IDA自帶的patch功能不太好用

安裝keypatch

這個很簡單,教程在github就有

下載Keypatch.py複製到插件目錄

IDA 7.0\plugins\Keypatch.py

下載安裝keystone python模塊,64位系統只需要安裝這一個就行

https://github.com/keystone-engine/keystone/releases/download/0.9.1/keystone-0.9.1-python-win64.msi

安裝好後,你就會發現這裏有個keypatch的選項

修改程序指令

如果我們要修改程序本身的指令,怎麼做呢

如圖,我們要修改63h這個值

將鼠標指向改行,按快捷鍵Ctrl+Alt+K

直接輸入彙編語句即可修改,打好patch後效果如圖:

這裏會生成註釋告訴你,這裏打過patch,非常人性化

接着還要在菜單欄進行設置才能真正使得patch生效

這樣一來,原來的程序就已經被修改了

撤銷patch

如果不小心打錯了patch,就可以在這裏進行撤銷上一次patch的操作了

但是如果打了很多次patch,不好分清該撤銷哪一次的patch,那麼可以在菜單欄中打開patched bytes界面

看到所有的patch,要撤銷哪一個就右擊選擇 revert

IDA導出數據文件

在菜單欄中,這裏有個選項可以生成各種不同的輸出文件

這裏簡單的介紹前兩個文件,後面的大家可以自己去生成測試一下用途,我這裏就不詳細介紹了

.map文件描述二進制文件的總體結構,包括與構成改二進制文件的節有關的信息,以及每個節中符號的位置。

.asm文件,也就是彙編了,直接能導出ida中反彙編的結果,這個非常實用,有的時候在逆向中經常遇到大量數據加解密的情況,如果在從IDA中一個個慢慢複製可就太沒效率了,直接導出生成asm,在裏面複製數據快很多

IDA常見命名意義

IDA經常會自動生成假名字。他們用於表示子函數,程序地址和數據。根據不同的類型和值假名字有不同前綴

sub 指令和子函數起點
locret
 返回指令
loc 指令
off
 數據,包含偏移量
seg 數據,包含段地址值
asc
 數據,ASCII字符串
byte 數據,字節(或字節數組)
word
 數據,16位數據(或字數組)
dword 數據,32位數據(或雙字數組)
qword
 數據,64位數據(或4字數組)
flt 浮點數據,32位(或浮點數組)
dbl
 浮點數,64位(或雙精度數組)
tbyte 浮點數,80位(或擴展精度浮點數)
stru
 結構體(或結構體數組)
algn 對齊指示
unk
 未處理字節

IDA中有常見的說明符號,如db、dw、dd分別代表了1個字節、2個字節、4個字節

IDA反編譯報錯

目前來說, 我遇到的反編譯報錯的情況,一般是兩種

  • 一是由於程序存在動態加密,導致程序的某些代碼段被修改,從而反編譯出錯,這種情況,就需要去使用IDA-python解密一波,再進行F5反彙編

  • 二是由於某些玄學問題,直接提示了某個地方出錯,一般來說,就按照IDA的提示,去進行修改

    比如,出現如下報錯:

那我們就去找413238這個地址的地方,提示是說sp指針的值沒有被找到,說明是這裏出錯了,那麼就去修改sp的值,修改方法如下:

也可以使用快捷鍵 Alt+K

有的時候,遇到的這種報錯

就嘗試着把報錯的地址的彙編語句改一哈,改成nop,就可以解決問題

目前來說,我遇到報錯的情況不多,一般都可以通過以上方法解決

配置IDA

在ida的根目錄的cfg文件夾是專門用來存儲配置文件的

ida的主配置文件爲ida.cfg,另外的還有idagui.cfg,idatui.cfg這兩個配置文件對應IDA的GUI配置和文本模式的版本

一、ida.cfg

該文件包含了option-->general中的所有選項的配置,可以通過選項中的描述在配置文件總找到相應的選項

這裏舉幾個例子:

SHOW_AUTOCOMMENTS 表示是否自動生成彙編指令的註釋

GRAPH_SHOW_LINEPREFIXES 表示是否在流程控制視圖中顯示地址

VPAGESIZE 表示內存調整參數,當處理非常大的輸入文件時,IDA可能報告內存不足而無法創建新數據庫,在這種情況下增大該參數,重新打開輸入文件即可解決問題

OPCODE_BYTES 表示要顯示的操作碼字節數的默認值

INDENTATION 表示指令縮進的距離

NameChars 表示IDA支持的變量命令使用的字符集,默認是數字+字母還有幾個特殊符號,如果需要添加就改變該參數

二、idagui.cfg

這個文件主要配置默認的GUI行爲,鍵盤的快捷鍵等,這個很少需要修改,不做過多介紹。感興趣的可以自己打開該文件觀察,並不難懂,改改快捷鍵還是很容易的

三、idatui.cfg

這個似乎更加不常用。。。不多說了

需要注意的是,以上三個文件是默認配置,也就是說,每次打開創建新的ida數據庫的時候,都會以這三個配置文件的設置進行創建,之前臨時在菜單欄的設置就會消失,要永久設置ida的配置,就改這三個文件

但,凡是都有例外,在option-->font和option-->colors這兩個選項是全局選項,修改一次就永久生效的,不用在以上三個配置文件中改

最後

通過這一次系統地去學IDA,發現這個軟件真的是非常厲害,我上面也只是簡單地記錄了平時比較常用的功能和操作,IDA還有很多高級的開發技巧,甚至你還能自定義模塊和加載器等,也能自己製作ida的插件,在這個過程中,發現看書真的很重要,自己看書和看網上別人總結的,完全不一樣,搞二進制還是得踏踏實實打好基礎,所謂萬丈高樓平地起。以前覺得天天對着電腦搞這些很累,進步又慢感覺很難,而經歷這個黑暗寒假,我才知道這些東西再難也難不過生活,有個安安靜靜平平穩穩的生活去搞技術又何嘗不是一種幸運。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章