CTF-PWN入门指导与学习路线

PWN是一个黑客俚语,由"own"引申出来,含意是在对战中处在胜利的优势,或是竞争对手处在完全惨败的情形。在信息安全领域中,包括服务器或PC或是应用程序,PWN在这一方面的意思是攻破("to compromise")或是控制,取得未授权的访问进而入侵系统。

PWN类题目属于二进制安全的重要分支,是对目标程序在逆向工程基础上进行漏洞挖掘和利用,入门难度相对比较大。大多数PWN题目关注x86和x64体系结构,所以入门时应该首先学习8086汇编语言。

PWN类题目一般的形式是这样的:
只提供和Linux或Windows下某程序的可执行文件给参赛选手,选手在本地逆向分析找到漏洞利用方法;服务器中同时在某一端口运行程序,在程序目录下放置flag.txt,里面写上flag信息;选手连接远程服务器,利用漏洞使运行的程序更改运行流程,拿到flag。

推荐入门工具:OllyDBG、IDA。需要的资料已经以pdf形式提供(仍然建议大家使用正版书),下面以需要了解的知识点描述学习轨迹:
入门---->
基本的汇编语句与寄存器(PUSH、MOV、JMP、CALL等指令、EAX、ECX、EIP、ESP、EBP、ESI、EDI等寄存器、8086与80386)-->
栈(局部变量在栈上的分布、栈保存的其他重要数据、小端序)-->
函数调用发生了什么(返回地址的保存、栈帧、函数参数传递)-->
数据与指令有什么不同(存储位置?数据能执行吗?)-->
一些简单函数执行流程(C语言与汇编语言、观察printf(“Hello world”))-->
漏洞利用方法(覆盖邻接变量、修改返回地址)-->
一些常见的漏洞类型(缓冲区溢出(scanf,gets)、格式化字符串(printf)、堆溢出、整数溢出)->
进阶---->
Shellcode书写-->
突破保护(GS、DEP、ASLR、JMP ESP,ret2libc,ROP)-->
…----->
招新的题目难度会很低,大家首先应学习、掌握入门部分的内容。

考虑到大家的基础,下面以Windows下的一个有缓冲区溢出漏洞的简单程序example.exe为大家示例。
漏洞在函数stack_over_flow()的gets()函数中,缓冲区只有16个字节,如果输入长度大于16,将覆盖很多重要数据包括stack_over_flow()函数的返回地址(需要学习栈相关内容)。远程服务器运行的例程的目录下有一个flag.txt文件,存放flag,而程序中已经写好了读取的代码readfile()但并没有被调用。我们通过缓冲区溢出覆盖到stack_over_flow()函数的返回地址,让其返回到readfile()就可以拿到flag。

为了便于大家学习,首先给出程序的源码。但要知道,比赛题目并不给出源码。
#include<stdio.h>
#include<stdlib.h>
int stack_over_flow()
{
char Password[16] = { 0, };
gets(Password);
return 0;
}
void readfile()
{
FILE* fp;
char FileStr[20] = { 0, };
printf("You've got the flag:\n");
if (fp = fopen("flag.txt", "r"))
{
fgets(FileStr, 48, fp);
printf("%s\n", FileStr);
fclose(fp);
}
else
printf("File error!\n");
exit(0);
}
int main()
{
printf("Welcome!\n");
printf("Please input your password(within 8 characters):\n");
stack_over_flow();
printf("Good Bye!\n");
return 0;
}

可以使用IDA静态分析该程序,然后使用OllyDBG调试这一程序。IDA和OllyDBG工具的基本使用方法不再说明。运行程序,发现输出了两行提示然后要求用户输入。

逆向分析,找到main函数的位置为00401160,观察还可以发现00401520为printf(),00401005就是stack_over_flow()函数。在反汇编窗口继续寻找可以找到readfile()函数的入口地址00401090。
从00401005跳到00401030,stack_over_flow()就在这个位置。004011D0一定就是scanf()了。

如下图所示,测试输入了8个‘A’(16进制表示为0x41),发现在栈如下所示。总共16个字节的空间,后面四个字节为之前保存的ebp,再下面四个字节处00401197就是本函数的返回地址。考虑输入20个‘A’,然后把返回地址覆盖为readfile()函数的入口地址00401090。这样当程序返回的时候就从栈中取出00401090作为EIP寄存器的内容,于是然后程序执行跳到了EIP处,读取文件显示flag。

由于要输入的一些字符并不能从键盘中打印出来,我们可以借助Python输出重定向。

输入的示例:python -c "print 'A'*20+'\x90'+'\x10'+'\x40'+'\x00'" | example.exe
⦁ 管道符号:‘|’,用来把Python输出重定向到example.exe的输入。
⦁ ‘A’:20个‘A’用来填充栈内空间。
⦁ 00401090:通过逆向工程的手段找到的readfile()函数的入口地址。因为是16进制所以有’\x’;之所以采取这样的顺序是因为intel CPU的小端序(需要自行学习)。填的位置正好位于stack_over_flow()函数的返回地址处,相当于修改了这一地址。

Written by default from TS2013.
有问题可以联系我和其他学长帮助解决。我的邮箱:default@bupt.edu.cn
学习安全知识技能需要热情,大家加油!

天枢信息安全社团2015年招新相关推荐

  1. 计算机社团宣传招新活动方案,社团招新策划书范本及活动方案

    社团招新策划书范本及活动方案 新的学期,新的开始,在社团招新活动开始前,如何写策划书呢?以下是小编为大家提供的社团招新策划书范本,供大家参考借鉴! 社团招新策划书范本(一):青年志愿者协会 一.招新目 ...

  2. 计算机协会学期计划策划书,新学期计算机协会招新活动策划书

    新学期计算机协会招新活动策划书 相关内容: 本文目录协会招新策划书模板勤工俭学协会招新活动策划书遥澜报社协会招新活动策划书新学期计算机协会招新活动策划书目标:协会在全校范围达到一定的知名度和美誉度,吸 ...

  3. 计算机协会招新报名表,社团招新策划

    在丹桂飘香的新学期里,动漫社团迎来了一年一度的纳新活动.在纳新活动中,爱好动漫的新生们可以加入我们社团.以下是出国留学网小编为您整理的大学社团:动漫社团招新策划,供您参考,更多详细内容请点击实用资料查 ...

  4. 背景图页面缩小会变形_社团招新迎新海报背景图第321期

    ○ ○ ○ 免费图片素材 置顶提示:文件将通过某度网盘提取,请先将素材保存到自己网盘后再下载.虽然设置了链接长期有效,但是什么事情都不能绝对,至少现在就出现过好几次链接被取消的情况. 页面底部有个留言 ...

  5. 社团招新如何吸引新人,制作一张好的海报最关键

    每一年开学季,各大社团争先招新的场景可见一斑.新生在想社团招新面试问题有啥,老生在想社团招新要如何吸引新人,招新海报就大有学问.话不多说,直接上图. 社团招新海报要明确自身主题,比如是文学社就可以尝试 ...

  6. php面试自我介绍结束语,面试自我介绍 结尾 社团招新面试自我介绍

    自我介绍在我们的生活中会经常用到,在大学社团面试中,如何让自我介绍起到让人耳目一新的效果需要一定的技巧,下面是小编整理的社团招新面试自我介绍,欢迎大家阅读. 社团招新面试自我介绍篇1 亲爱的老师.同学 ...

  7. 【C++】 Swan学院社团招新(PTA)

    题目描述 Swan学院社团招新,招新宣讲会分散在不同时间段,大一新生小花花想知道自己最多能完整的参加多少个招新宣讲会(参加一个招新宣讲会的时候不能中断或离开). [问题说明]这个问题是对几个相互竞争的 ...

  8. 7-4 Swan学院社团招新 (20 分)

    7-4 Swan学院社团招新 (20 分) Swan学院社团招新,招新宣讲会分散在不同时间段,大一新生小花花想知道自己最多能完整的参加多少个招新宣讲会(参加一个招新宣讲会的时候不能中断或离开). [问 ...

  9. PTA Swan学院社团招新(sort排序)

    Swan学院社团招新,招新宣讲会分散在不同时间段,大一新生小花花想知道自己最多能完整的参加多少个招新宣讲会(参加一个招新宣讲会的时候不能中断或离开). [问题说明]这个问题是对几个相互竞争的招新宣讲会 ...

最新文章

  1. 架构师究竟要不要写代码?
  2. 秒杀苹果carplay baidu车联网API冷艳北京车展
  3. linux挂载新硬盘,开机自动挂载
  4. Struts2中数据封装方式
  5. 上海药物所揭示KRAS突变肿瘤的分子分型和精准治疗新策略
  6. 别慌,不就是跨域么!
  7. Elasticsearch(三) 使用kibana 操作ES
  8. SecSolar:为代码“捉虫”,让你能更专心写代码
  9. 想知道你能不能挣到大钱吗?
  10. 关键路径例题图解_图解!九大常见数据结构被24张图给安排的明明白白
  11. Atitit.人力资源管理原理与概论
  12. 单片机c语言仿真,单片机c语言教程:C51表达式语句及仿真器
  13. winform 打印快递电子面单_电子面单接口说明文档-(附C#源码)
  14. 如何构建健商品期carry组合
  15. iReport使用入门
  16. 接口收到CRC错包怎么处理
  17. 安装Office InfoPath 2007
  18. Django 1.9 支持中文
  19. 帝国cms如何导入php模板,帝国cms模板导入导出及模板组功能介绍
  20. unity绘制管道_在Unity里写一个纯手动的渲染管线(一)

热门文章

  1. 发那科机器人变量解释_机器人解释
  2. ACCP 8.0 jQuery 第八章 上机练习
  3. 博客项目学习笔记十七:用户中心(我发布的帖子)
  4. Spool:增强版Instapaper
  5. python项目实战大合集
  6. 【C++】多重继承的顺序理解
  7. Rainbow Brackets 彩色括号 兼容Solarized Themes日晒主题的配色方案
  8. 信息化时代下的我们----弄潮儿
  9. 计算机桌面隔几秒闪一下,为什么我的电脑桌面总是隔几分钟就自动刷新一下
  10. 信息管理系统核心知识点(一)