文章目录
- 打包上传测试脚本
- 检查保护
- 调试
- 脚本编写
- 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");