20145319 逆向与Bof实验

1 实验内容

  • 本次实验以可执行文件pwn1为例,将对pwn1进行反汇编的基础上进行功能上的解读,并进行缓冲区溢出攻击
  • 可执行文件pwn1的正常流程是主函数调用foo函数完成字符串的录入和对录入字符串的重复输出,我们首先通过修改文件pwn1使其跳过foo函数转而执行getshell函数
  • 利用其对于缓冲区溢出漏洞进行攻击,通过调整输入字符串来覆盖原有返回地址,使程序执行我们想要其执行的函数getshell

2 实验步骤

  • 首先对于目标文件进行反汇编处理,输入命令objdump -d mypwn | more可以看到结果如下
  • 忽略掉其中与功能无关的部分,将整个反汇编代码浏览一遍,我们可以发现这个代码主要分成三部分,主函数,以及两个子函数foo和子函数getShell
  • 首先从主函数的汇编代码来看,这个函数的功能十分简单,其中call 8048491就是调用函数foo,之后程序结束
  • 之后我们来看看函数foo的汇编代码部分,该函数实现了字符串的录入功能,其中汇编代码sub $0x38,%esp就是为字符串所预留出的寄存器空间,但是在不对缓冲区进行保护的情况下,我们就可以通过录入过长的字符串,而覆盖掉本在堆栈中的返回地址,从而达到我们想要实现的目的,实现缓冲区溢出攻击
  • 之后开始修改可执行文件中的机器码,让其可以按照我们想要的结果来运行,首先我们可以将主函数中call指令中的地址修改为getShell代码段地址,来看看getShell函数功能,用vim编辑器十六进制打开,并找到我们想修改的部分(详见所附操作指令)
  • 之后我们开始尝试进行缓冲区溢出攻击,来使程序达成同样的效果
  • 输入一串长字符串,直到程序反馈寄存器错误
  • 由反馈的结果来看eip中的地址已经变成了0x39393939即被四个9所覆盖,我们就需要调节我们所录入的字符串,并且观察到底是字符串中的哪几位覆盖住了返回地址即可
  • 由上一步我们可以基本可以确定覆盖住返回地址的四位字符正是字符串中的3456四位
  • 之后我们需要将字符串中的3456四位修改成getshell的内存地址0804847d,由上几步我们大致可以确定在计算机内部的字节顺序,注意修改字节顺序后我们只需将其新的字符串键入即可
  • 因为键盘上无法直接键入\x7d等十六进制数,因此我们先将其重定向至文件input中,之后通过管道将input文件中的内容作为输入来运行程序

3 shellcode注入

  • 我们可以通过写c语言程序或者直接写汇编程序两种方式来获得我们的shellcode,这里我们采用第二种方式
  • 首先编写shellcode的汇编代码
  • 之后通过反汇编得到其机器码组成,将其中的机器码摘出来就是我们需要使用的部分了
  • 首先做好准备工作,为了防止此类攻击,如今的计算机操作系统已经增加了许多保护措施,例如保护堆栈,使堆栈不可执行,又例如每一次生成代码的堆栈地址随机,来使得我们无法通过多次尝试来搜寻准确的返回地址,所以我们在准备阶段我们将这些保护功能都关闭(如果execstack显示command not found可以尝试apt-get install prelink)
  • 构造注入字符串一般有两种策略,一是retaddr+nop+shellcode二是nop+shellcode+retaddr我们先把retaddr用数字5319来代替
  • 之后我们将文件执行挂在后台,打开另一个终端查看当前进程的进程号对其进行跟踪
  • 使用断点调试,观察注入的shellcode的地址所在
  • 观察可以看出shellcode的地址应该就是0xffffd330之后的一段区间,所以将返回地址修改成这段区间中的数值即可,修改后写入即可看到最后注入成功

4 其他

  • vim相关

    • %!xxd将文件显示变为十六进制模式
    • %!xxd -r将十六机制模式转回原格式
      • 在命令行模式下输入/即为查找,例如搜寻我们想要找到的e8 d7段,只需输入/e8 d7
    • 将文件转成十六进制模式下修改后要转回原格式才进行保存
  • 其他
    • Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用

20145319 《网络对抗》逆向与Bof基础的更多相关文章

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

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

  2. 20145203盖泽双 《网络对抗技术》实践1—— MAL_逆向与Bof基础

    20145203盖泽双 <网络对抗技术> MAL_逆向与Bof基础 实践目标 (1)我们要通过修改程序代码,使得程序运行其自身中本不该运行的代码片段. (2)在这里,我们有一个名为2014 ...

  3. 20155201 李卓雯 《网络对抗技术》实验一 逆向及Bof基础

    20155201 李卓雯 <网络对抗技术>实验一 逆向及Bof基础 一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,f ...

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

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

  5. 20145236《网络对抗》Exp1 逆向及Bof基础

    20145236<网络对抗>Exp 1逆向及Bof基础 一.实践目标 运行原本不可访问的代码片段 强行修改程序执行流 以及注入运行任意代码. 二.基础知识及实践准备 理解EIP寄存器及其功 ...

  6. 20155305乔磊《网络对抗》逆向及Bof基础

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

  7. 20155311高梓云《网络对抗》逆向及Bof基础

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

  8. 20155334 曹翔 《网络对抗》逆向及Bof基础

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

  9. 20145215卢肖明《网络对抗》逆向及Bof基础

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

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

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

随机推荐

  1. hibernate实现有两种配置,xml配置与注释配置。<转>

    <注意:在配置时hibernate的下载的版本一定确保正确,因为不同版本导入的jar包可能不一样,所以会导致出现一些错误> hibernate实现有两种配置,xml配置与注释配置. (1) ...

  2. linux下一些常用命令和访问目录

    1. 目录      ls   列出目录文件名      ll    列出所有目录文件的访问权限等相关信息,包括 .   ..      ls -a  列出所有目录文件名,包括 .   .. ls - ...

  3. 【BZOJ4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配

    [BZOJ4554][Tjoi2016&Heoi2016]游戏 Description 在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂.简单的说,这个游戏就是在一张地图上放上若干个炸弹,看 ...

  4. 详解Javascript中prototype属性

    转自:https://www.jb51.net/article/91826.htm 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实例.但是在Jav ...

  5. Mac - iPhone屏幕录制

    1. Mac电脑屏幕录制 1.1 文件->新建屏幕录制   1.2 点击红色按钮   1.3 截取需要录制的屏幕部分,点击开始录制   1.4 点击工具栏的停止按钮,停止录制   1.5 然后会 ...

  6. Java项目工程化之项目构建工具Maven

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  7. 'Settings' object has no attribute 'TEMPLATE_DEBUG' 的解决方法

    找到该Django项目下的settings文件,把 DEBUG = True 改为 DEBUG = False 就可以正常浏览显示了 参考:https://stackoverflow.com/ques ...

  8. 170731、Nginx初探

    一. 概念 Nginx——Ngine X,是一款自由的.开源的.高性能HTTP服务器和反向代理服务器:也是一个IMAP.POP3.SMTP代理服务器:也就是说Nginx本身就可以托管网站(类似于Tom ...

  9. java网络编程面试题

    1.网络编程时的同步.异步.阻塞.非阻塞? 同步:函数调用在没得到结果之前,没有调用结果,不返回任何结果.异步:函数调用在没得到结果之前,没有调用结果,返回状态信息.阻塞:函数调用在没得到结果之前,当 ...

  10. Oracle管理监控之测试环境清理用户脚本

    --PL/SQL块删除用户 declare  cursor cur_duser is    select sid, serial# from v$session where username in ( ...