本实验要求实验者具备如下的相关知识。
一、了解CTF
CTF的全称是Capture The Flag,即夺旗的意思,因此CTF比赛也称为夺旗比赛。CTF夺旗赛是计算机安全竞赛的一种形式,CTF比赛主要表现以下几个技能上:逆向工程、密码 学、ACM编程、Web漏洞、二进制溢出、网络和取证等。在国际CTF赛事中,二进制溢出也称之为PWN。
PWN是一个黑客语法的俚语词,自"own"这个字引申出来的,这个词的含意在于,玩家在整个游戏对战中处在胜利的优势,或是说明竞争对手处在完全惨败的 情形下,这个词习惯上在网络游戏文化主要用于嘲笑竞争对手在整个游戏对战中已经完全被击败(例如:"You just got pwned!")。有一个非常著名的国际赛事叫做Pwn2Own,相信你现在已经能够理解这个名字的含义了,即通过打败对手来达到拥有的目的。
CTF中PWN题型通常会直接给定一个已经编译好的二进制程序(Windows下的EXE或者Linux下的ELF文件等),然后参赛选手通过对二进制程 序进行逆向分析和调试来找到利用漏洞,并编写利用代码,通过远程代码执行来达到溢出攻击的效果,最终拿到目标机器的shell夺取flag。
二、Linux管道
Linux管道可以将一个进程的标准输出作为另一个进程的标准输入,管道的操作符号为“|”,比如ls命令可用于查看当前目录下的文件列表,而grep命 令可用于匹配特定的字符,因此ls | grep test命令可用于列出当前目录下文件名包含test的文件。
三、Python基础
在Linux shell中执行python -c "print 'Hello'"可以执行双引号中的Python语句,即通过print打印出Hello字符串。Python中单引号和双引号没有区别,因为这里使用双 引号修饰Python语句,因此使用单引号修饰字符串。
四、gdb调试器
gdb是Linux下常用的一款命令行调试器,拥有十分强大的调试功能。gdb命令如下:

五、汇编基础
读懂常见的汇编指令是CTF竞赛中PWN解题的基本要求,汇编指令如下:

汇编语言中,esp寄存器用于指示当前函数栈帧的栈顶的位置,函数中局部变量都存储在栈空间中,栈的生长方向是向下的(即从高地址往低地址方向生长)。
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超 过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。
实验目的
1)了解CTF竞赛中的PWN题型
2)了解缓冲区溢出攻击
3)熟悉gdb的基本用法
实验环境
服务器:CentOS6.5,IP地址:随机分配
辅助工具:Python,gdb
实验步骤一
描述:
主机/home/test/1目录下有一个pwn1程序,执行这个程序的时候可以输入数据进行测试,pwn1程序会输出Please try again.的提示信息,请对pwn1程序进行逆向分析和调试,找到程序内部的漏洞,并构造特殊的输入数据,使之输出Congratulations, you pwned it.信息。
源码审计
在实际的CTF竞赛的PWN题目中,一般是不会提供二进制程序的源代码的。这里为了方便大家学习,给出二进制程序的C语言源代码供大家分析,以源码审计的方式确定漏洞所在位置,方便后续进行汇编级别的分析。
(在没有源代码的情况下,我们通常使用IDA Pro对二进制程序进行逆向分析,使用IDA的Hex-Rays插件可以将反汇编代码还原为C语言伪代码,可以达到类似源代码的可读效果,在后期的实验中会专门对IDA的使用进行讲解)
使用cd /home/test/1切换到程序所在目录,执行cat pwn1.c即可看到源代码:
