Q1IQ's blog

Tags · PWN

Home

About

Archives

loading..
PWN

PKU GeekGame 混淆器whatapass 出题记录及题解

我为这届北京大学信息安全综合能力竞赛(PKU GeekGame)出了一道名为混淆器whatapass的题目,题目载体是LLVM Pass。 LLVM Pass 原本用于转换和优化 LLVM IR,因为可以处理IR,所以也可以用来做插桩和混淆等。Pass类二进制题目这两年在CTF比赛里越来越常见,网上的例题和教程也越来越多,这类题目两年前还算是压轴难题,而现在已经变成了某种意义上的常规题,所以这次比赛我选择了Pass这个载体来出这道题,对于新手来说无论是Pass技术本身还是Pass类的题目在网上都有一些教程可供参考和学习。 大多数Pass类题目是这样实现的:重写 runOnFunction,处理 IR 中具有特定名称的函数,这些函数会事先预留一些漏洞,比如后门、任意地址读写、数组越界读写、整数溢出等等。 最..

Read more
loading..
PWN

DEFCON-Qualifier-2022 smuggler's cove/constricted 题解

本文是对Defcon资格赛中 Pwn 方向两道题目的复现,分别是 smuggler’s cove 以及 constricted。难度相比以往的国内赛要稍高,但是同时也学习到了不少新的知识。以下为这两道题目的分析。 文章首发于先知社区,链接 https://xz.aliyun.com/t/11445 exp链接 https://github.com/Q1IQ/ctf/tree/master/defcon-qualifier-2022

Read more
loading..
PWN

v8 学习记录

基础知识v8是chrome浏览器的 JavaScript 引擎,是著名的 JIT(Just In Time) 引擎。在Chromium项目中起到至关重要的作用。作为一款jit引擎,其工作模式如下图所示: Parser是 JS 源代码的入口,接受javascript 源文件作为输入 Interpreter 负责从 Javascript AST 生成 bytecodes,同时也可以基于bytecode直接生成机器代码。在 V8 中该组件名为Ignition。 JIT Complier: Turbofan作为 V8 中的优化器,其作用是将字节码优化成为固定的机器代码。在优化过程中,V8 引入了SSA(静态单赋值)形式的中间代码简化编译器的优化算法,在其若干优化过程(PASS)中实现安全的 JIT 代码生成。..

Read more
loading..
PWN

Qemu逃逸学习记录

一篇学习笔记,大部分基础知识是摘抄加一点自己的理解。 PCI设备地址空间PCI设备都有一个配置空间(PCI Configuration Space),其记录了关于此设备的详细信息。大小为256字节,其中头部64字节是PCI标准规定的,当然并非所有的项都必须填充,位置是固定了,没有用到可以填充0。前16个字节的格式是一定的,包含头部的类型、设备的总类、设备的性质以及制造商等,格式如下: 比较关键的是其6个BAR(Base Address Registers),一个占4字节,共24字节,BAR记录了设备所需要的地址空间的类型,基址以及其他属性。BAR的格式如下: 设备可以申请两类地址空间,memory space和I/O space,它们用BAR的最后一位区别开来。 当BAR最后一位为0表示这是映射的me..

Read more
loading..
PWN

GeekPwn热身赛 2020 wp

playthenew久闻Tcache Stashing Unlink Attack大名一直不会,今日就着这题学习一下。 [Glibc中堆管理的变化][https://www.freebuf.com/articles/system/234219.html] 漏洞原理[Tcache Stashing Unlink Attack原理][https://blog.csdn.net/seaaseesa/article/details/105870247] Tcache Stashing Unlink Attack利用了calloc的分配特性,calloc不从tcache bin里取chunk,而是会遍历fastbin、small bin、large bin,如果在tcache bin里,对应的size的bin不为空,..

Read more
loading..
PWN

DefenitCTF 2020 wp

PWNerrorProgram漏洞分析这道题目的堆操作给了MALLOC、FREE、EDIT、VIEW,MALLOC只能分配[0x777,0x77777]的块,也就是只能操纵large bin,FREE和EDIT都可以随意UAF,VIEW没有限制。 题目给了假的栈溢出漏洞,程序会检查是否溢出并在溢出时exit退出。 给了假的格式化字符串漏洞,因为输入的字符串中不能出现%和$。 利用这道题目可以用今年四月份hatena提出的利用方式 house of husk,能够在有large bin UAF漏洞的情况下getshell。 https://ptr-yudai.hatenablog.com/entry/2020/04/02/111507 贴上学长大佬写的学习笔记:https://www.anquanke...

Read more
loading..
PWN

RCTF 2020 wp

bf1 程序分析题目是一个brainfuck的解释器,给的libc是2.27。brainfuck是一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种运算符构成,除了指令还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。 字符 含义 > 指针加一 < 指针减一 + 指针指向的字节的值加一 - 指针指向的字节的值减一 . 输出指针指向的单元内容(ASCII码) , 输入内容到指针指向的单元(ASCII码) [ 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处 ] 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处 题目逻辑是..

Read more
loading..
PWN

Linux kernel学习记录

本文是kernel调试的一点心得和总结。 kernel保护模式MMAP_MIN_ADDR : 不允许申请NULL地址 mmap(0,….) kptr_restrict: 查看内核函数地址 commit_creds和prepare_kernel_cred函数的地址都可以在 /proc/kallsyms 中查看(较老的内核版本中是 /proc/ksyms)。 一般情况下,/proc/kallsyms 的内容需要 root 权限才能查看 head -n 10 /proc/kallsyms grep commit_creds /proc/kallsyms grep prepare_kernel_cred /proc/kallsyms echo 0 > /proc/sys/kernel/k..

Read more
loading..
PWN

IOFILE题目小结

源码调试要下载源码得先把sources.list的deb-src开头的注释去掉,更新一下 sudo apt-get update sudo apt-get upgrade 下载源码 sudo apt-get source libc6-dev 会报这么一个错,但是不影响用,暂且不管。 W: Can't drop privileges for downloading as file 'glibc_2.23-0ubuntu11.dsc' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied) 在gdb里运行: directory ~/glibc/glibc-2...

Read more
loading..
PWN

vm Pwn题目小结

ez_op题目分析首先根据入口点找到main函数,一般入口点就是IDA里Export窗口的start函数。 可以看到上面main函数的逻辑是: 使用mallocinfo函数为操作数分配空间,为操作码分配空间。 读入操作码至buf中,并将其转换成整数形式保存在opcode中;操作数同理保存在oprand中 进入大循环loop函数,就是本题的虚拟机,后面详细讲解。 使用freeinfo函数释放分配的空间 loop函数就是虚拟机,主要逻辑是一个大循环,每次循环完成一个操作码对应的功能。那么怎么知道每个操作码对应什么功能呢,我觉得对我来说只能慢慢逆向+猜吧。这个题目的功能有save、load、push、pop、加减乘除,最后逆出来的效果就是下面这样: 漏洞点在于load和save都没有检查是否越界..

Read more
loading..
PWN

安洵杯 MIPS wp

题目题目链接 https://github.com/Q1IQ/ctf/blob/master/mips/pwn2 题目名字就叫做mips,肯定是mips架构的了。 $ file pwn2 pwn2: ELF 32-bit LSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, not stripped 直接运行程序会显示下面的信息。 所以首先是搭建环境,搭建环境的目标是: 能运行题目程序 能用python脚本和题目程序进行交互 能够调试题目程序 mips mip汇编知识: https://ray-cp.github.io/archivers/MIPS_Debug_Envir..

Read more
loading..
PWN

湖湘杯 wp

历时12h,两道pwn。比赛如何不评价,默默做题。 HackNote题目有add、delete、edit 啥保护也没开,有问题 edit里平白无故多算一次size,很有问题,可以构造off by 好几个 此外这题的难点还在于这题是静态编译的,shellcode不知道往哪写,我一开始找了几个静态的地方,等我想调用它的时候吧,内容就变了。反正后来就随便找到一40的size位就用上了,是IOFILE前面的地方。 from pwn import * context.log_level = 'debug' context(arch = 'amd64', os = 'linux') shellcode=asm(shellcraft.sh()) debug=1 if d..

Read more
loading..
PWN

how2heap学习小结

本文是自己的一点心得,没有特别地总结整理。 编译找了半天编译的方法,结果突然发现文件夹里有个Makefile,一键make就全编译了,我觉得我就是个憨憨。 first_fitchar* a = malloc(512); 经过对齐后 chunk size 为 0x210 free(a); 后块a被放到 unsorted_bins 中 执行 c = malloc(500); (500+8)经过16字节对齐后 chunk size 为 0x200 ,此时small bins是空的,就从unsorted bins中找,找到了大小为0x210的块a。而0x210 的块切割后剩下的块大小为0x10,小于MINSIZE(0x20),所以不切直接分配。 然后自己测试了一下 c = malloc(512-0x20+8)..

Read more
loading..
PWN

巅峰极客 ichunqiu wp

记录一下巅峰极客的两道pwn,比赛只出了第一道,第二道PWN是赛后复现的,感觉很值得一学,对理解IOFILE很有帮助。 Pwn题目分析保护全开,乍看add、delete、show、change全有 然而仔细一看这个change往块里读的是stream的内容 而stream是fopen("/dev/urandom", "r");得到的fd delete存在UAF add要求块数量<=0xF,大小>0x7F,块的地址必须在[heapbase,heapbase+0x600] show,没什么特别的 利用 泄露libc和heap base 构造overlap改top的size,利用house_of_force在堆基地址分配块,改stream的内容 改st..

Read more
loading..
PWN

RoarCTF wp

realloc_magic一共三个功能 realloc。realloc 0可以达到free+清零的效果。 free。存在UAF,可以realloc已经free的内存。 backdoor。功能是清零,只能用一次。 overlap tcache 的方法是free块8次,就可以把这一块放到unsorted bin里,把块分为A|B,A和B得不一样大,realloc(A.size)得到A,realloc(0)把A放到tcache里,realloc(B.size)得到B,realloc(0)把B放到tcache里,realloc(A+B的size)改B的size和fd,realloc(B.size),realloc(0),再realloc(B.size)就可以得到fd所在的内存。 通过以上overlap的方法改..

Read more
loading..
PWN

heap overlap方法小结

本文不考虑和top合并, 并且大小非fastbin。实际做题的时候得要考虑top。 free时overlappoison_null_byteP(P是size被null的块)|Q 需要构造的点: 1. chunksize(P) == prev_size (next_chunk(P)) //因为offbyone后的size一定<=原始size,所以prev_size (next_chunk(P)) 可以自己伪造 2.free(P)后分割P为块A和B A|B,此时Q的pre_inuse也为0了 3.free A,free Q,A和Q会 consolidate, B就被overlap了 注意 free 的时候 - 检查前一个chunk空闲吗(检查本块的prev_inuse) - 检查后一个是不是top chu..

Read more
loading..
PWN

xman wp

weapon_store三个功能:view、buy、checkout view,有点想吐槽,你一个卖武器的,价目表居然跟实际价格不一样。。下面的buy功能可以看到实际价格计算方法是100 * (v3 + 1) - 29,也就是说武器1卖171,武器2卖271。371。471。。。。 buy,先计算买的武器单价*数量是不是超过了手里的money,没超过就放到购物车里,但可以通过整数溢出绕过这个限制;另外可以看到malloc的时候还和0x1ff与了一下,可能有堆溢出。 checkout,当手里的money少于买下所有武器要花的钱时,就给你一次堆溢出的机会,这时可以把其他武器的name改换为flag输出。 输入选项的地方看起来可以泄露点什么出来 但这个地方存放的是两个栈里的值,一个text段的值,也得不到..

Read more
loading..
PWN

ByteCtf note_five 两种解法

阅读大佬的wp后复现了一下本题的多种解法 题目分析 本题是一道菜单题,只有new、edit和delete功能,没有show功能。不存在UAF。 edit所用的输入函数存在Off-By-One漏洞 chunk 的大小限制在 0x8f ~ 0x400 解题思路1(exp见文末)利用Off-By-One漏洞构造Overlapping,构造块的bk 为global_max_fast -0x10, unsorted bin attack 修改global_max_fast;利用 stdout-0x51处的 0xff 作为 chunk 的 size,fast bin attack 到_IO_2_1_stdout_附近分配chunk,修改_IO_write_base中的值,使它指向想要泄露的地址(stdout+0..

Read more
loading..
PWN

pwnable wp

fdfd是文件描述符,fd=0为标准输入 ssize_t read(int fd,void *buf,size_t nbyte) read函数从fd中读取内容到buf。 col构造命令行参数 from pwn import * pwn_ssh = ssh(host='pwnable.kr',user='col',password='guest',port=2222) code = '\xE8\x05\xD9\x1D'+'\x01'*16 cn = pwn_ssh.process(argv=['col',code],executable='./col') print(cn.recv()) b..

Read more