二进制安全学习-0x00.介绍及pwn环境搭建

前言


考完研了,也算是一段奇妙的旅程。

已经上岸西电网信院,

昔日龌龊不足夸,今朝放荡思无涯。

研究生阶段想从web/渗透方向转向二进制(Bin)安全的研究。在我看来,web方向由C语言向上层发展,学习高级语言/web服务,越来越抽象,注重于逻辑。而二进制安全向下延展(汇编/OS/硬件),越来越具体,注重于底层实现。

二进制的分支:

  • Reverse:逆向工程

    注重于分析程序,获取一个程序/病毒,弄清楚它是怎么实现的/会做什么

  • Pwn:漏洞挖掘

    注重于攻击程序,控制程序进而让它执行更多功能/获取更多权限

我自己的学习方向是漏洞分析/挖掘利用,相对应的是CTF中pwn类型题目(描述对一个软件进行漏洞利用的过程),一般要求审计出程序中的漏洞,然后写出exp。和几个师傅聊过之后,个人计划不是按部就班的学,我一直都是个需求驱动学习的人,手里有活才有学习的动力。我想着边用OD调试边学汇编语言/边看PWN的题边学工具,不懂的再去查,这样学习效率会高很多。(再就是看一些书弥补一下底层的知识

最近看了一些学习路线,使用”Docker_for_win”pull了一个Ubuntu镜像,安装了一些常用工具(pwntools/pwndbg/checksec/ROPgadget/one_gadget/LibcSearcher/main_arena_offset/gcc-multilib),搭建了pwn的环境,总结如下。

Docker for windows

开启Hyper-V

在”控制面板-程序和功能-启动或关闭windows功能”中,开启”Hyper-V”功能。

下载安装Docker

点击该链接下载 Stable

下载好后直接进行安装,安装成功点击桌面Docker Desktop图标,运行Docker。

在设置(Setting)页面修改Docker Engine配置文件,因为docker hub服务器在国外,下载速度很慢,修改配置文件如下,更换下载镜像源:

1
2
3
4
5
6
7
8
9
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"insecure-registries": [],
"debug": true,
"experimental": true
}

进入cmd命令行,输入docker info命令确认配置生效。

补充一下,Docker默认的镜像会安装在C盘,但我C盘有些不够了,在Setting页面Resources-ADVANCED可以修改Disk image location到合适的目录。

最后,在命令行输入docker run hello-world命令运行第一个容器吧!

配置Ubuntu镜像下的pwn环境

docker常用命令汇总

windows/docker互传文件:

docker cp windows文件路径 容器名:容器路径

pull Ubuntu镜像

命令行输入docker search ubuntu显示仓库中各种Ubuntu镜像,不需要指定版本的情况下,docker pull ubuntu拉取第一个即可。

下载成功后使用命令docker run -it ubuntu运行镜像。

配置pwn环境

先apt update一下检查更新

安装python环境:

apt install python3

apt install python3-pip

安装pwntools:

pip3 install pwntools

成功安装pwntools,会同时安装CTF中常用的工具:checksec(检查程序的保护信息/拿到题第一步)和ROPgadget。

静态调试工具:

IDA Pro 我安装在了本机,破解版可以在52pojie下载。

安装动态调试工具:gbd

apt install gbd

继续安装gbd的插件,这里我选择pwndbg,从github上克隆下来,依此执行下列命令完成安装:

git clone https://github.com/pwndbg/pwndbg

cd pwndbg

./setup.sh

安装完成后执行gdb进入pwn debug

除了pwn debug外,gdb在github上还有peda/gef两个插件,安装方法同pwndbg。

one_gadget:

已经劫持程序控制流的情况下,需要返回到libc中system函数的地址,构造一个函数调用栈/ROP链,使最后可以执行libc中的system和/bin/sh进而获得shell,one_gadget可以一键从libc中找到一个满足特定条件(约束)执行就可以获得shell的地址。

需要先安装ruby:apt install ruby

安装ruby包管理器:apt install gem

安装one_gadget:gem install one_gadget

LibcSearcher:

在泄露了Libc中的某一个函数地址后,可以获得libc版本和其他函数偏移,但原脚本基于python2,目前不是很好用。替代方案:在线网站libc database search

main_arena_offset(堆题常用):

A simple shell script to get main_arena offset of a given libc

python封装版:

git clone https://github.com/IZAY01/py_main_arena_offset

注:该脚本依赖于 objdump(反汇编目标文件 ),请确保你的 Linux 中已安装 binutils 包 (二进制工具集 )

执行ld -v命令确保已安装binutils包

gcc-multilib:

在64位 linux上可以运行32位程序

apt install gcc-multilib

以上,常用pwn工具配置完成。

总结


此文只总结了环境搭建/工具安装过程,对具体工具的使用还需要在下一步CTF题的实践中不断理解。

年更博主是我没错了!!

开了二进制的新坑,之后或许会更的勤快许多。

短期计划:

逆向工程核心原理/程序员的自我修养(linker&loader)/csapp

进而弥补一下底层的知识,熟悉基础工具


在这个浮躁的时代,自律就显得格外地重要,只有自律的人,才有可能脱颖而出,成就大事。

日积月累的学习,坚持不懈的练习,一起加油吧!