20145229吴姗珊逆向BOF实践

实践

实践目标

  • 本次实践的对象是一个名为pwn1的linux可执行文件
  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。
  • 我们将学习两种方法:
    1. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    2. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

实践步骤

  • 安装虚拟机、靶机及Kali,安装成功如下图

  • 建立姓名学号文件夹,放入pwn1

  • 直接运行pwn1,知道其作用为回显刚刚输入的字符

  • 当输入的字符过长会导致缓冲区溢出

  • 指令objdump反汇编pwn1,more管道按页显示,命令 objdump -d pwn1 | more

  • 分析代码并修改指令改变其功能
    main函数反汇编的第4行,"call 8048491 "是汇编指令,是说这条指令将调用位于地址8048491处的foo函数;其对应机器指令为"e8 d7ffffff",e8即跳转之意。本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但一解释e8这条指令呢,CPU就会转而执行 "EIP + d7ffffff"这个位置的指令。"d7ffffff"是补码,表示-41,41=0x29,80484ba +d7ffffff= 80484ba-0x29正好是8048491这个值(foo函数调用入口),main函数调用foo,对应机器指令为" e8 d7ffffff",那我们想让它调用getShell,只要修改"d7ffffff"为,"getShell-80484ba"对应的补码就行。用Windows计算器,直接 47d-4ba就能得到补码,是c3ffffff。

之后汇编码将由e8d7ffffff变为e8c3ffffff

  • 下载图形化的16进制编辑器
    指令:apt-get install wxhexeditor
    wxHexEditor

  • 通过构造输入参数,造成BOF攻击,分析各函数功能

main:函数的第四行call 8048491意思为跳转到foo函数

getshell:我们的目标是触发函数getShell,这个恶意代码可以实现shell
foo:可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞

  • 缓冲区溢出跳转getshell
    1.首先尝试用gdb调试

2.输入1111111122222222333333334444444455555555,观察寄存器数值

3.发现eip为0x35353535,查ASCLL表发现是5555。eip寄存器的功能就是保存程序下一步要执行指令的地址,可以看出本来应返回到foo函数的返回地址已被"5555"覆盖

4.通过将55555555换成12345678,再观察eip值找出谁被覆盖,通过查表可知为1234

5.确认getshell地址的字节序列0804847d如何组合

  • 通过设置断点查看0804847d的顺序,在0804049d处设置断点,通过查看之后的eip值,eip值不变,对比之前 eip 0x34333231 0x34333231 ,通过查表查出为4321,可以确定getshell字符序列应该是11111111222222223333333344444444\x7d\x84\x04\x08

码表如下

  • 生成字符串
    我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。
    Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用。
    使用输出重定向“>”将perl生成的字符串存储到文件input中。可以使用16进制查看指令xxd查看input文件的内容是否如预期。

  • 跳转getshell
    将input的输入,通过管道符“|”,作为pwn1的输入

  • 注入shellcode
    shellcode:
    Shellcode是一组可注入的指令,可在被攻击的程序内运行。由于shellcode要直接操作寄存器,通常用汇编语言编写并翻译成十六进制操作码。我们想让目标程序以不同与设计折预期的方式运行,操纵程序的方法之一是强制它产生系统调用。ShellCode就是一段程序的机器码形式,而ShellCode的编写过程,就是得到我们想要程序的机器码的过程。
    在Linux里有两种方法来执行系统调用。间接的方法是libc,直接的方法是用汇编指令调用软中断执行系统调用。在Linux里,程序通过int 0x80软中断来执行系统调用,调用过程如下:
    1、把系统调用编号载入EAX;
    2、把系统调用的参数压入其他寄存器;最多支持6个参数,分别保存在EBX、ECX、EDX、ESI、EDI和EBP里;
    3、执行int 0x80指令;
    4、CPU切换到内核模式;
    5、执行系统函数。

  • 需要一个shellcode代码,在网上找了一个,命名为helloshellcode,直接对这个程序进行编译,编译时注意需要首先转换为32位

  • 想提取其中的shellcode就需要通过反汇编来获取相应的汇编代码或是二进制代码。如果要提取该程序中的获取shell的shellcode,就是要获取函数execve调用时参数及相应的系统调用。接下来进行反汇编

  • 使用gdb查看反汇编

从上图中可以看出execve函数是先赋值寄存器后进行调用*0x80e8a90,可以看出就是上面所说的第一种放大—调用软中断执行系统调用。一旦加载寄存器之后,就会调用int 0x80 汇编指令来发出软中断,强迫内核暂停手头上的工作并处理该中断。

  • 提取shellcode
    在上面放的用gdb查看的反汇编的图里的部分指令进行组合就可以了,不过老师在上课的时候说过里面不能包含0字符,需要把0字符全部去掉,否则无法执行

  • 汇编写helloshellcode及编译

  • 本次的shellcode参考了网上大神的分享,自己对这汇编方面理解太少,能理解整个过程的原理,在实践代码方面举步维艰,不过熟能生巧,自己会多加强这方面的学习

    实践感想

    本次的实践是本次课的第一次实验,根据老师给出的教程一步步往下做没有遇到太大的问题,只是在确定大端小端的时候遇到了一些疑难,缓冲区溢出最重要的就是找出覆盖的部分,然后进行一个计算即可进行跳转,其实原理很简单,只是对汇编方面的知识太过生疏导致理解汇编时非常吃力,但是在做注入shellcode的时候,根据网上的教程做下来,大体的概念清楚,做下来花了不少时间,还需要花一定的时间理解消化,希望自己以后也可以加强对汇编的学习,将所有知识融会贯通进行学习。

20145229吴姗珊逆向BOF实践的更多相关文章

  1. 20145229吴姗珊《网络对抗》WEB基础实践

    20145229吴姗珊<网络对抗>WEB基础实践 基础与实践 基础问题 1.什么是表单 表单是可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 一部分是HTML源代码用于 ...

  2. 20145229吴姗珊《网络对抗》shellcode注入&Return-to-libc攻击深入

    20145229吴姗珊<网络对抗>shellcode注入&Return-to-libc攻击深入(待上传) shellcode注入 shellcode是一段代码,是溢出程序和蠕虫病毒 ...

  3. 20145229吴姗珊 《Java程序设计》课程总结

    20145229吴姗珊 <Java程序设计>课程总结 (按顺序)每周读书笔记链接汇总 第一周:http://www.cnblogs.com/20145229ss/p/5248728.htm ...

  4. 20145229吴姗珊《网络对抗》MSF基础应用

    20145229吴姗珊<网络对抗>MSF基础应用 试验过程及基础知识 实验完成问题回答 用自己的话解释什么是exploit,payload,encode. exploit:通过一个漏洞对程 ...

  5. 20145229吴姗珊 《Java程序设计》第9周总结

    20145229吴姗珊 <Java程序设计>第9周总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交 ...

  6. 20145229吴姗珊 《Java程序设计》第8周学习总结

    20145229吴姗珊 <Java程序设计>第8周总结 教材学习内容总结 第十四章 NIO与NIO2 NIO: InputStream.OutputStream的输入输出,基本上是以字节为 ...

  7. 20145229吴姗珊 《Java程序设计》2天小总结

    20145229吴姗珊 <Java程序设计>2天小总结 教材学习内容总结 由于这周学的内容比较简单,主要是关于日期.日期之类的东西.所以自己从书上看了一些内容 总结了第四章 认识对象 和第 ...

  8. 20145229吴姗珊 《Java程序设计》第7周学习总结

    20145229吴姗珊 <Java程序设计>第7周学习总结 教材学习内容总结 第13章时间与日期 即使标注为GMT(格林威治时间),实际上谈到的的是UTC(Unix时间)时间. 秒的单位定 ...

  9. 20145229吴姗珊《java程序设计》第2次实验报告

    20145229吴姗珊<java程序设计>第2次实验报告 实验名称 Java面向程序设计,采用TDD的方式设计有关实现复数类Complex. 理解并掌握面向对象三要素:封装.继承.多态. ...

随机推荐

  1. Oracle 10gR2 RAC 启动与关闭

    一. 检查共享设备 一般情况下, 存放OCR 和 Voting Disk 的OCFS2 或者raw 都是自动启动的. 如果他们没有启动,RAC 肯定是启动不了的. 1.1 如果使用ocfs2的,检查o ...

  2. point-position目标定位

    双站探测同一目标会构成两条直线:(飞行目标定位2 - ostartech - 博客园 https://www.cnblogs.com/wxl845235800/p/8858116.html) 测角偏差 ...

  3. Duilib教程-非DUI控件

    DUILIB并不是真正的DUI,至少有部分控件不是完全DUI的.其实包括: 1.EDIT. 它的实现原理是,CEditUI包含一个窗口CEditWnd,流程如下: 1)鼠标单击,创建窗口见 EditU ...

  4. cocos3.9 windows平台 AssetsManager创建文件失败问题

    在做热更新功能时用到了AssetsManager,发现在windows平台总是报CREATE_FILE错误,errorStr "Can't renamefile from: xxx.tmp ...

  5. iOS 7.1 UITapGestureRecognizer 不好用的解决办法

    UITapGestureRecognizer *tap3 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(o ...

  6. 全局安装了express框架,但是无法使用express指令的问题

    错误截图: 产生这个错误的原因是:我安装的是express4版本,需要安装express-generator才能使用express命令 将express-generator安装后就都解决了:

  7. IIS网站部署解决报错

    入坑2次,这次还是得马上总结起来== 部署网站报以上错 检查方法 步骤一:检查部署的网站路径是否正确 步骤二: 检查Internet信息管理器中,应用程序池的.net Framework版本,选择v4 ...

  8. Virtualbox报错------>make sure the kernel module has been loaded successfully

    错误描述 很久没有用virtualbox了,今天打算在virtualbox上安装一个Ubuntu系统的时候,新建好Ubuntu后启动的时候,直接报错: Cannot access the kernel ...

  9. SSD(Single Shot MultiBox Detector)二读paper

    SSD KeyWords:Real-time Object Detection; Convolutional Neural Network Introduction 目前最尖端(State-of-ar ...

  10. linux c编程:互斥锁条件变量

    条件变量:等待与信号发送 使用互斥锁虽然可以解决一些资源竞争的问题,但互斥锁只有两种状态(加锁和解锁),这限制了互斥锁的用途. 条件变量(条件锁)也可以解决线程同步和共享资源访问的问题,条件变量是对互 ...