PWN-基础(汇编基础)
以 NASM 为主
基本结构
| 段(section) | 作用 | 特点 |
|---|---|---|
| .data | 存放已初始化的全局变量和常量 | 编译时确定大小和内容,存入可执行文件 |
| .bss | 存放未初始化的全局变量 | 只在运行时分配空间,不占用可执行文件的大小 |
| .text | 存放可执行的机器指令 | 只读,包含程序的全部逻辑代码 |
注 如果没有数据,可以省略 .bss 和 .data 段
寄存器
| 寄存器 | 调用约定中的用途 |
|---|---|
| EAX | 存放函数返回值 |
| ECX | 计数器(循环计数) |
| EDX | 存放除法的高位结果、扩展 EAX |
| EBX、ESI、EDI、EBP | 被调用函数必须保存和恢复(callee-saved) |
| EAX、ECX、EDX | 调用者负责保存(caller-saved) |
寻址方式
section .data
msg db "Welcome_to_CTFshow_PWN", 0
section .text
global _start
_start:
; 立即寻址方式
mov eax, 11 ; 将11赋值给eax
add eax, 114504 ; eax加上114504
sub eax, 1 ; eax减去1
; 寄存器寻址方式
mov ebx, 0x36d ; 将0x36d赋值给ebx
mov edx, ebx ; 将ebx的值赋值给edx
; 直接寻址方式
mov ecx, msg ; 将msg的地址赋值给ecx
; 寄存器间接寻址方式
mov esi, msg ; 将msg的地址赋值给esi
mov eax, [esi] ; 将esi所指向的地址的值赋值给eax
; 寄存器相对寻址方式
mov ecx, msg ; 将msg的地址赋值给ecx
add ecx, 4 ; 将ecx加上4
mov eax, [ecx] ; 将ecx所指向的地址的值赋值给eax
; 基址变址寻址方式
mov ecx, msg ; 将msg的地址赋值给ecx
mov edx, 2 ; 将2赋值给edx
mov eax, [ecx + edx*2] ; 将ecx+edx*2所指向的地址的值赋值给eax
; 相对基址变址寻址方式
mov ecx, msg ; 将msg的地址赋值给ecx
mov edx, 1 ; 将1赋值给edx
add ecx, 8 ; 将ecx加上8
mov eax, [ecx + edx*2 - 6] ; 将ecx+edx*2-6所指向的地址的值赋值给eax
; 输出字符串
mov eax, 4 ; 系统调用号4代表输出字符串
mov ebx, 1 ; 文件描述符1代表标准输出
mov ecx, msg ; 要输出的字符串的地址
mov edx, 22 ; 要输出的字符串的长度
int 0x80 ; 调用系统调用
; 退出程序
mov eax, 1 ; 系统调用号1代表退出程序
xor ebx, ebx ; 返回值为0
int 0x80 ; 调用系统调用
立即寻址
11 + 114504 -1
eax 值 为 114514
寄存器寻址
edx 值为 0x36d
直接寻址
查看反汇编代码

将字符串的地址传给 ecx,在.data 段找到 字符串的地址

ecx 的值为 0x080490E8
寄存器间接寻址
寄存器间接寻址结束后 eax 的值

将字符串的地址赋值给 esi ,将 esi地址 的赋值给 eax
由于是32位寄存器,只能存储四个字节,所以 将 Welc 转换成 16进制就是

由于x86 是小端序,低位在前,所以 eax 的值为 0x636c6557
寄存器相对寻址
这里将msg的地址(0x80490E8)+ 4 处所执向的地址的值赋给eax
也就是“ome_to_CTFshow_PWN”
基址变址寻址方式
计算最终也是 [0x80490E8 + 2*2 ] = [0X80490EC]
编译链接
- 将汇编代码编译为目标文件
nasm -f elf ***.asm -o ***.o- 将目标文件链接为可执行文件
ld -m elf_i386 -o *** ***.o- 运行程序
./***PWN-基础(汇编基础)
https://blog.lixey.top/PWN-基础(汇编基础)/