重中之重!!!!
链里参数顺序必须按 gadget 的弹栈顺序放

32 位 Linux 系统:

1
2
3
4
eax: 系统调用号
ebx: 第 1 个参数
ecx: 第 2 个参数
edx: 第 3 个参数

常见函数及其构造

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

1. read,一般用于 bss 段写入 /bin/sh

read(0, BSS, 8)

eax = 3
含义: 调用 read

ebx = 0
含义: 文件描述符 0,即标准输入 stdin

ecx = BSS
含义: 把读到的数据写到 BSS 地址

edx = 8
含义: 最多读取 8 字节,一般是 /bin/sh\x00


2. execve , 用于getshell!

execve(BSS, 0, 0)

eax = 110xb
含义: 调用 execve

ebx = BSS
含义: filename 指针,指向字符串 /bin/sh\x00

ecx = 0
含义: argv = NULL

edx = 0
含义: envp = NULL

执行结果: 等价于 execve("/bin/sh", NULL, NULL),成功就拿到 shell。