Blog de Eliseo Ortiz Valdez
Entradas etiquetadas con shellcode
Trucos de compilación con GCC Parte I
19 Oct
En un post anterior mostramos como obtener el bytecode a partir de un código en C.
Ahora mostraremos diversas cualidades de GCC que explotaremos para generar el código máquina, código objeto y código ejecutable.
El programa que se utilizaré para los fines prácticos es el siguiente, que llamaremos shellcode.c:
#include int main(void){ char *arg[2]; arg[0] = "/bin/sh"; arg[1] = NULL; execve("/bin/sh", arg, NULL); } |
Para compilar el código anterior basta con realizar lo siguiente:
$gcc -o shellcode -ggdb -static shellcode.c
La bandera -ggdb produce información de depuración usada por GDB.
Si deseamos el código ensamblador ejecutamos las siguientes directrices con gcc:
$gcc -S -o shellcode.s shellcode.c
Para obtener el “código binario” a partir del código ensamblador:
Para caso de FreeBSD:
$nasm -f aoutb shellcode.asm
Para el caso de linux:
$nasm -f elf shellcode.asm
Para el caso de Mac OS X:
$as -o shellcode.o shellcode.s
Del código binario a código ejecutable:
Para el caso de linux:
$ld -s -o shellcode shellcode.o
Para el caso de Mac OS X:
$gcc -o shellcode shellcode.o
Para observar el código máquina y ensamblador de un ejecutable:
$objdump -d shellcode
Para el caso de Mac OS X será necesario tener instalado binutils, si este no se encuentra instalado,
es posible utilizar darwin port para esto, ejecutando lo siguiente:
$sudo port install binutils
A continuación la salida del comando anterior ejecutado:
shellcode: file format elf32-i386 Disassembly of section .init: 08048250 <_init>: 8048250: 55 push %ebp 8048251: 89 e5 mov %esp,%ebp 8048253: 83 ec 08 sub $0x8,%esp 8048256: e8 79 00 00 00 call 80482d4 804825b: e8 00 01 00 00 call 8048360 8048260: e8 eb 01 00 00 call 8048450 <__do_global_ctors_aux> 8048265: c9 leave 8048266: c3 ret Disassembly of section .plt: 08048268 <__gmon_start__@plt-0x10>: 8048268: ff 35 90 95 04 08 pushl 0x8049590 804826e: ff 25 94 95 04 08 jmp *0x8049594 8048274: 00 00 add %al,(%eax) ... 08048278 <__gmon_start__@plt>: 8048278: ff 25 98 95 04 08 jmp *0x8049598 04827e: 68 00 00 00 00 push $0x0 8048283: e9 e0 ff ff ff jmp 8048268 <_init+0x18> 08048288 <__libc_start_main@plt>: 8048288: ff 25 9c 95 04 08 jmp *0x804959c 804828e: 68 08 00 00 00 push $0x8 8048293: e9 d0 ff ff ff jmp 8048268 <_init+0x18> 08048298 : 8048298: ff 25 a0 95 04 08 jmp *0x80495a0 804829e: 68 10 00 00 00 push $0x10 80482a3: e9 c0 ff ff ff jmp 8048268 <_init+0x18> Disassembly of section .text: 080482b0 <_start>: 80482b0: 31 ed xor %ebp,%ebp 80482b2: 5e pop %esi 80482b3: 89 e1 mov %esp,%ecx 80482b5: 83 e4 f0 and $0xfffffff0,%esp 80482b8: 50 push %eax 80482b9: 54 push %esp 80482ba: 52 push %edx 80482bb: 68 d0 83 04 08 push $0x80483d0 80482c0: 68 e0 83 04 08 push $0x80483e0 80482c5: 51 push %ecx 80482c6: 56 push %esi 80482c7: 68 84 83 04 08 push $0x8048384 80482cc: e8 b7 ff ff ff call 8048288 <__libc_start_main@plt> 80482d1: f4 hlt 80482d2: 90 nop 80482d3: 90 nop 080482d4 : 80482d4: 55 push %ebp 80482d5: 89 e5 mov %esp,%ebp 80482d7: 53 push %ebx 80482d8: 83 ec 04 sub $0x4,%esp 80482db: e8 00 00 00 00 call 80482e0 80482e0: 5b pop %ebx 80482e1: 81 c3 ac 12 00 00 add $0x12ac,%ebx 80482e7: 8b 93 fc ff ff ff mov 0xfffffffc(%ebx),%edx 80482ed: 85 d2 test %edx,%edx 80482ef: 74 05 je 80482f6 80482f1: e8 82 ff ff ff call 8048278 <__gmon_start__@plt> 80482f6: 58 pop %eax 80482f7: 5b pop %ebx 80482f8: c9 leave 80482f9: c3 ret 80482fa: 90 nop 80482fb: 90 nop 80482fc: 90 nop 80482fd: 90 nop 80482fe: 90 nop 80482ff: 90 nop 08048300 <__do_global_dtors_aux>: 8048300: 55 push %ebp 8048301: 89 e5 mov %esp,%ebp 8048303: 53 push %ebx 8048304: 83 ec 04 sub $0x4,%esp 8048307: 80 3d ac 95 04 08 00 cmpb $0x0,0x80495ac 804830e: 75 3f jne 804834f <__do_global_dtors_aux+0x4f> 8048310: b8 b8 94 04 08 mov $0x80494b8,%eax 8048315: 2d b4 94 04 08 sub $0x80494b4,%eax 804831a: c1 f8 02 sar $0x2,%eax 804831d: 8d 58 ff lea 0xffffffff(%eax),%ebx 8048320: a1 a8 95 04 08 mov 0x80495a8,%eax 8048325: 39 c3 cmp %eax,%ebx 8048327: 76 1f jbe 8048348 <__do_global_dtors_aux+0x48> 8048329: 8d b4 26 00 00 00 00 lea 0x0(%esi),%esi 8048330: 83 c0 01 add $0x1,%eax 8048333: a3 a8 95 04 08 mov %eax,0x80495a8 8048338: ff 14 85 b4 94 04 08 call *0x80494b4(,%eax,4) 804833f: a1 a8 95 04 08 mov 0x80495a8,%eax 8048344: 39 c3 cmp %eax,%ebx 8048346: 77 e8 ja 8048330 <__do_global_dtors_aux+0x30> 8048348: c6 05 ac 95 04 08 01 movb $0x1,0x80495ac 804834f: 83 c4 04 add $0x4,%esp 8048352: 5b pop %ebx 8048353: 5d pop %ebp 8048354: c3 ret 8048355: 8d 74 26 00 lea 0x0(%esi),%esi 8048359: 8d bc 27 00 00 00 00 lea 0x0(%edi),%edi 08048360 : 8048360: 55 push %ebp 8048361: 89 e5 mov %esp,%ebp 8048363: 83 ec 08 sub $0x8,%esp 8048366: a1 bc 94 04 08 mov 0x80494bc,%eax 804836b: 85 c0 test %eax,%eax 804836d: 74 12 je 8048381 804836f: b8 00 00 00 00 mov $0x0,%eax 8048374: 85 c0 test %eax,%eax 8048376: 74 09 je 8048381 8048378: c7 04 24 bc 94 04 08 movl $0x80494bc,(%esp) 804837f: ff d0 call *%eax 8048381: c9 leave 8048382: c3 ret 8048383: 90 nop 08048384 : 8048384: 8d 4c 24 04 lea 0x4(%esp),%ecx 8048388: 83 e4 f0 and $0xfffffff0,%esp 804838b: ff 71 fc pushl 0xfffffffc(%ecx) 804838e: 55 push %ebp 804838f: 89 e5 mov %esp,%ebp 8048391: 51 push %ecx 8048392: 83 ec 24 sub $0x24,%esp 8048395: c7 45 f4 a0 84 04 08 movl $0x80484a0,0xfffffff4(%ebp) 804839c: c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp) 80483a3: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) 80483aa: 00 80483ab: 8d 45 f4 lea 0xfffffff4(%ebp),%eax 80483ae: 89 44 24 04 mov %eax,0x4(%esp) 80483b2: c7 04 24 a0 84 04 08 movl $0x80484a0,(%esp) 80483b9: e8 da fe ff ff call 8048298 80483be: 83 c4 24 add $0x24,%esp 80483c1: 59 pop %ecx 80483c2: 5d pop %ebp 80483c3: 8d 61 fc lea 0xfffffffc(%ecx),%esp 80483c6: c3 ret 80483c7: 90 nop 80483c8: 90 nop 80483c9: 90 nop 80483ca: 90 nop 80483cb: 90 nop 80483cc: 90 nop 80483cd: 90 nop 80483ce: 90 nop 80483cf: 90 nop .... |
Fuentes:
http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/
http://developer.apple.com/mac/library/documentation/DeveloperTools/Reference/Assembler/000-Introduction/introduction.html