2018 网鼎杯 | pwn wp

fgo

  • 漏洞点 :
    • delete 函数 uaf
  • 利用过程:
    • add(0x10) 两个组合 0x10(pointer) + 0x18(content)
    • del 0 -> del 1
    • add(0x8) , 0x10(pointer | chunk 1 pointer) + 0x10(content | chunk 0 pointer) ,从而可以 修改 chunk 0 的指针域为 secret 函数
    • 调用 print(0) , 从而触发后门函数

exp


GUESS

  • 流程分析:
    • 读入 flag 到栈上
    • 3轮 指定栈上字符串输入 , gets 输入造成溢出
    • 输入与 flag对比
  • 利用过程:
  • 该 题目 利用stack stamsh 的点进行指定地点的leak
    • tip : 这道题目需要用多次 stack smash进行leak , 能持续进行输入程序不崩溃的原因是 ,输入的函数是用fork启动的。
    1. leak , puts 函数地址,得到libc地址
    1. 根据 libc 地址计算出 libc["__environ"] 的地址 ,leak __environ 得到一个栈上的地址
    1. 根据2中的栈地址的相对偏移计算出flag地址, leak flag

exp


easyFMT

  • 功能分析
    • while True 的 字符串输入 , 然后输出 | 长度限制 0x64
  • 漏洞点: 格式化字符串
  • 利用方法:
      1. leak printf@got , 得到 printf 地址
      1. 计算得到 system 地址
      1. 修改 printf@got 的值 为 system
      1. 输入 /bin/sh getshell

exp


babyheap

  • 这道题目 考察了堆利用的技巧结合...
    • 学到了 unlink 的后向合并
    • 还利用到了 fastbin attack
  • 功能分析:
    • alloc :
      • 分配到指定index 一个 0x30 大小的chunk | malloc(0x20)
      • 并且进行 0x20 的输入
    • edit
      • 编辑指定 index 的 chunk , 做一个 0x20 的 输入
      • 最多 编辑3次
    • delete
      • free 指定 index 的 chunk | uaf
    • show
      • 输出 指定index的地址 上的值
  • 利用 过程
      1. 分配 6 个chunk , 做好 fastbin attack 和 unlink 的准备工作
      1. leak heap 地址
      1. 根据 heap 地址,edit(0) 构造条件,使用 fastbin attack 分配一个chunk到 堆上 , 将 uaf 拓展成 堆溢出
      1. 用堆溢出 修改 chunk 1 的 size 为 0xa1
      1. free chunk 1 | free 0xa1 大小的chunk 进行 unsorted bin leak , 并且进行 unlink (后向)
      1. 根据 libc 地址 计算出 one_gadget 地址
      1. edit(4) | 使用 unlink 覆盖 ptr[1] 为 __free_hook 地址 | Full Relro 不可修改got表
      1. edit(1) | 覆盖 __free_hook 为one_gadget

exp


blind

  • 这个题目 学到了 io_file 的利用 , 看来还是要再好好看看 io_file_plus 的结构体和相关调用。
  • 参考链接 : https://www.jianshu.com/p/f14adeda85df
  • 功能分析:
    • new | 分配一个 0x68 大小的chunk 到指定 index
    • change | 修改 指定 index 的 chunk 内容
    • release | free 指定 index 的 chunk | uaf 漏洞
  • 漏洞点:
    • uaf
      • 构成 fastbin attack
  • 利用过程:
      1. 利用 fastbin attack , 分配 chunk 到 0x60204d(stderr + 5 + 8) , 从而可以控制 ptr 数组
      1. 控制 ptr 数组为 &stdout , &bss+0x300 + 0x68 * n (n : 0 - 3)
      1. 布置 bss + 0x300 开始 为 fake_io_file 和 fake_vtable
      • 3.1 这次构造 发现可以布置除了 flag 和 vtable 之外的值全为 null , 但是还是要详细了解下原理。。。。
      • 3.2 如果设置其他值的 , io_read_* ,io_write_* 最好不要覆盖。
      • 3.3 可以把 fake_io_file 和 fake_vtable 布置在一起,但是需要主意 3.2 , 并且设置好 vtable的地址
      • 3.4 先布置好vtable 然后再修改 *stdout 为 &fake_io_file

exp 1 , 2 的区别是 fake_io_file 和 fake_vtable 是否分开
exp1
exp2

你可能感兴趣的:(2018 网鼎杯 | pwn wp)