monkey
- 本题是一个 c 语言框架的 js执行
- 查看wp的得到提示
- 这个 框架内置函数有 os.system(); 所以直接执行shell即可
- 注意点:
- 看到不熟悉的复杂代码,要查看是否有官方文档
pwn1
- x64 elf | full Relro , stack canary , nx
- 功能分析:
- store | 输入函数 ,有栈溢出 ,只可以覆盖到ret地址 ,且无结尾符,可配合leak
- get | 输出函数 ,可以输出栈上字符串
- 利用流程:
- leak canary | 绕过 stack canary
- 覆盖到ebp , leak main函数的返回地址 , 得到 __libc_start_main + 240 的地址
- 覆盖ret | 因为只能覆盖ret地址,所以需要使用 one gadget (用 __libc_start_main 计算相对偏移得出)
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长度的输入
- 输入长度 size | 判断 desc + size < name
- 利用过程:
-
通过控制堆块布局,使我们可以溢出来控制其他堆块的内容
- 覆盖 desc地址为 free@got 从而leak libc
- 覆盖 free 为 system , 执行delete getshell.
-
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)
time_formatter
- x64 elf | stack canary , nx , fortify
- 功能分析 :
- 菜单(设置参数后命令执行)
- 设置参数 格式化字符串
- 设置参数 指定时间戳
- 设置参数 时区
- 未对已有 时区参数的情况做处理 - 输出 命令执行结果
- 退出 (可选择是否 退出)
- 漏洞点 uaf
- 利用过程:
- 利用uaf 和 未对已有时区做处理的机制 ,在无限制的设置时区中来设置格式化字符串
- 设置 格式化字符串 (malloc(n))
- 设置时区 (malloc(n))
- 退出 (选择否 , 目的是 free上面的两个块)
- 设置时区(消耗时区 free的块)
- 设置时区 (使用格式化字符串free的块)
- tip:
- strdup 内部使用了 malloc
- 各个阶段设置的字符串最好长度一样且能满足getshell的需求
- 利用uaf 和 未对已有时区做处理的机制 ,在无限制的设置时区中来设置格式化字符串
forgot
- x86 elf | nx
- 功能 :
- 1. 输入姓名
- 2. 输入一个字符串 (可溢出 , 因为用scanf输入,只可构造一个地址)
- 3. 进行 n 层检测 ,不通过即调用 第 n 个 输出函数 (输出函数地址存储在栈上) - 漏洞利用 :
- 栈溢出覆盖一个 检测函数地址为后门地址
- 触发指定的函数 , 从而获得flag
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的手段
Escape_From_Jail-50
- 本题为 python 沙箱逃逸
,- 关键过滤 : '.' , import , flag 和 "eval" , "excute" 等命令执行 , 看题目源码中还过滤了 chr 等字符转换方法 - 利用到的知识点:
- getattr 可以获得 目标对象的指定方法对象 , 从而绕过 ’.‘号的过滤
- 举例 : os.system("ls") (error) | getattr(os , "system")("ls") (success)
- 通过通配符 绕过对flag字符串的过滤 | 此处 多种方法
- getattr 可以获得 目标对象的指定方法对象 , 从而绕过 ’.‘号的过滤
- 获取flag payload : getattr(os , "system")("cat /home/ctf/????")
pwn2
- 有点瓜皮了,一开始莫名其妙钻进了死胡同,以为是 house of orange , 就折腾了几个小时。。。
- 话说 有大佬用 house of orange 的思路做出来的话 , 想学习一波。。。。
- 这道题目主要的利用点
- edit 函数的堆溢出
- Print 函数根据 size数组中对应的值 输出对应长度的字符串
- New 时读入 时读入size长度的内容,不以任何字符为截断符 (可以虽输入不可见字符,或者 \x00 \n , 但是要注意被覆盖的内容的作用)
- 利用过程
- 利用堆溢出 实现 chunk over extend , 从而可以 print 出 下一个 chunk的内容
- 通过1 的点 配合一个 unsorted bin , 实现 unsorted bin leak , 从而得到 libc 信息
- 通过 1 的点, 修改 freed的 fastbin , 实现 fastbin attack , 从而覆盖 malloc_hook 为 one_gadget , (不覆盖 got 表 , 因为 Full Relro , 并且开启了 pie , 没有获取到 codebase)
- 调用 new 触发 one_gadget 从而 getshell
AUL
- 这道题目是一个 lua 的pwn , 考察 对lua的熟悉程度和理解。。。
- 连上远程之后 , help 输出 一段字节码 ,是 server.luac 的 字节码 | 缺少头部一个字节
- tip :
- luac 文件头 1b 4c 75 61
- luac 对于文件字节要求严格, 一个字节都不能少。。。
- tip :
- 漏洞点:
- 虽然禁止了一部分关键词,但是仍然可以调用内部模块,函数 , 官方wp 的方法不够彻底,adworld 的 wp 中使用 os.execute 可以执行系统命令(包括 /bin/sh)