2021 AntCTFxD3CTF PWN WriteUp
d3dev这里没有加monitor=/dev/null,所以可以直接通过CRTL_ALT_2进入控制台。
d3dev-revengeqemu逃逸
分析首先看一下启动脚本
123456789101112#!/bin/sh./qemu-system-x86_64 \-L pc-bios/ \-m 128M \-kernel vmlinuz \-initrd rootfs.img \-smp 1 \-append "root=/dev/ram rw console=ttyS0 oops=panic panic=1 nokaslr quiet" \-device d3dev \-netdev user,id=t0, -device e1000,netdev=t0,id=nic0 \-nographic \-monitor /dev/null
我们看到这里的device的名称是d3dev,ida看一下相关的函数,发现存在mmio/pmio两种方式,分别分析一下,首先看一下pmio_read
12345678910uint64_t __fastcall d3dev_pmio_ ...
CVE-2020-14364 QEMU 越界读写漏洞复现&分析
环境搭建创建usb设备
12qemu-img create -f raw usb.img 32Mmkfs.vfat usb.img
编译qemu
1234567git clone git://git.qemu-project.org/qemu.gitcd qemugit checkout tags/v4.2.1mkdir -p bin/debug/naivecd bin/debug/naive../../../configure --target-list=x86_64-softmmu --enable-debug --disable-werror --enable-spicemake
编译完成的二进制文件位于bin/debug/naive/x86_64-softmmu/qemu-system-x86_64,启动脚本如下
1234567891011qemu-system-x86_64 \ -m 1G -nographic \ -hda ./rootfs.img \ -kernel ./bzImage \ -append "console=ttyS0 ...
CVE-2019-6788-Qemu逃逸漏洞复现-分析
CVE-2019-6788是一个qemu的逃逸漏洞,本文参考xmzyshypnc和raycp的文章
环境搭建首先是创建qemu启动所用的文件系统,需要安装debootstrap,创建完成后的文件系统带有ssh,ssh/id_rsa为私钥。
12345678910111213141516171819202122232425262728293031323334353637mkdir qemusudo debootstrap --include=openssh-server,curl,tar,gcc,\libc6-dev,time,strace,sudo,less,psmisc,\selinux-utils,policycoreutils,checkpolicy,selinux-policy-default \stretch qemuset -eux # Set some defaults and enable promtless ssh to the machine for root.sudo sed -i '/^root/ { s/:x:/::/ } ...
2020 starCTF 部分pwn WriteUp
感谢xmzyshypnc 师傅手把手教学。
babyheap漏洞是一个UAF漏洞,程序实现了6个程序,add,delete,edit,show,leave_name,show_name,其中add函数限制了申请堆块的大小,delete函数中存在UAF漏洞,leave_name函数中申请了一个0x400大小的堆块。
因此这里首先申请4个0x20,fastbin,接着leave_name函数申请一个较大的堆块,使得fastbin堆块合并成0x80大小的small bin,这样就能泄漏出libc基址,由于edit的起始位置是+8开始的,因此再次申请的堆块大小需要覆盖三个fastbin,因此申请一个0x60大小的堆块。这样就可以满足覆写fd指针为free_hook-8和/bin/sh字符串两个要求。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 ...
Adobe漏洞CVE-2018-4490分析
漏洞描述CVE-2018-4490是Adobe在2018年5月修复的一个Adobe Reader DC的0 day漏洞(官方通告为Double Free漏洞,实际为任意地址释放),改漏洞配合Win32k提权漏洞CVE-2018-8120一起使用实现沙箱逃逸,实现任意代码执行。
受影响版本:Adobe Acrobat and Reader versions 2018.011.20038 and earlier, 2017.011.30079 and earlier, and 2015.006.30417 and earlier
环境搭建样本:HASH:bd23ad33accef14684d42c32769092a
Windows7 SP1 x86,Windbgx86
Adobe Acrobat Reader Pro DC 2018.011.20035,JP2Klib.lib版本为1.2.2.39492
这里在Windows7 SP1 X64,Windows10 2004中均可以进行调试,在Windows10中调试时需要注意内存地址0d0e0048可能被占用,需要在安全中心关闭 “验证堆完 ...
2020 ByteCTF 部分PWN WriteUp
gunGLIBC 2.31
程序实现了三个功能add,load,delete,其中add只能分配0x500一下的堆块,总共分配的堆块大小不超过0x1000,分配的基本单位是一个node,第一个值是buf,第二个值表示next_chunk,第三个值是flag。load是创建了一个全局的单项链表,通过node->next_chunk也就是+0x10的位置进行串联。在delete的时候未清空next_chunk的指针。通过delete,load,delete可以制造double free漏洞,并且在第二次delete的时候会泄露出地址。
但是由于2.31对tcache double free进行了检查,这个题目没有办法进行修改其keys,因此采用fastbin attack的方法来做。覆写__free_hook为magic gadget的值,该gadget的作用是将rdi转移到rdx中,并调用setcontext,我们找到下面的gadget
123mov rdx, qword ptr [rdi + 8]; mov qword ptr [rsp], rax; call qword ptr ...
逃逸初探
2020 TSCTF hellovirtual是一个虚拟化的题目,在2018 hitcon abyss改编的题目。这里给出了三个文件hellovirtual,hellokernel,hellousr,还给出了ld.so.2,libc.so.6。
hellovirtual是一个利用KVM api来做虚拟化的程序,它会加载一个小型的内核hellokernel,这个内核仅仅实现了内存管理和程序中断的功能,提供了loader启动和libc加载的一些syscall。然后解析ELF启动一个用户态的程序,这里直接使用的是ld.so.2来加载hellousr。hellousr是一个用户态的程序可以直接在主机上运行。执行流程就是用户态程序hellousr发生系统调用时,hellokernel对系统调用进行一些检查,将一些与IO相关的比如read,write通过I/O Prot(CPU in/out指令)交给hellovirtual处理。
分析virtual先来看virtual也就是kvm。先放出几个常用的结构体,和操作的十六进制值。
12345678910111213141516171819202122 ...
2020 zer0pts CTF 部分PWN WriteUp
babyof分析很容易发现程序中存在的漏洞,栈溢出,但是程序调用的外部函数仅有read,setbuf,exit这三个函数。此时如果想要泄露libc基址的话就需要覆写stdout结构体中的IO_write_ptr指针的低位为\x00即可,但是当我们更改指针低字节之后还是没有办法输出,因为函数没有任何的输出函数,因此就不会刷新stdout。
这里我们就需要强制缓冲区刷新,即调用_IO_OVERFLOW,这里存在一个exit函数,因此我们可以直接exit,函数会调用_IO_cleanup_all,刷新每一个文件结构体,这是我们就可以泄露出libc的基址,但是泄露地址之后程序就退出了,因此我们还需要修改vtable表中的__overflow指针为main函数地址,以继续执行程序,再次利用溢出修改返回地址getshell。
但是如果我们修改的是stdout的vtable的__overflow指针的话,我们的libc就无法泄露,注意到_IO_list_all的连接顺序为stderr,stdout_stdin,因此我们可以修改stderr的_IO_write_ptr的低字节和stdout的vtabl ...
2019 0CTF/TCTF Quals 部分PWN WriteUp
babyaegis首先我们看一下程序开启的防护机制
程序开启了ASAN,UBSAN保护。
ASANasan(AddressSanitizer)是google开源的一个用于进行内存检测的工具,可以检测常见的heap and stack BufferOverflow,global buffer overflow, UAF等
asan主要由两个部分构成,插桩和动态运行库,其中插桩主要是针对的是llvm编译器级别对访问内存的操作(store,load和alloca等),而动态运行库则主要提供一些比较复杂的操作,例如position/unposion(用于进行内存保护)和影子内存,同时hook free,malloc等函数。启用了asan保护的程序不同size大小的chunk是在不同内存区域进行分配的,并且free掉之后的内存在一段时间内并不会被启用。chunk也与一般的chunk不相同,其头部0x10字节大小的ChunkHeader用来存储chunk的一些信息。
12345678910111213141516171819struct ChunkHeader { // 1-st ...
高校战疫网络安全分享赛 WP
Babyhacker2分析首先我们看一下startvm.sh
有时间限制,并且开启了kalsr,smep,smap的保护。即内核不能访问用户空间的数据和代码,这个保护可以通过修改cr4寄存器来关闭。我们看一下虚拟机本身
1cpio -idmv < initramfs.cpio
首先是加载了babyhacker.ko的驱动,这里驱动开启了canary和NX保护。接着将dmesg_restrict/kptr_restrict置为0意味着我们可以通过cat kallsyms查看commit_creds/prepare_kernel_cred两个函数的地址。通过commit_creds(prepare_kernel_cred(0))调用来实现提权。
漏洞出现在0x30000的操作处
我们传入的rdx是一个signedint,因此我们可以通过输入负数来实现判断的绕过
绕过判断之后就可以将di即后两个字节赋值给buffersize。由于读取和写入的操作是通过buffersize来控制的,因此我们可以实现栈内容的泄露和栈溢出覆盖返回地址ROP。
利用
修改buffersize ...