xctf_攻防世界 level2 | wp

monkey

  • 本题是一个 c 语言框架的 js执行
  • 查看wp的得到提示
    • 这个 框架内置函数有 os.system(); 所以直接执行shell即可
  • 注意点:
    • 看到不熟悉的复杂代码,要查看是否有官方文档

pwn1

  • x64 elf | full Relro , stack canary , nx
  • 功能分析:
    • store | 输入函数 ,有栈溢出 ,只可以覆盖到ret地址 ,且无结尾符,可配合leak
    • get | 输出函数 ,可以输出栈上字符串
  • 利用流程:
      1. leak canary | 绕过 stack canary
      1. 覆盖到ebp , leak main函数的返回地址 , 得到 __libc_start_main + 240 的地址
      1. 覆盖ret | 因为只能覆盖ret地址,所以需要使用 one gadget (用 __libc_start_main 计算相对偏移得出)

exp


babyfengshui

  • x86 elf | stack canary , nx
  • 功能分析:
    • 菜单
    • add
      • 分配两个chunk , 指定大小的 desc chunk和 存储desc地址及name字符串的 user chunk
      • 读入 name | 0xfc
      • 使用 edit 读入desc
    • delete
      • free *heaparray[desc] | desc
      • free heaparray[desc] | user
      • heaparray[desc] = null
    • show
      • 输出指定 index 的 name 和 desc
    • edit
      • 输入长度 size | 判断 desc + size < name
        • 即 desc 输入可到达的地址要在对应的 user chunk 之前 | 目的 防止堆溢出
      • 进行size长度的输入
  • 利用过程:
    • 通过控制堆块布局,使我们可以溢出来控制其他堆块的内容


      image.png
    • 覆盖 desc地址为 free@got 从而leak libc
    • 覆盖 free 为 system , 执行delete getshell.

exp


stack2

  • x86 elf | stack canary , nx
  • 功能分析
    • 计算器
    • 数字的增删改查
  • 漏洞点
    - 最开始初始化时 未将 总数字量限定在 100内 , 配合 scanf 的 “+”输入 , 可以leak栈地址
    - 修改 数字时 输入的index未检查,可以越界 ,造成栈溢出
  • 利用过程
    - 坑点 : hackhere 函数远程不成功 , 无/bin/bash
    - 思路1 : 利用 栈溢出配合scanf ,向可写地址(如 bss 段)输入 /bin/sh\x00 或者 $0\x00 , 然后执行system("/bin/sh\x00")
    - 思路2 : 初始化时设置较大的总数字量 , leak栈地址 , 然后通过编辑函数在栈上输入 shell命令 ,然后通过栈溢出 执行system(command)

exp


time_formatter

  • x64 elf | stack canary , nx , fortify
  • 功能分析 :
    • 菜单(设置参数后命令执行)
    • 设置参数 格式化字符串
    • 设置参数 指定时间戳
    • 设置参数 时区
      - 未对已有 时区参数的情况做处理
    • 输出 命令执行结果
    • 退出 (可选择是否 退出)
      • 漏洞点 uaf
  • 利用过程:
    • 利用uaf 和 未对已有时区做处理的机制 ,在无限制的设置时区中来设置格式化字符串
      • 设置 格式化字符串 (malloc(n))
      • 设置时区 (malloc(n))
      • 退出 (选择否 , 目的是 free上面的两个块)
      • 设置时区(消耗时区 free的块)
      • 设置时区 (使用格式化字符串free的块)
    • tip:
        1. strdup 内部使用了 malloc
        1. 各个阶段设置的字符串最好长度一样且能满足getshell的需求

exp


forgot

  • x86 elf | nx
  • 功能 :
    - 1. 输入姓名
    - 2. 输入一个字符串 (可溢出 , 因为用scanf输入,只可构造一个地址)
    - 3. 进行 n 层检测 ,不通过即调用 第 n 个 输出函数 (输出函数地址存储在栈上)
  • 漏洞利用 :
    - 栈溢出覆盖一个 检测函数地址为后门地址
    - 触发指定的函数 , 从而获得flag

exp


4-ReeHY-main-100

  • x64 elf | nx
  • 功能:
    • 菜单
    • 对于 exp 的 增删改 , 没有直接给出有实际意义的show
  • 漏洞点:
    • 增删改过程中 , index 使用的时 Int类型 , 可使用负数index,来对size数组做操作,从而拓展成堆溢出,并进行深层次利用。
  • 利用过程
    • 覆盖size数组,来为堆溢出做准备
    • add 5 个 exp , 最后一个内容为 /bin/sh\x00 ( 作为 system的参数)
    • 配合堆溢出 使用unlink 来控制 exp数组内容
    • 将 free@got 的值 覆盖为 puts@plt+6 , 从而可以泄露
      • unlink_addr - 0x10 ( n => free@got => puts@got
      • unlink_addr - 0x10 ( n => unilnk_addr -0x18 => free@got ))
    • 泄露 puts 地址 , 并且根据此计算出 system地址
    • 覆盖 free@got 为 system
    • free(4) (system("/bin/sh\x00")) getshelll
  • 防御
    - 将 index 的类型设置为 unsigned int
  • 收获
    - 了解到了一种新的思路 ( 覆盖 got表 为 plt + 6)
    - 作用 : 执行对应函数,目前最大的理解为多出leak的手段

exp


Escape_From_Jail-50

  • 本题为 python 沙箱逃逸
    ,- 关键过滤 : '.' , import , flag 和 "eval" , "excute" 等命令执行 , 看题目源码中还过滤了 chr 等字符转换方法
  • 利用到的知识点:
    • getattr 可以获得 目标对象的指定方法对象 , 从而绕过 ’.‘号的过滤
      • 举例 : os.system("ls") (error) | getattr(os , "system")("ls") (success)
    • 通过通配符 绕过对flag字符串的过滤 | 此处 多种方法
  • 获取flag payload : getattr(os , "system")("cat /home/ctf/????")

pwn2

  • 有点瓜皮了,一开始莫名其妙钻进了死胡同,以为是 house of orange , 就折腾了几个小时。。。
  • 话说 有大佬用 house of orange 的思路做出来的话 , 想学习一波。。。。
  • 这道题目主要的利用点
      1. edit 函数的堆溢出
      1. Print 函数根据 size数组中对应的值 输出对应长度的字符串
      1. New 时读入 时读入size长度的内容,不以任何字符为截断符 (可以虽输入不可见字符,或者 \x00 \n , 但是要注意被覆盖的内容的作用)
  • 利用过程
      1. 利用堆溢出 实现 chunk over extend , 从而可以 print 出 下一个 chunk的内容
      1. 通过1 的点 配合一个 unsorted bin , 实现 unsorted bin leak , 从而得到 libc 信息
      1. 通过 1 的点, 修改 freed的 fastbin , 实现 fastbin attack , 从而覆盖 malloc_hook 为 one_gadget , (不覆盖 got 表 , 因为 Full Relro , 并且开启了 pie , 没有获取到 codebase)
      1. 调用 new 触发 one_gadget 从而 getshell

exp


AUL

  • 这道题目是一个 lua 的pwn , 考察 对lua的熟悉程度和理解。。。
  • 连上远程之后 , help 输出 一段字节码 ,是 server.luac 的 字节码 | 缺少头部一个字节
    • tip :
        1. luac 文件头 1b 4c 75 61
        1. luac 对于文件字节要求严格, 一个字节都不能少。。。
  • 漏洞点:
    • 虽然禁止了一部分关键词,但是仍然可以调用内部模块,函数 , 官方wp 的方法不够彻底,adworld 的 wp 中使用 os.execute 可以执行系统命令(包括 /bin/sh)

你可能感兴趣的:(xctf_攻防世界 level2 | wp)