文章目錄
- 打包上傳測試腳本
- 檢查保護
- 調試
- 腳本編寫
- Intel Syntax
- 特點:
- 示例:
- AT&T Syntax
- 特點:
- 示例:
- 對比總結
- c庫中asm的匯編
- 用到啥更新啥,一直更新ing
打包上傳測試腳本
#!/bin/sh
gcc expolit.c -static -masm=intel -g -o expolit
mv expolit fs/
cd core
find . | cpio -o --format=newc > core.cpio
mv core.cpio ..
cd ..
./start.sh
檢查保護
調試
記得設置root,否則看不了
然后關閉kalsr,方便下斷點
查看模塊相關段和內核中存在的符號函數
gdb ./vmlinux -q
set architecture i386:x86-64target remote 127.0.0.1:1234# 先 continue, 在 insmod 之后手動 Ctrl+C 再設置斷點,免得斷點處于 pending 狀態
add-symbol-file /home/llk/Desktop/pwn/kernel/babydriver/lib/modules/4.4.72/babydriver.ko 0xffffffffc0000000b babyread
b babywrite
b babyioctl
b babyopen
b babyreleasec
腳本編寫
Intel和AT&T是兩種不同的匯編語言語法風格,主要應用于x86架構的處理器上。雖然它們都用于編寫低級別的機器代碼,但兩者在語法上有顯著的不同,特別是對于操作數的順序和一些細節的表達上。下面詳細解釋兩者的區別:
Intel Syntax
Intel語法是最常見的x86匯編語言語法,也是Intel官方文檔中推薦的語法。它的特點是操作數先于指令出現,即“目的操作數”通常放在前面,“源操作數”放在后面。
特點:
- 目的操作數在前,源操作數在后。
- 寄存器名稱不帶前綴。
- 使用大括號
{}
來表示立即數的范圍,例如mov eax, {0x1234}
(雖然這不是最常用的寫法,通常我們寫作mov eax, 0x1234
)。
示例:
; Intel Syntax
mov eax, ebx ; 將ebx的值移動到eax
add eax, 1 ; 將eax的值加1
AT&T Syntax
AT&T語法起源于UNIX系統,由AT&T公司開發。它與Intel語法的主要區別在于操作數的順序相反,以及在寄存器名稱前加上百分號 %
。
特點:
- 源操作數在前,目的操作數在后。
- 寄存器名稱前有百分號
%
。 - 立即數通常在操作數中明確表示,沒有特殊的大括號標記。
示例:
# AT&T Syntax
movl %ebx, %eax # 將ebx的值移動到eax
addl $1, %eax # 將eax的值加1
對比總結
Intel Syntax | AT&T Syntax | |
---|---|---|
操作數順序 | 目的操作數在前,源操作數在后 | 源操作數在前,目的操作數在后 |
寄存器標識 | 不帶前綴 | 帶有百分號 % 前綴 |
立即數標記 | 通常無特殊標記 | 明確表示,例如 $1 代表立即數1 |
c庫中asm的匯編
默認按照 AT&T Syntax ,如果想使用
__asm__("mov user_cs, cs;""mov user_ss, ss;""mov user_sp, rsp;""pushf;""pop user_rflags;");
需加上-masm=intel
,否則按照
asm("movq %%cs, %0\n\t""movq %%ss, %1\n\t""movq %%rsp, %2\n\t""pushfq\n\t""popq %3\n\t": "=r" (user_cs), "=r" (user_ss), "=r" (user_sp), "=r" (user_rflags):: "memory");