- 简介
- 一、基础知识篇
- 二、工具篇
- 三、分类专题篇
- 四、技巧篇
- 五、高级篇
- 六、题解篇
- 6.1 Pwn
- 6.1.1 pwn HCTF2016 brop
- 6.1.2 pwn NJCTF2017 pingme
- 6.1.3 pwn XDCTF2015 pwn200
- 6.1.4 pwn BackdoorCTF2017 Fun-Signals
- 6.1.5 pwn GreHackCTF2017 beerfighter
- 6.1.6 pwn DefconCTF2015 fuckup
- 6.1.7 pwn 0CTF2015 freenote
- 6.1.8 pwn DCTF2017 Flex
- 6.1.9 pwn RHme3 Exploitation
- 6.1.10 pwn 0CTF2017 BabyHeap2017
- 6.1.11 pwn 9447CTF2015 Search-Engine
- 6.1.12 pwn N1CTF2018 vote
- 6.1.13 pwn 34C3CTF2017 readme_revenge
- 6.1.14 pwn 32C3CTF2015 readme
- 6.1.15 pwn 34C3CTF2017 SimpleGC
- 6.1.16 pwn HITBCTF2017 1000levels
- 6.1.17 pwn SECCONCTF2016 jmper
- 6.1.18 pwn HITBCTF2017 Sentosa
- 6.1.19 pwn HITBCTF2018 gundam
- 6.1.20 pwn 33C3CTF2016 babyfengshui
- 6.1.21 pwn HITCONCTF2016 Secret_Holder
- 6.1.22 pwn HITCONCTF2016 Sleepy_Holder
- 6.1.23 pwn BCTF2016 bcloud
- 6.1.24 pwn HITCONCTF2016 HouseofOrange
- 6.1.25 pwn HCTF2017 babyprintf
- 6.1.26 pwn 34C3CTF2017 300
- 6.1.27 pwn SECCONCTF2016 tinypad
- 6.1.28 pwn ASISCTF2016 b00ks
- 6.1.29 pwn Insomni'hackteaserCTF2017 TheGreatEscapepart-3
- 6.1.30 pwn HITCONCTF2017 Ghostinthe_heap
- 6.1.31 pwn HITBCTF2018 mutepig
- 6.1.32 pwn SECCONCTF2017 vmnofun
- 6.1.33 pwn 34C3CTF2017 LFA
- 6.1.34 pwn N1CTF2018 memsafety
- 6.1.35 pwn 0CTF2018 heapstorm2
- 6.1.36 pwn NJCTF2017 messager
- 6.1.37 pwn sixstarctf2018 babystack
- 6.1.38 pwn HITCONCMT2017 pwn200
- 6.1.39 pwn BCTF2018 houseofAtum
- 6.1.40 pwn LCTF2016 pwn200
- 6.1.41 pwn PlaidCTF2015 PlaidDB
- 6.1.42 pwn hacklu2015 bookstore
- 6.1.43 pwn 0CTF2018 babyheap
- 6.1.44 pwn ASIS2017 start_hard
- 6.1.45 pwn LCTF2016 pwn100
- 6.2 Reverse
- 6.3 Web
- 6.1 Pwn
- 七、实战篇
- 7.1 CVE
- 7.1.1 CVE-2017-11543 tcpdump sliplink_print 栈溢出漏洞
- 7.1.2 CVE-2015-0235 glibc _nsshostnamedigitsdots 堆溢出漏洞
- 7.1.3 CVE-2016-4971 wget 任意文件上传漏洞
- 7.1.4 CVE-2017-13089 wget skipshortbody 栈溢出漏洞
- 7.1.5 CVE–2018-1000001 glibc realpath 缓冲区下溢漏洞
- 7.1.6 CVE-2017-9430 DNSTracer 栈溢出漏洞
- 7.1.7 CVE-2018-6323 GNU binutils elfobjectp 整型溢出漏洞
- 7.1.8 CVE-2010-2883 Adobe CoolType SING 表栈溢出漏洞
- 7.1.9 CVE-2010-3333 Microsoft Word RTF pFragments 栈溢出漏洞
- 7.1 CVE
- 八、学术篇
- 8.1 The Geometry of Innocent Flesh on the Bone: Return-into-libc without Function Calls (on the x86)
- 8.2 Return-Oriented Programming without Returns
- 8.3 Return-Oriented Rootkits: Bypassing Kernel Code Integrity Protection Mechanisms
- 8.4 ROPdefender: A Detection Tool to Defend Against Return-Oriented Programming Attacks
- 8.5 Data-Oriented Programming: On the Expressiveness of Non-Control Data Attacks
- 8.7 What Cannot Be Read, Cannot Be Leveraged? Revisiting Assumptions of JIT-ROP Defenses
- 8.9 Symbolic Execution for Software Testing: Three Decades Later
- 8.10 AEG: Automatic Exploit Generation
- 8.11 Address Space Layout Permutation (ASLP): Towards Fine-Grained Randomization of Commodity Software
- 8.13 New Frontiers of Reverse Engineering
- 8.14 Who Allocated My Memory? Detecting Custom Memory Allocators in C Binaries
- 8.21 Micro-Virtualization Memory Tracing to Detect and Prevent Spraying Attacks
- 8.22 Practical Memory Checking With Dr. Memory
- 8.23 Evaluating the Effectiveness of Current Anti-ROP Defenses
- 8.24 How to Make ASLR Win the Clone Wars: Runtime Re-Randomization
- 8.25 (State of) The Art of War: Offensive Techniques in Binary Analysis
- 8.26 Driller: Augmenting Fuzzing Through Selective Symbolic Execution
- 8.27 Firmalice - Automatic Detection of Authentication Bypass Vulnerabilities in Binary Firmware
- 8.28 Cross-Architecture Bug Search in Binary Executables
- 8.29 Dynamic Hooks: Hiding Control Flow Changes within Non-Control Data
- 8.30 Preventing brute force attacks against stack canary protection on networking servers
- 8.33 Under-Constrained Symbolic Execution: Correctness Checking for Real Code
- 8.34 Enhancing Symbolic Execution with Veritesting
- 8.38 TaintEraser: Protecting Sensitive Data Leaks Using Application-Level Taint Tracking
- 8.39 DART: Directed Automated Random Testing
- 8.40 EXE: Automatically Generating Inputs of Death
- 8.41 IntPatch: Automatically Fix Integer-Overflow-to-Buffer-Overflow Vulnerability at Compile-Time
- 8.42 Dynamic Taint Analysis for Automatic Detection, Analysis, and Signature Generation of Exploits on Commodity Software
- 8.43 DTA++: Dynamic Taint Analysis with Targeted Control-Flow Propagation
- 8.44 Superset Disassembly: Statically Rewriting x86 Binaries Without Heuristics
- 8.45 Ramblr: Making Reassembly Great Again
- 8.46 FreeGuard: A Faster Secure Heap Allocator
- 8.48 Reassembleable Disassembling
- 九、附录
2.1.2 QEMU
简介
qemu(https://qemu.org)是开源的纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备。当作为模拟器时的 qemu,可以在一种架构(如 x86 PC)下运行另一种架构(如 ARM)下的操作系统和程序,通过使用动态转换,它可以获得非常好的性能。作为虚拟机时,qemu 可以使用其他虚拟机管理程序(如 KVM)来使用 CPU 扩展进行虚拟化,通过在主机 CPU 上直接执行客户机代码来获得接近于宿主机的性能。
有时我们会遇到不同于 x86 或 x64 架构的可执行文件,而我们恰好没有调试运行环境的 ARM 和 MIPS 环境来说,使用 qemu 加载这类二进制文件是不错的选择。与其他的虚拟化软件(如 VMware)不同,qemu 不提供管理虚拟机的 GUI(运行虚拟机时出现的窗口除外),也不提供创建具有已保存设置的持久虚拟机的方法。因此,我们可以选择创建自定义脚本以启动虚拟机,这样就可以保存相应的参数,避免每次启动时手动指定所有运行参数。
安装
使用包管理器安装十分方便,在 Ubuntu 系统中只需要如下命令即可:
$ sudo apt install qemu
如果想要编译安装,则首先需要安装一些依赖文件,然后从官网下载源码,使用如下命令进行编译:
$ sudo apt install libcap-dev libpixman-1-dev libncurses5-dev libasound2-dev libasound2 libglib2.0-dev u-boot-tools flex
$ tar -xf qemu-3.1.0.tar.xz
$ mkdir qemu-3.1.0.build
$ cd qemu-3.1.0.build
$ ./../qemu-3.1.0/configure --target-list=arm-softmmu,aarch64-softmmu,mips-softmmu,mipsel-softmmu,i386-softmmu,x86_64-softmmu,arm-linux-user,aarch64-linux-user,i386-linux-user,x86_64-linux-user,mips-linux-user,mipsel-linux-user --audio-drv-list=alsa --enable-virtfs
$ make -j2 && sudo make install
模拟 Armhf 环境
首先介绍一下 armhf 架构。出于低功耗、封装限制等种种原因,以前的一些 ARM 处理器没有独立的硬件浮点运算单元,需要手写软件来实现浮点运算。随着技术发展,现在高端的 ARM 处理器基本都具备了硬件执行浮点操作的能力。这样,新旧两种架构之间的差异,就产生了两个不同的嵌入式应用程序二进制接口(EABI)——软浮点(soft float, sf)和矢量浮点(vector float point, vfp),但是软浮点和硬浮点(hard float, hf)之间有向前兼容却没有向后兼容的能力,即软浮点的二进制接口仍然可以用于当前的高端 ARM 处理器。
在 ARM 体系架构内核中,有些有浮点运算单元(floating point unit, fpu),而有些没有。对于没有 fpu 内核,是不能使用 armel 和 armhf 的。在有 fpu 的情况下,就可以通过 gcc 的选项 -mfloat-abi
来指定使用哪种,有如下三种值:
- soft:不用 fpu 计算;
- armel:(arm eabi little endian)也即 softfp,用 fpu 计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算;
- armhf:(arm hard float)也即 hard,用 fpu 计算,传参数用 fpu 中的浮点寄存器传,省去了转换性能最好,但是中断负荷高;
- arm64:64 位的 arm 默认就是 hard float 的,因此不需要 hf 的后缀。
想要交叉编译 arm 架构的可执行文件,我们首先需要安装交叉编译工具链:
$ sudo apt install linux-libc-dev-armhf-cross
$ sudo apt install libc6-armhf-cross libc6-dev-armhf-cross
$ sudo apt install binutils-arm-linux-gnueabihf
$ sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
工具链安装完成之后,就可以使用如下命令进行 armhf 架构的交叉编译了:
$ cat hello.c
#include<stdio.h>
int main(){
printf("%s","hello\n");
return 0;
}
$ arm-linux-gnueabihf-gcc -g hello.c -o hello_armhf -static
$ file hello_armhf
hello_armhf: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=8866e8f5d6ed85c9833c4bcadd1f64316cb082cd, not stripped
为了简便,我们可以选择使用 Debian 社区已经制作好的 qemu 镜像,选择 armhf 目录下载文件即可,地址为 https://people.debian.org/~aurel32/qemu。该系统镜像基于 Debian Wheezy 发行版制作而成,大小为 25Gb,内存使用 -m
参数控制为 128Mb 至 1024Mb,root 用户口令为 root,普通用户的用户名和口令均为 user。接下来启动虚拟机,如下所示:
$ qemu-system-arm -m 1024 -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress \
-initrd initrd.img-3.2.0-4-vexpress \
-drive if=sd,file=debian_wheezy_armhf_standard.qcow2 \
-append "root=/dev/mmcblk0p2"
# 或是
$ qemu-system-arm -m 1024 -M vexpress-a9 -kernel vmlinuz-3.2.0-4-vexpress \
-initrd initrd.img-3.2.0-4-vexpress \
-drive if=sd,file=debian_wheezy_armhf_desktop.qcow2 \
-append "root=/dev/mmcblk0p2"
至此,基于 qemu 的 armhf 架构的运行与调试环境就搭建完成了。
模拟 MIPS 环境
MIPS 架构也是一种精简指令集的处理器架构,由于其低功耗高性能的设计,同ARM架构类似,也在嵌入式系统中有着广泛的应用。接下来我们使用 qemu 模拟 MIPS 环境,在此之前,需要安装 MIPS 架构的交叉编译工具链:
$ sudo apt install linux-libc-dev-mips-cross
$ sudo apt install libc6-mips-cross libc6-dev-mips-cross
$ sudo apt install binutils-mips-linux-gnu
$ sudo apt install g++-mips-linux-gnu gcc-mips-linux-gnu
想要使用 qemu 运行 MIPS 架构的二进制可执行文件十分简单,使用如下的交叉编译命令编译后,输入以下命令就可以执行了:
# 使用交叉编译工具
$ mips-linux-gnu-gcc -g hello.c -o hello_mips -static
# 查看可执行程序的架构
$ file hello_mips
hello_mips: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=f6c75c00d4e66bc32aa99b6a6d781ca8e7bab939, not stripped
# 使用qemu模拟执行
$ qemu-mips hello_mips
hello
如果我们想要使用 qemu 模拟执行 MIPS 架构的可执行文件,并调试该可执行文件的话,可以使用如下命令启动 qemu-mips:
$ qemu-mips -g port binary_mips
-g
后的 port 参数指的是使用 gdb 远程连接的端口,之后的 binary_mips 指的是 MIPS 架构的可执行文件。接着,我们需要新开一个终端窗口并开启 gdb-multiarch 调试器,载入我们想要调试的文件,设置远程端口即可:
$ gdb-multiarch
gef➤ file binary_mips
Reading symbols from binary_mips...done.
gef➤ set architecture mips
The target architecture is assumed to be mips
gef➤ gef-remote -q 127.0.0.1:port
0x00400620 in __start ()
要想调试其他架构的可执行文件,可以使用 gef 开发者已经编译好的 gdb 和 gdbserver(https://github.com/hugsy/gdb-static),也可以使用如下命令编译符合该可执行文件架构的 gdb 或 gdbserver(此处以 mips 架构为例):
$ wget http://ftp.gnu.org/gnu/gdb/gdb-8.2.tar.xz
$ tar -xf gdb-8.2.tar.xz
$ mkdir gdb-8.2.mips.build && cd gdb-8.2.mips.build
# 此处注意修改自己的prefix路径
$ CC="mips-linux-gnu-gcc" CXX="mips-linux-gnu-g++" \
./../gdb-8.2/configure --target=mips-linux-gnu --host="mips-linux-gnu" \
--prefix=/home/ctf/Work/gdb-8.2.mips.build
# 我们还需要修改Makefile将gdb编译为静态链接的可执行文件
# 将LDFLAGS增加一个-static选项
$ vim Makefile
# line:383: LDFLAGS = -static
$ make && make install
# 查看编译好的gdb
$ file bin/gdb
gdb: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=79a32354f7e9e5e8cc021bb3e596b332f79e6fa9, not stripped
至此,MIPS 运行及调试环境就准备完成了。
参考资料
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论