Ingenieria Inversa Basica en Linux

 "Toda la información proporcionada son para fines educativos.En ningún caso alguno se hace responsable de cualquier mal uso de la información.Toda la información son para el desarrollo de la Hacker Defensa entre los usuarios y ayudar a prevenir los ataques de hackers. GSICR insiste en que esta información NO debe ser utilizada para causar ningún tipo de daño, directa o indirectamente"

 Ingeniería Inversa Basica en Linux


Buenas, aqui comentando James Jara, estaba viendo la tarea de ing. inversa de los estudiantes de la UCR, y se ve .. mm interesante! :)

http://orifaz.ecci.ucr.ac.cr:1220/scoreboard/

Básicamente es un programa el cual tiene 6 niveles y uno mas escondido, por cada falla hace un BOOM noo es un bOOm code, boom de explosión..

Básicamente se crea un archivo con oraciones por linea \N ,  cada linea es la solución a una fase, estas  lineas las deben encontrar aplicando ingenieria inversa al archivo binario.. si una linea es incorrecta hace boom , envia el punto menos y detiene el programa.

Paso a paso:

1) Snifeando el trafico:   

Utilizando TCPDUMP o TSHARK
tshark tcp -V -R > dump1
Data (146 bytes)

0000  47 45 54 20 2f 63 69 31 32 32 30 2f 73 75 62 6d   GET /ci1220/subm
0010  69 74 72 2ggggggggggg5 73 65-----------------3d 31   itr.pl/?userid=1
0020  31 34 35 30 30 30 30 30 26 6c 61 62 3d 62 6f 6d   100&lab=bom
0030  62 6c 61 62 26 72 65 73 75 6c 74 3xxxxxxxx2 25 33   blab&result=0000%3
0040  41 65 78 ------------------65 64 25 33 41 31 25 33 41   Aexploded%3A1%3A
0050  45 6c 2b 71 75 65 2b 7ssssssss 2b 76 61 2b 70 61 72   El+que+se+va+par
0060  61 2b 4c 69 6d 6f 6e 2b 70 69 65 72 64 65 2b 73   a+Limon+pierde+s
0070  75 2b 7-------------6f 26 73 75 62 6d 69 74 3d 73   u+sillo&submit=s
0080  75 62 6d 69 74 20 48 54 54 50 2f 31 2e 30 0d 0a   ubmit HTTP/1.0..
0090  0d 0a                                             ..
    Data: 474554202F6369313232302F7375626D6974722E706C2F3F...
    [Length: 146]

 2) Comando STRINGS

Recabar informacion de los strings es bastante util, esta es la razon por la cual hay que encriptar los programas.
strings bomb > strings.txt 
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
socket
fflush
strcpy
exit
sprintf
srand
fopen
__isoc99_sscanf
connect
signal
puts
time
stdin
strtol
fgets
__errno_location
read
stdout
memcpy
__ctype_b_loc
getenv
stderr
alarm
gethostbyname
bcopy
close
fprintf
sleep
__libc_start_main
write
GLIBC_2.3
GLIBC_2.1
GLIBC_2.7
GLIBC_2.0
PTRh
@[^_
gfff
UWVS
<[^_]
UWVS
Erro
r: C
lien
t un
able
 to
crea
"strings.txt" 317
Erro
r: D
NS i
s un
able
 to
reso
lve
F serv
F$er a
F(ddref
F,ss
 [^_
[^_]
%s: Error: No pude abrir %s
Uso: %s [<input_file>]
Hola, est
s ejecutando tu archivo con bombas.
Tienes que resolver 6 fases. Buena suerte!
Fase 1: desarmada. Vamos a la siguiente.
Fase 2: listos con esta fase. Si se pudo!! ...
Fase 3: Bien!!! Estamos a mitad del camino!
Fase 4: Esta fase estuvo interesante, a ver como te va en la siguiente.
Fase 5: Buen trabajo! Seguimos...
Fase 6: Parece que llegaste al final...
El que se va para Limon pierde su sillon.
Bravo! Has desarmado la fase sereta!
Crees que puedes detener la explosi
n con Ctrl-c?
Se ha generado un registro de esta bomba.
Pura vida, encontraste la fase secreta!
Pero encontrarla y resolverla son dos cosas diferentes...
Felicidades! Has desarmado todas las fases!
Se ha generado un registro de la soluci
n y ser
 verificada.
Bueno, pues...
 se puede. :-)
Fase inv
lida%s
Error de inicializaci
defused
exploded
ERROR: L
nea muy larga.
%d:%s:%d:%s

Morenita de ojos negros,
que me ten
s trastornado,
yo quisiera preguntarte
si mi amor has olvidado.
El amor del hombre pobre
es como el gallito enano;
en correr y no alcanzar
se la pasa todo el a
No me gusta la cebolla
y menos la remolacha;
yo no vengo por el tata
yo vengo por la muchacha.
Del cielo baj
 un pa
uelo
bordado de cinta negra;
decile a tu mamacita
que si quiere ser mi suegra.
En una linda ma
 cantar un jilguero,
y en su c
ntico dec
lo mucho que yo te quiero.
La cinta para ser cinta
que no tenga dos colores;
el hombre para ser hombre;
que no tenga dos amores.
Cuando pas
 por tu casa
metiraste un granito.
Y, porqu
 no me tiraste
mejor ... un rico besito?
Me cas
 con un torero
para aprender a torear;
y al padre de mi marido
fue el que tuve que sortear.
Ya la luna se ha perdido,
ya cant
 el alcarav
los que se quedan, se quedan
y los ques se van, se van.
Quisiera ser escalera
de

3)  Directorio proc

Entre muchas cosas, lista las posiciones de memoria en uso de x proceso por PID.
[root@lulzjames tmp]# /proc/9702/root/
bin/        etc/        lib64/      mnt/        root/       srv/        usr/
boot/       home/       lost+found/ opt/        sbin/       sys/        var/
dev/        lib/        media/      proc/       selinux/    tmp/

 4) Comando nm

Lista los simbolos , funciones locales , variables globales y sus direcciones de un objecto binario
 nm bomb > nm.txt

0804c414 d _DYNAMIC
0804c500 d _GLOBAL_OFFSET_TABLE_
0804a0a4 R _IO_stdin_used
         w _ITM_deregisterTMCloneTable
         w _ITM_registerTMCloneTable
         w _Jv_RegisterClasses
0804b404 r __FRAME_END__
0804c410 d __JCR_END__
0804c410 d __JCR_LIST__
0804cd30 D __TMC_END__
0804cd30 A __bss_start
         U __ctype_b_loc@@GLIBC_2.3
0804c5a0 D __data_start
08048990 t __do_global_dtors_aux
0804c40c t __do_global_dtors_aux_fini_array_entry
0804a0a8 R __dso_handle
         U __errno_location@@GLIBC_2.0
0804c408 t __frame_dummy_init_array_entry
         w __gmon_start__
0804c40c t __init_array_end
0804c408 t __init_array_start
         U __isoc99_sscanf@@GLIBC_2.7
0804a080 T __libc_csu_fini
0804a010 T __libc_csu_init
         U __libc_start_main@@GLIBC_2.0
08048914 T __x86.get_pc_thunk.bx
0804cd30 A _edata
0804d410 A _end
0804a084 T _fini
0804a0a0 R _fp_hw
080486d4 T _init
080488f0 T _start
         U alarm@@GLIBC_2.0
0804a2e0 r array.2788
         U bcopy@@GLIBC_
080489b0 t frame_dummy
08048e6a T fun7
08048c6f T func4
         U getenv@@GLIBC_2.0
         U gethostbyname@@GLIBC_2.0
0804cae0 D host_table
0804cd6c B infile
08049da4 T init_driver
08049d6d T init_timeout
08049028 T initialize_bomb
0804908d T initialize_bomb_solve
0804cd80 B input_strings
08048f78 T invalid_phase

080489dc T main
         U memcpy@@GLIBC_2.0
0804c5c0 D n1
0804c5cc D n21
0804c5d8 D n22
0804c5fc D n31
0804c5e4 D n32
0804c5f0 D n33
0804c608 D n34
0804c620 D n41
0804c644 D n42
0804c650 D n43
0804c638 D n44
0804c614 D n45
0804c65c D n46
0804c62c D n47
0804c668 D n48
0804c674 D node1
0804c680 D node2
0804c68c D node3
0804c698 D node4
0804c6a4 D node5
0804c6b0 D node6
0804cd68 B num_input_strings
08048b40 T phase_1
08048b64 T phase_2
08048bb1 T phase_3
08048ccc T phase_4
08048d2e T phase_5
08048d77 T phase_6

080493a3 T phase_defused
         U printf@@GLIBC_2.0
         U puts@@GLIBC_2.0
         U rand@@GLIBC_2.0
         U read@@GLIBC_2.0
08049247 T read_line
08049353 T read_six_numbers

5) Comando STRACE

strace ntercepta y registra las llamadas de sistema que son llamadas por un proceso y las señales que son recibidas por un proceso.

[root@xxxq tmp]# strace  -d ./bomb > strace.txt

pid 12381 stopped, [133]
) = 0xfffffffff7754000
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
mmap2(0xf7756000, 6216, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
) = 0xfffffffff7756000
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
close(4 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)                                = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
mprotect(0xf7754000, 4096, PROT_READ [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)   = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
mprotect(0xf775d000, 4096, PROT_READ [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)   = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
munmap(0xf776e000, 29278 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)               = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP [wait(0x857f) = 12381]
pid 12381 stopped, [133]
) = 4
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("72.14.179.5")}, 16 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
) = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
gettimeofday( [wait(0x857f) = 12381]
pid 12381 stopped, [133]
{1350795072, 491688}, NULL) = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
poll([{fd=4, events=POLLOUT}], 1, 0 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)    = 1 ([{fd=4, revents=POLLOUT}])
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
send(4, "\344\243\1\0\0\1\0\0\0\0\0\0\6orifaz\4ecci\3ucr\2ac\2"..., 39, MSG_NOSIGNAL [wait(0x857f) = 12381]
pid 12381 stopped, [133]
) = 39
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
poll([{fd=4, events=POLLIN}], 1, 5000 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)  = 1 ([{fd=4, revents=POLLIN}])
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
ioctl(4, FIONREAD [wait(0x857f) = 12381]
pid 12381 stopped, [133]
, [93])                = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
recvfrom(4,  [wait(0x857f) = 12381]
pid 12381 stopped, [133]
"\344\243\201\200\0\1\0\1\0\1\0\1\6orifaz\4ecci\3ucr\2ac\2"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("72.14.179.5")}, [16]) = 93
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
close(4 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
)                                = 0
 [wait(0x857f) = 12381]
pid 12381 stopped, [133]
connect(3, {sa_family=AF_INET, sin_port=htons(1221), sin_addr=inet_addr("163.178.104.110")}, 16^X


cleanup: looking at pid 12424
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0         1           execve
  -nan    0.000000           0         1           kill
  -nan    0.000000           0         1           geteuid
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                     3           total
System call usage summary for 32 bit mode:
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 53.21    0.000141          20         7           munmap
 46.79    0.000124          11        11           open
  0.00    0.000000           0        12           read
  0.00    0.000000           0        14           close
  0.00    0.000000           0         1           getpid
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         1           ioctl
  0.00    0.000000           0         1           gettimeofday
  0.00    0.000000           0         6           mprotect
  0.00    0.000000           0         2           poll
  0.00    0.000000           0         4           rt_sigaction
  0.00    0.000000           0        19           mmap2
  0.00    0.000000           0        11           fstat64
  0.00    0.000000           0         1           fcntl64
  0.00    0.000000           0         1           set_thread_area
  0.00    0.000000           0         4           socket
  0.00    0.000000           0         3         2 connect
  0.00    0.000000           0         1           send
  0.00    0.000000           0         1           recvfrom
------ ----------- ----------- --------- --------- ----------------
100.00    0.000265                   104         3 total
 

6) debuger gdb

Muy obvio no? :)

8) Comando objdump con -d

objdump muestra información de llamads,   Muestra los mnemónicos de ensamblador para las instrucciones de la máquina de fichobj. Esta opción sólo  desensambla aquellas secciones que se espera que contengan instrucciones. 
 [root@li9 tmp]# objdump -d ./bomb > objdump

./bomb:     file format elf32-i386


Disassembly of section .init:

080486d4 <_init>:
 80486d4:       53                      push   %ebx
 80486d5:       83 ec 08                sub    $0x8,%esp
 80486d8:       e8 37 02 00 00          call   8048914 <__x86.get_pc_thunk.bx>
 80486dd:       81 c3 23 3e 00 00       add    $0x3e23,%ebx
 80486e3:       8b 83 fc ff ff ff       mov    -0x4(%ebx),%eax
 80486e9:       85 c0                   test   %eax,%eax
 80486eb:       74 05                   je     80486f2 <_init+0x1e>
 80486ed:       e8 ee 00 00 00          call   80487e0 <__gmon_start__@plt>
 80486f2:       83 c4 08                add    $0x8,%esp
 80486f5:       5b                      pop    %ebx
 80486f6:       c3                      ret

Disassembly of section .plt:

08048700 <read@plt-0x10>:
 8048700:       ff 35 04 c5 04 08       pushl  0x804c504
 8048706:       ff 25 08 c5 04 08       jmp    *0x804c508
 804870c:       00 00                   add    %al,(%eax)
        ...

08048710 <read@plt>:
 8048710:       ff 25 0c c5 04 08       jmp    *0x804c50c
 8048716:       68 00 00 00 00          push   $0x0
 804871b:       e9 e0 ff ff ff          jmp    8048700 <_init+0x2c>

08048720 <printf@plt>:
 8048720:       ff 25 10 c5 04 08       jmp    *0x804c510
 8048726:       68 08 00 00 00          push   $0x8
 804872b:       e9 d0 ff ff ff          jmp    8048700 <_init+0x2c>

08048730 <fflush@plt>:
 8048730:       ff 25 14 c5 04 08       jmp    *0x804c514
 8048736:       68 10 00 00 00          push   $0x10
 804873b:       e9 c0 ff ff ff          jmp    8048700 <_init+0x2c>

08048740 <memcpy@plt>:
 8048740:       ff 25 18 c5 04 08       jmp    *0x804c518
 8048746:       68 18 00 00 00          push   $0x18
 804874b:       e9 b0 ff ff ff          jmp    8048700 <_init+0x2c>

08048750 <fgets@plt>:
 8048750:       ff 25 1c c5 04 08       jmp    *0x804c51c
 8048756:       68 20 00 00 00          push   $0x20
 804875b:       e9 a0 ff ff ff          jmp    8048700 <_init+0x2c>

9) Y hay muchos mas, pero tambien podemos utilizar soluciones de windows, las cuales no nos van a dar todo le trabajo pero si van a ayudar..

IDA , the interactive dissambler

 En informática, Interactive Disassembler (Desensamblador Interactivo), más conocido por su acrónimo IDA, es un desensamblador empleado para ingeniería inversa. Soporta una variedad de formatos ejecutables para diferentes procesadores y sistemas operativos. También puede ser usado como un depurador para executables Windows PE, Mac OS X, Mach-O y Linux ELF. Un plugin de decompilador para programas compilados con C/C++ está disponible a un costo extra. La última versión completa del IDA Pro es un software comercial; una versión anterior y menos capaz está disponible para descarga gratuita (la versión 5.0 de noviembre de 2010). wikipedia.

IDA the interactive dissambler


Bueno finalizando este tutorial es un poco basico sobre todo informativo, no es mi area favorita asi que no puedo aportar demasiada información mas que esta, la básica pero pueden intentar por aqui, ademas de encriptar y ofuscar el codigo luego aplicar estos pasos, y ver que les sale :D... , en fin muchas gracias por su lectura..

--JAMES JARA 
 Bueno gracias por su lectura, james jara costa rica
Autor: jamesjara.com @jamesjara

Comentarios

Entradas populares de este blog

Netcat & Wireshark

Día Internacional de la Seguridad Informática, 30 de noviembre 2013, Nicoya