Modern Binary Exploitation是教授二進制漏洞和逆向工程方面的實戰攻擊技巧的課程,課程安排結合課程教授和動手實踐提供學生探索快速發展的安全領域中常用思路和技巧的機會。這里記錄筆者根據課程網站學習的 lecure 1 關於逆向以及其常用工具的知識,以供參考和查閱。課程網址:Modern Binary Exploitation
lecure 1:逆向及常用工具
主要思路:(1)靜態 + 動態調試結合 ;(2) 源程序 + 修改程序並重;
課程介紹一些在常用操作系統(Linux、Windows)平台下的反匯編工具,並通過具體的實例來介紹工具的使用方法。
Linux平台:命令行指令(command)
Windows平台:反匯編程序的可執行文件(.exe)
靜態調試:
Linux:
xxd:
十六進制編輯/查看工具.可用於十六進制序列的轉換以及反匯編操作。(wxHexEditor,提供圖形界面的操作)
xxd [-options] inputfile outputfile
//從標准輸入或指定的文件中讀取數據並輸出其十六進制表示,也可以用於轉換十六進制數據
//如果不指定inputfile或使用 - ,則從stdin讀取輸入,若不指定outputfile或使用 - ,則輸出至stdout
-b //進行二進制數據的轉換,而不是十六進制
-c //指定每一行column的字節數,默認16個字節
-g num //將輸出的數據每num個字節使用空格隔開,默認num=2,二進制情況下num=1
-l length //輸出length個字節后停止
-r //反匯編選項,將十六進制表示轉換為二進制流
-p|ps //以連續十六進制串的形式輸出。默認每行由十六進制行號開始,以對應的ASCII字符結束
-s ±offset //自輸入文件偏移offset長度處開始讀取,-offset為自文件末尾偏移offset處開始
-i //以c include style輸出
使用示例:
(1)以連續十六進制串輸出48個字節,每行20個字節
xxd -l 0x30 -c 20 -ps test.txt
(2)正常輸出文件的最后48個字節的內容,每行10個字節,每4個字節用空格隔開
xxd -s -0x30 -c 10 -g 4 test.txt
(3)以c include style輸出示例
strings:
輸出文件中的可打印的字符串
strings filename
//strings輸出指定的文件的內部可打印的字符串序列(至少四字節或指定字節長度的串)
//默認只輸出initialized和loaded section部分的字符序列
-a //輸出整個文件的符合條件的字符串
-n length //輸出長度至少為length的字符序列,默認值為4
-t format //在每個字符序列前輸出其在文件內的偏移量,format表示其輸出格式,o為8進制,x為16進制,d為10進制
-e //指定字符序列的編碼方式
file:
確定文件類型的命令。輸出的內容包括文件類型、機器類型、鏈接情況等。
圖示的file指令執行結果包括文件類型ELF 64-bit,運行於x86-64架構,使用動態鏈接以及所用的編譯器版本等信息。
readelf:
輸出指定的ELF文件(executable and linkable format,Linux平台下的可執行文件格式)的有關信息,與objdump功能相似
readelf [Options] filename
-a //輸出所有相關信息
-h //輸出ELF頭部(ELF header)中的信息,一般包括ELF頭大小、目標文件類型(可重定位、可共享、可執行)、機器類型(IA32)、節頭部表的文件偏移(位於文件尾部)和其條目大小和數量
-l //輸出節頭部表(segment header)中的信息,節頭部表包含對文件中各個section位置和大小的描述,每一個節占用一個固定大小的條目(entry)
-s //輸出.symtab節符號表中的條目
-r //輸出.rel.xx節即重定向節(rellocation section)
-x name/num //以十六進制字節方式展示指定的名稱或索引數字指向的節的信息,這里的索引數字為節頭部表中的索引順序
-R name/num //同上,但在重定向節會在重定向后輸出
-p name/num //以可打印字符的格式輸出指定節內容
查看目標文件的符號表:readelf -s filename
包含有符號條目的偏移(所在節中的節偏移)、所占用空間大小(字節數)、類型(函數、數據、節)、作用域(global/local)、所在節、標志名等信息。
查看目標文件的ELF頭:readelf -h filename
objdump:
主要用於反匯編的工具
objdump [Options] filename
//objdump實際上是與readelf命令相似,用於輸出指定目標文件的信息,但其最常用的功能為-d選項,用於反匯編工作 -d //反匯編指定的文件
-g //輸出目標文件的調試信息(如果存在的話)
-l //通過調試信息將反匯編結果使用文件名和源代碼行數標記(如果存在調試信息的話)
Windows
IDA Pro:Windows平台下的反匯編工具
常用的快捷鍵:(可參考IDA Pro Shortcuts)
快捷鍵 |
功能 |
空格 |
基礎模式與圖形模式切換,在代碼段可用 |
n |
重命名操作 |
a |
轉換為數組,即將選定的單個元素結合在一起 |
; |
添加注釋(常用) |
x |
Cross-reference,交叉參考 |
d |
改變解釋數據的長度,可在db、dd、dw之間轉換 |
u |
取消當前自定義的結構 |
Ctrl + s |
跳轉至不同的段中 |
F1 |
使用指南 |
Shift+F12 |
顯示字符串(常用) |
Shift+F7 |
顯示目標文件的各個section |
Shift+F8 |
顯示段寄存器信息 |
Shift+F4 |
顯示所有的name |
F5 |
查看偽代碼(常用) |
調試相關
F2 |
放置斷點(也可單擊代碼左側小點,使之變紅) |
F9 |
運行 |
F7 |
步入函數內部執行 |
F8 |
步過 |
Ctrl+F7 |
運行至函數結束 |
F4 |
運行至光標處 |