Q1IQ's blog

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..
CVE

Linux eBPF模块漏洞利用学习记录

技术分析eBPF简介linux的用户层和内核层是隔离的,想让内核执行用户的代码,正常是需要编写内核模块,当然内核模块只能root用户才能加载。而BPF则相当于是内核给用户开的一个绿色通道:BPF(Berkeley Packet Filter)提供了一个用户和内核之间代码和数据传输的桥梁。用户可以用eBPF指令字节码的形式向内核输送代码,并通过事件(如往socket写数据)来触发内核执行用户提供的代码;同时以map(key,value)的形式来和内核共享数据,用户层向map中写数据,内核层从map中取数据,反之亦然。 BPF发展经历了2个阶段,cBPF(classic BPF)和eBPF(extend BPF)(linux内核3.15以后),cBPF已退出历史舞台,后文提到的BPF默认为eBPF。 eBPF..

Read more
loading..
AWD

awd pwn checker编写记录

最近在为awd pwn题写checker,然后我写了个能检测pwn题全部功能是否可以正常使用的脚本,被反馈还需要改进下: 不可以用pwntools库 不能让选手直接nop free,要不选手体验差 项目代码已开源:https://github.com/Q1IQ/AWD-PWN-Checker pwntools禁用对我这种fw pwn手来说,没了pwntools就是没了胳膊,干啥啥不行。不过对于checker来说,只要有网络通信功能就行,于是找到了一个平替,zio。 from zio import * is_local = True if is_local: io = zio('./buggy-server') # used for local pwni..

Read more
loading..
CVE

Linux 蓝牙漏洞学习记录

水一篇蓝牙CVE的分析文章,站在巨人的肩膀上。 漏洞分析Bleedingtooth2020年谷歌安全研究人员在Linux kernel中发现了多个蓝牙的安全漏洞,这些漏洞被称之为BleedingTooth。攻击者利用BleedingTooth 漏洞可以实现无用户交互的零点击攻击(zero-click attack)。包括CVE-2020-12351、CVE-2020-12352、CVE-2020-24490。 CVE-2020-12351位于net/bluetooth/l2cap_core.c,基于堆的类型混淆漏洞。在 l2cap_data_channel函数中,当使用的 CID 是 L2CAP_CID_A2MP 并且还没建立一个channel时 , a2mp_channel_create()..

Read more
loading..
AWD

awd pwn方向技巧小结

去年参加了不少线下赛,总结一些pwn方向打awd的小技巧,当作备忘。 打Patch拿到题目的第一步是备份,然后是看题找漏洞,找到漏洞的第一步是打patch把漏洞修好,然后再写利用。 一般打patch有两种方式,一是你把打好patch的二进制交给主办方,主办方帮你替换文件,打patch的字节数有一定限制,你不能大改特改或上通防,比如国赛、强网杯线下;二是自己scp把文件传过去,比如湖湘杯、上海大学生赛,我记得去年的湖湘杯是可以大改特改,上海赛会检查选手的服务器,改的太多会警告。 Patch方法很多,一般改动小的话我就用IDA直接修改,改动大的用LIEF。打完patch运行检查一下,要不部署上去服务直接down了得不偿失。 IDA IDA patch方法可以看我这篇 https://q1iq.top/IDA-..

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..
CVE

D-Link CVE-2019-7298学习记录

漏洞分析使用binwalk提取固件。 可以看出文件系统是 squashfs 。 内核启动之后将启动init进程,init进程启动时根据/etc/inittab这个文件来在不同运行级别启动相应的进程或执行相应的操作。其中sysinit代表系统的初始化,只有系统开机或重新启动的时候,后面对应的process才会执行。 ::sysinit:/etc/init.d/rcS 在rcS中,先执行一系列mkdir和设置,接着执行goahead。 goahead 是一个开源的 web 服务器,用户的定制性非常强。可以通过一些 goahead 的 api定义 url处理函数和可供 asp 文件中调用的函数,具体可以看看官方的代码示例和网上的一些教程。 goahead的websUrlHandlerDefine函数允许用户..

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..
TOOL

调试工具rr

收获新工具 rr,功能差不多就是在gdb上加一个倒放功能,网上一搜居然没有中文资料,所以记录一下。github地址:https://github.com/mozilla/rr 以下安装配置基于Ubuntu16.04,其余环境可以参考官方文档。 安装配置安装依赖环境: sudo apt-get install ccache cmake make g++-multilib gdb \ pkg-config coreutils python3-pexpect manpages-dev git \ ninja-build capnproto libcapnp-dev 下载rr编译: git clone https://github.com/mozilla/rr.git mkdir obj &&amp..

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
12