IDA的基本用法
IDA為Interactive Disassembler公司的反編譯與除錯工具的產品。常用于逆向工程。在CTF比賽中經常用于靜態分析,超強的工具。我們經常需要用到其F5反編譯功能,但是網絡上的資源大多數版本落后或者沒有F5功能
這里我們提供資源方便同學們下載使用學習(??????)?
提供的IDA為windows下的,因為大多數linux或者mac的反編譯F5功能并沒有,這里我們提供wine工具,方便在Linux操作系統中使用Windows程序。
- 鏈接: https://pan.baidu.com/s/1kTCK96jy2-2klNPWFbYWZg 密碼: 6mu6
- 鏈接: https://pan.baidu.com/s/1-iCiPMFRvYne91ey8XmjdA 密碼: usol
網盤速度較慢,體諒一下就好。
如何通過wine安裝Windows軟件大家自行Google就好。
具體細節的教程大家可以看開發者的博客https://www.hex-rays.com/blog/, 我們這只是針對于CTF比賽常用的方法進行介紹。
常用快捷鍵
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 創建為數組,這個一般默認選上的
創建好了以后,就變成了這樣:

可以看到這些數據已經被當成一個數組折疊到了一起,或許會遇到n dup(0xff)這樣的,表示有n個重復的數據0xff。
流程圖
折疊流程圖中的分支
在流程視圖中,分支過多的時候,可以在窗口標題處右擊選擇group nodes,就能把當前塊折疊起來

分支可以自定義命名,方便與逆向理解。
函數調用圖
菜單欄中:view–>graphs–>Function calls(快捷鍵Ctrl+F12)

這個圖能很清楚地看到函數之間是如何相互調用的
函數流程圖
菜單欄中:view–>graphs–>flowt chart(快捷鍵F12)

這個其實跟IDA自帶的反匯編流程視圖差不多,他可以導出來作為單獨的一張圖
創建結構體:
手工創建結構體
創建結構體是在IDA的structures窗口中進行的,這個操作在堆漏洞的pwn題中經常使用

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

創建結構體的快捷鍵是:insert (d 增加結構體變量,n重命名結構體變量)
導入C語言聲明的結構體
實際上,IDA有提供一個更方便的創建結構體的方法,就是直接寫代碼導入
在View–>Open Subviews–>Local Types中可以看到本地已有的結構體,在該窗口中右擊insert
可以添加新的結構體:

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

接著我們需要對著my_structure右擊,選擇 synchronize to idb。如果沒有這一步的話,同學們會發現structure視圖里面,并沒有這個結構體。

這里涉及到結構體的內存對其問題。ida默認統一4字節對齊,結構體的大小為0x18。
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個字節
參考
- https://xz.aliyun.com/t/4205#toc-12
- 《IDA pro權威指南》(第二版)
- www.idaireland.com/