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