[ pwn 学习 ] CTFshow-pwn15
2026-08-22 20:36:38

pwn15

eax放系统调用号

ebx/ecx/edx/...放这个系统调用的参数

eax = 4 -> sys_write

eax = 1 -> sys_exit

mov eax,4的意思是调用 write

write这个系统调用的原型是

1
write(int fd, const void *buf, size_t count)
  • fd:写到哪里
  • buf:写什么内容
  • count:写多少字节

在 32 位 Linux 的int 0x80约定中 这三个参数放在

  • ebx:第 1 个参数
  • ecx:第 2 个参数
  • edx:第 3 个参数

mov ebx, 1表示fd=1

又 ∵

  • 0:标准输入
  • 1:标准输出
  • 2:标准错误

ebx = 1表示输出到屏幕

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
section .data
str1 db "CTFshow",0
str2 db "_3@sy",0
str3 db "@ss3mb1y",0
str4 db "_1s",0
str5 db "ctfshow{"
str6 db "}"

section .text
global _start

_start:
mov eax, 4
mov ebx, 1
mov ecx, str5
mov edx, 8
int 0x80

mov eax, 4
mov ebx, 1
mov ecx, str3
mov edx, 8
int 0x80

mov eax, 4
mov ebx, 1
mov ecx, str4
mov edx, 3
int 0x80

mov eax, 4
mov ebx, 1
mov ecx, str2
mov edx, 5
int 0x80

mov eax, 4
mov ebx, 1
mov ecx, str6
mov edx, 1
int 0x80

mov eax, 1
xor ebx, ebx
int 0x80

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mov eax, 4
# 系统调用write
# 而write这个系统调用在C里的原型大致是:
# write(int fd, const void *buf, size_t count)
# 它有3个参数 fd buf count

mov ebx, 1
# 输出到标准输出,也就是屏幕
# 第1个参数fd:写到哪里
# 0是标准输入 1是标准输出 2是标准错误

mov ecx, 某个字符串
# 从哪里开始输出
# 第2个参数buf:写什么内容
# buf=要输出的数据地址

mov edx, 长度
# 输出多少个字节
# 第3个参数count:写多少字节
# count=输出的字节数

int 0x80
# 执行int 0x80
# 按我寄存器里的参数 帮我执行这个系统调用

# 上述代码块意为:把一段字节写到文件描述符1
# 上述代码块等价于调用 write(1, buf, count),把指定地址开始的若干字节写到标准输出。

按照顺序拼接:

ctfshow{@ss3mb1y_1s_3@sy}

虽然定义了str1但是输出代码里没有str1所以没用上str1

sol

1
nasm -f elf32 flag.asm -o flag.o

flag.asm汇编成目标文件flag.o

1
ld -m elf_i386 -o flag flag.o

flag.o链接成可执行文件flag

1
./flag

运行当下目录的flag

ctfshow{@ss3mb1y_1s_3@sy}


相关笔记

  • pwn5 — 汇编基础:系统调用 sys_write 与寄存器约定
  • pwn13 — GCC 编译入门
  • pwn16gcc 编译 .s 汇编文件
  • pwn14 — C 编译 + 文件 I/O
  • pwn19 — 文件描述符概念进阶(fd 0/1/2)
上一页
2026-08-22 20:36:38
下一页