前置知識:匯編代碼需要會看能看懂就行,c語言代碼要看得懂,因為大部分漏洞都是通過查看c語言代碼來尋找的
工具匯總:ida pro、pwntools、pwndbg(dbg-peda)、checksec、ROPgadget、one_gadget、LibcSearch、main_arena_offset
工具部分內容介紹:
ida pro:
要注意二進制文件是64位還是32位,要用不同的ida打開
f5:顯示偽c代碼,因為他會用一些自己的符號來標記一些東西,這個打開一個叫ders.h的文件就能看見,不過不影響我們大致理解這個程序
x:查看符號的引用,選中一個符號后按x可以顯示哪里引用了x
options->General->Disassembly->Line Prefixes:可以在反匯編窗口顯示代碼的地址,方便使用gdb直接在某個內存地址下斷點
shift + f12顯示字符串窗口:可以方便地定位關鍵代碼的位置
shift + f7 顯示段窗口
n:重命名符號:可以用一個更直觀的名字命名符號,方便自己理解代碼
x:執行交叉引用,可以查看程序哪個地方調用了該函數
gdb:
下斷點:b 函數名、b 地址
運行:run(r)
繼續執行:continue
單步執行:n
單步切入:si
跳出函數:finish(函數在內部還是會吧剩下的執行完)、return 返回值(函數后面的代碼不會執行而是直接返回並且返回給的值)
查看寄存器信息:info registers
查看內存:x/wx內存地址(以十六進制,4字節顯示指定內存的值)、x/gx 內存地址 (以十六進制,8字節顯示指定內存的值)、x/wi 內存地址(以指令的形式顯示)
context:顯示程序當前的上下文包括寄存器、cpu指向的指令、棧
jmpcall:顯示text段的call和jmp指令
pattern_create和pattern_offset:用於確認溢出點位置
searchmem:可以在內存中搜索字符串
vmmap:顯示內存中的各個段,段地址及讀寫執行的屬性
quit:退出
heap:查看每個堆的結構
bins:查看每個bin的情況
start:執行程序,並停在第一條匯編指令
c:繼續執行程序,直到下一個斷點
stack:查看棧的內容
pwntools:
context.log_level=‘debug’:可以清楚看到程序和pwntools間交互的數據,在檢查
程序泄露數據的時候很方便
p.send:發送消息,消息不存在換行符
p.sendafter:當接收到某個特定的字符后才會發送
p.sendline():發送信息后換行
p.recv:接收消息,直到超時
p.recvline:接收消息,直到換行
p.interactive:進入交互模式,通常在獲取shell后使用
p.recvuntil(字符串):可以讀取到指定字符串之后停止
p.recvrepeat(timeout):停止一段時間后讀入
gdb.attach(p, ’b * 0xfa’):啟動gdb,注意需要sudo權限啟動腳本
p64、p32、u64、u32:根據設置的context選擇小端法或大端法對數字進行編碼或者解碼,p是編碼,u是解碼
sleep(0.1):休眠0.1秒,這個是在連續send兩個東西后pwntools會給他們合並成一個發送,然后我們要把它們分開就可以用這個延時函數,先發送一個,休眠一會,再發送一個,記得要在開頭加個from time import調用time這個庫
process:拉起一個本地程序,返回一個進程對象
remote:遠程鏈接到服務器
log.info:打印信息
checksec:
checksec ./二進制文件名:可以查看二進制文件是64位還是32位以及它開的保護措施
LibcSearch:
libc=LibcSearcher('函數名', 函數地址)
這個可以自動搜尋符合條件的libc庫,不過因為沒有維護所以可能有些庫搜不到不過大部分時候都很好用,也可以使用另一個網站,好用的網站
linux指令:
echo 內容 > 文件名:把內容輸入到文件里,會覆蓋原內容
ls:查看當前目錄下的文件
ll:查看文件以及文件權限
pwd:打印當前絕對路徑
mkdir:創建目錄
whoami:查看當前用戶
cd..:返回上一個文件夾
cd /路徑:打開文件夾
touch 文件名:新建文件名
vim 文件名:編輯文件
cat 文件名:打印文件
rm -rf 文件名:刪除文件
chmod +x ./文件名:讓文件獲得權限,通常是沒法gdb運行的時候用
file 文件名:查看文件名信息,其中LSB表示小端序,LMB表示大端序
小端序:類似於0x87654321,那么問題來了他在內存是怎么存的呢,我們知道內存是從低地址到高地址存的,那么我們小端法就是低位存到低地址,看下表
地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
值 | 21 | 43 | 65 | 87 |
大端序:就是和小端序相反,高位數字存到低地址,看表
地址 | 0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|---|
值 | 87 | 65 | 43 | 21 |
c語言編譯匯編:
gcc -E test.c -o test.i:test.c的代碼預處理成test.i
gcc -S test.i -o test.s:test.i的文件編譯成test.s
gcc -c test.s -o test.o:test.s的文件匯編成test.o
gcc test.o -o test:test.o鏈接成test的可執行文件