2020网鼎杯部分Pwn题解

此处将会收录笔者力所能及的题解。
超出笔者技术水平的题目(例如kernel exploit)以及笔者因各种因素无法接触的题(例如bind pwn)将不会被收录。

1.青龙组

1. boom1

点击这里下载文件

1) 易知信息

  • 保护全开
  • ELF文件中rodata段上有大量字符串。将其中部分字符串百度一下(例如: duplicate global definition)便可得知,该程序为C语言解释器
  • 在程序main函数中,发现一串疑似可用的关键字/函数名。
    img
阅读更多...

heap - 14 - house漏洞

1. House Of Force

1) 介绍

以下部分介绍来自CTF wiki

  • House Of Force 产生的原因在于 glibc 对 top chunk 的处理。进行堆分配时,如果所有空闲的块都无法满足需求,那么就会从 top chunk 中分割出相应的大小作为堆块的空间。
  • 当使用 top chunk 分配堆块的 size 值是由用户控制的任意值时,我们就可以使得 top chunk指向我们期望的任何位置,这就相当于一次任意地址写。
  • 然而在 glibc 中,会对用户请求的大小和 top chunk 现有的 size 进行验证。
    • top chunk的大小必须足够大,否则申请一块超大内存时,程序会调用mmap而不是切割top chunk。
      这使得我们必须通过堆溢出,将top chunk的size改大。通常将其size改为-1
      因为有符号整数-1,刚好是最大的无符号整数。
    • malloc的大小必须小于-2*MINSIZE(在64位机器上为-0x40

      为什么? 请在heap相关宏定义中,查阅checked_request2size(req, sz)宏定义。

阅读更多...

BUUOJ 部分pwn题解

此处会收录笔者做题中遇到的一些有趣的题

被用于其他博客例题的题目将不会在此重复收录

1. inndy_rop

分析

  • 一个静态编译的简单栈溢出
  • 方法很多,可以用ROPgadget构建ROPchain,从而getshell。但该方法较为复杂
  • 也可以先调用mprotect,将data段的权限变为RWX,写入shellcode并执行。该方法较为简单
  • 可以使用pwntools里自带的ROP模块,事半功倍

mprotect函数,妙用多多

阅读更多...

SROP

1. 介绍

前面虽然做过一道关于SROP的题,但并没有具体总结。这次就来总结一下

  • SROP的原理? (下文摘自CTF wiki)

    • 内核向某个进程发送signal机制,该进程会被暂时挂起,进入内核态。
    • 内核会为该进程保存相应的上下文,主要是将所有寄存器压入栈中,以及压入signal信息,以及指向sigreturn的系统调用地址。我们称ucontext以及siginfo这一段为Signal Frame。需要注意的是,这一部分是在用户进程的地址空间的。之后会跳转到注册过的signal handler中处理相应的signal。因此,当signal handler执行完之后,就会执行sigreturn代码。
    • signal handler返回后,内核为执行sigreturn系统调用,为该进程恢复之前保存的上下文,其中包括将所有压入的寄存器,重新pop回对应的寄存器,最后恢复进程的执行。其中,32位的sigreturn的调用号为77,64位的系统调用号为15。
  • Signal Frame的构建是比较复杂的,因为不同架构下的结构是不一样的。不过值得一提的是,在目前的pwntools中已经集成了对于SROP的攻击。所以我们可以很方便的构建出Signal Frame。

注: 在本文中,Signal Frame和SigreturnFrame是同一个意思

阅读更多...

heap - 13 - off_by_one && __realloc_hook

1. off-by-one 介绍

  • off-by-one 漏洞是一种特殊的溢出漏洞,off-by-one 指程序向缓冲区中写入时,写入的字节数超过了这个缓冲区本身所申请的字节数并且 只越界了一个字节

  • off-by-one 是指单字节缓冲区溢出,这种漏洞的产生往往与边界验证不严和字符串操作有关
    例如以下代码:

    1
    2
    3
    4
    5
    6
    char* note = malloc(noteSize);
    char* input = malloc(noteSize + 1);
    fgets(stdin, input, noteSize);
    // 注意下面两条代码
    if (strlen(input) <= noteSize>) // strlen计算字符串长度时不会加上'\0'
    strcpy(note, input); // 而strcpy会把'\0'一起复制过去,如此便多写入了一个字节('\0')
  • glibc中的内存管理机制ptmalloc 极度依赖 chunk的size成员,故off-by-one漏洞威力强大

  • 同时, 由于Linux 的堆管理机制 ptmalloc 验证的松散性, off-by-one 漏洞的利用难度不大

阅读更多...

heap - 12 - fastbin attack

利用Fastbin attack进行任意地址读写

1. 原理

  • fastbin attack 存在的原因在于 fastbin 是使用fast chunk的fd指针,即单链表来维护释放的堆块的
  • 并且由 fastbin 管理的 chunk 即使被释放,其 next_chunk 的 prev_inuse 位也不会被清空
  • 利用的条件是
    • 能够控制fast chunk的fd指针
    • 漏洞发生在fast chunk类型上

2. Arbitrary Alloc

1) 介绍

  • 如果我们更改fastbin链尾的fast chunk fd指针为我们的目的地址
    则在几次malloc后,fastbin指针就会指向我们的目的地址
    下一次malloc fast_chunk就会取得目的地址的指针,然后就可以进行读写了(操作取决于程序)

阅读更多...

heap - 11 - malloc_consolidate 源码及其部分分析

fast chunk的内存整合

1. 介绍

  • 看了之前关于malloc和free的相关源码

    1
    2
    if (have_fastchunks (av))
    malloc_consolidate (av);

    就算不看malloc_consolidate的源码,也猜得出来其功能
    该函数是对 fast chunk 进行内存整合

    但为什么该函数取名为malloc_consolidate呢?真误导人呀 :-(

  • 但即便如此,该函数还起到了一个堆的初始化作用

    感到奇怪? 看源码咯~

阅读更多...
  • Copyrights © 2020-2024 Kiprey
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~