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

直接寻址

查看反汇编代码

image-20260524213314763

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

image-20260524213616895

ecx 的值为 0x080490E8

寄存器间接寻址

寄存器间接寻址结束后 eax 的值

image-20260524213920721

将字符串的地址赋值给 esi ,将 esi地址 的赋值给 eax

由于是32位寄存器,只能存储四个字节,所以 将 Welc 转换成 16进制就是

image-20260524214202966

由于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-基础(汇编基础)/
Author
Lixiney
Posted on
May 21, 2026
Licensed under