Bonjour,
je viens vers vous car je suis dans l'impasse sur un projet pédagogique.
Je cherche à exécuter du binaire à la volée a l'aide d'une mémoire exécutable mmap en C et d'un code Assembleur.
Le problème est que... je n'ai qu'une boucle infinie O.o... pas même un signal du type SIGSEGV ou une exception...
J'ai beau lire toutes les docs trouvables du web, je reste bloqué... quelque chose semble m'échapper...
Le main.c
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <sys/mman.h> #include <string.h> char shellcode[] = "\x31\xc0" "\x31\xdb" "\x31\xc9" "\x31\xd2" "\xeb\x0f" "\xb0\x04" "\xb3\x01" "\x59" "\xb2\x0d" "\xcd\x80" "\xb0\x01" "\x31\xdb" "\xcd\x80" "\xe8\xec\xff\xff\xff" "\x48\x65\x6c\x6c\x6f" "\x20\x77\x6f\x72\x6c" "\x64\x21\x0a"; char *exec; int main() { exec = (char *)mmap(NULL, 1024, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0); memcpy(exec, shellcode, strlen(shellcode)); (*(void(*)())exec)(); return (0); }
Le hello.asm
La compilation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 bits 32 section .text global _start _start: xor eax, eax xor ebx, ebx xor ecx, ecx xor edx, edx jmp helloworld_string helloworld_shellcode_next: mov al, 4 mov bl, 1 pop ecx mov dl, 13 int 0x80 mov al, 1 xor ebx, ebx int 0x80 helloworld_string: call helloworld_shellcode_next db `Hello world!\n`
Le objdump -d hello :gcc -o main main.c
nasm -f elf64 hello.asm
ld -s hello.o -o hello
Le strace ./main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 hello2: file format elf64-x86-64 Disassembly of section .text: 0000000000400080 <.text>: 400080: 31 c0 xor %eax,%eax 400082: 31 db xor %ebx,%ebx 400084: 31 c9 xor %ecx,%ecx 400086: 31 d2 xor %edx,%edx 400088: eb 0f jmp 0x400099 40008a: b0 04 mov $0x4,%al 40008c: b3 01 mov $0x1,%bl 40008e: 59 pop %rcx 40008f: b2 0d mov $0xd,%dl 400091: cd 80 int $0x80 400093: b0 01 mov $0x1,%al 400095: 31 db xor %ebx,%ebx 400097: cd 80 int $0x80 400099: e8 ec ff ff ff callq 0x40008a 40009e: 48 rex.W 40009f: 65 gs 4000a0: 6c insb (%dx),%es:(%rdi) 4000a1: 6c insb (%dx),%es:(%rdi) 4000a2: 6f outsl %ds:(%rsi),(%dx) 4000a3: 20 77 6f and %dh,0x6f(%rdi) 4000a6: 72 6c jb 0x400114 4000a8: 64 21 0a and %ecx,%fs:(%rdx)
brk(0) = 0x123e000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc7b49dc000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=137143, ...}) = 0
mmap(NULL, 137143, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc7b49ba000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\37\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1840928, ...}) = 0
mmap(NULL, 3949248, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fc7b43f7000
mprotect(0x7fc7b45b2000, 2093056, PROT_NONE) = 0
mmap(0x7fc7b47b1000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ba000) = 0x7fc7b47b1000
mmap(0x7fc7b47b7000, 17088, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fc7b47b7000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc7b49b9000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc7b49b7000
arch_prctl(ARCH_SET_FS, 0x7fc7b49b7740) = 0
mprotect(0x7fc7b47b1000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ) = 0
mprotect(0x7fc7b49de000, 4096, PROT_READ) = 0
munmap(0x7fc7b49ba000, 137143) = 0
mmap(NULL, 1024, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc7b49db000
stat("1\3001\3331\3111\322\353\17\260\4\263\1Y\262\r\315\200\260\0011\333\315\200\350\354\377\377\377Hello world!\n", 0x601060) = -1 EFAULT (Bad address)
syscall_3221225217(0x7fc7b49db000, 0x601060, 0xd, 0, 0, 0) = -1 (errno 38)
syscall_3221225220(0x7fc7b49db000, 0x601060, 0xd, 0, 0, 0) = -1 (errno 38)
syscall_3221225217(0x7fc7b49db000, 0x601060, 0xd, 0, 0, 0) = -1 (errno 38)
syscall_3221225220(0x7fc7b49db000, 0x601060, 0xd, 0, 0, 0) = -1 (errno 38)
(boucle a l'infini)
Partager