实践目标

  • 本次实践的对象是一个名为pwn1的linux可执行文件。
  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
  • 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习三种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

实践三种方法

  1. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  2. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  3. 注入一个自己制作的shellcode并运行这段shellcode
  • 这3种思路,基本代表现实情况中的3种攻击目标

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

基础知识

  • 熟悉Linux基本操作,能看懂常用指令,如管道(|),输入、输出重定向(>)等。

  • 理解Bof的原理。

  • 能看得懂汇编、机器指令、EIP、指令地址。

  • 会使用gdb,vi。

具体的指令可以回到指导中查。

方法1:直接修改程序机器指令,改变程序执行流程

反汇编,了解pwn1可执行文件中的基本函数功能

  • 键入指令:objdump -d pwn1 | more
  • 找到该程序的gershell、foo与main三个函数:foo函数功能为将用户输入的字符回显在屏幕上,getshell函数为打开一个可用Shell。
  • 读汇编语言可知,程序通过main函数入口开始执行代码,执行到call处会跳转到foo函数,其中还有一个没有调用的getshell函数,显然如果程序正常执行,是不会运行getshell函数部分的,而我们就是要通过修改程序机器指令,让程序在执行到call处时转跳到getshell函数,达到改变程序执行流程的目的。

直接修改机器码

最基本的思路就是修改跳转地址,让main函数不再调用foo函数,转而调用getshell函数。观察如下代码:


root@KaliYL:~# objdump -d pwn1 | more 0804847d <getShell>:
804847d: 55 push %ebp
...
08048491 <foo>:
8048491: 55 push %ebp
...
080484af <main>:
...
80484b5: e8 d7 ff ff ff call 8048491 <foo>
80484ba: b8 00 00 00 00 mov $0x0,%eax
...
  • 首先我们先看反汇编指令"call 8048491 ",是说这条指令将调用位于地址8048491处的foo函数,其对应机器指令为“e8 d7ffffff”,机器指令e8表示跳转,本来正常流程,此时此刻EIP的值应该是下条指令的地址,即80484ba,但一解释e8这条指令呢,CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。
  • 通过计算可以得到0x80484ba + 0xffffffd7 = 0x8048491,该位置的指令恰好是foo函数。
  • 将上述计算式抽象出来可得:call机器码 = 跳转地址 - 正常流程的下一个EIP
  • 用windows计算器计算0x804847d-0x80484ba=?

  • 结果为0xc3ffffff,则得到调用getshell函数的机器码为:e8 c3 ff ff ff
  • 接下来我们只需要修改机器码即可:

此处对pwn1进行了备份,我们将对备份文件pwn2进行操作。

    • Step1:vi pwn2,用vim编辑器查看可执行文件pwn2,可以看到如下乱七八糟的车祸场景。

    • Step2:%! xxd,键入前述指令查看其16进制表示,看起来就工整多了。

    • Step3:/e8 d7,查询需要改动的机器码的位置,锁定后,按r键将其改为e8 c3

 ---->

    • Step4:%! xxd -r,退出16进制模式(注意:此处如果直接以16进制形式保存退出,运行该文件会报错
    • Step5::wq!,保存并退出。
  • 此时,我们可以再用反汇编指令查看其机器码,不难发现此时已经改变了原代码。

  • 退出到终端,执行指令:./pwn2,结果如下:

方法2:通过构造输入参数,造成BOF攻击,改变程序执行流

原理

  • 目标:触发getshell函数。
  • 可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞。
  • 在读入字符串时系统只预留了__字节的缓冲区,超出部分会造成溢出,我们需要覆盖返回地址。

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

接下来就来亲自体验一把溢出的感觉吧(先备份成pwn3)

  • 经试发现,当输入达到28字节产生溢出Segmentation fault

  • 现在能明确该程序有溢出漏洞了,接下来我们接着往后输入,观察什么时候可以覆盖其返回地址,让程序调用完foo函数后走向getshell函数,就能达到目的了。在此,我们使用用GDB调试工具。

GDB调试,确认用什么值来覆盖返回地址

  • gdb pwn3,进入调试,并输入一串可让其溢出的字符:

  • 继续测试:

  • info r,查看溢出时寄存器状态如下:

  • 不难发现,此时“1234”覆盖了其新的eip,所以我们只需要将getshell的内存地址替换这4个字符,就可以达到程序向getshell函数转移的目的。
  • 构造一串特殊的输入,由于getShell的内存地址是0x0804847d,而其对应的ASCII没有字符,所以我们通过一个简单的perl脚本语言来构造输入值。
    • perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

    注意:kali系统采用的是大端法,所以构造内存地址时注意顺序,末尾的\0a表示回车换行。

  • (cat input; cat) | ./pwn3,将input文件作为输入,结果如下:

实践总结

  • 本次实践我只尝试了前面两种方法,第一次实际操作BOF,之前都是只知道这个词,停留在理论层面上。
  • 此次实验通过备份文件,利用2种不同的方法,达到了获取shell的目的,还是很有收获的。
  • anyway,这个小训练还比较“平易近人”,真正的BOF是结合了shellcode编程与注入,OMG,学习的路还很长呀。
 
date:2017.3.9
by 20144306

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 20145304 网络对抗技术 逆向与Bof基础

    20145304 网络对抗技术 逆向与Bof基础 实践目标 学习以下两种方法,运行正常情况下不会被运行的代码: 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 利用foo函数的 ...

  10. 20145317 网络对抗技术 逆向与Bof基础

    20145317 网络对抗技术 逆向与Bof基础 实践要求 1. 掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码 2. 掌握反汇编与十六进制编程器 3. 能正确修改机器指令改变程序执行流程 ...

随机推荐

  1. [PCB设计] 4、BAT脚本处理AD生成的GERBER文件为生产文件

    1.生产资料概述 为了资料保密和传输方便,交给PCB厂商打样的资料一般以Gerber和钻孔文件为主,换句话说,只要有前面说的两种文件,就能制作出你想要的PCB了. 一般来说,交给PCB厂商的Gerbe ...

  2. KB奇遇记(8):好人难做

    题记:<KB奇遇记>已经更新到第八篇了.这一篇主要是讲项目实施过程中项目组成员之间的关系,也是我最不愿意回忆和讲述的事情. 早在来到KB公司的第一天开始,我就一直兢兢业业,丝毫不敢怠慢.面 ...

  3. Scala入门笔记二

    [TOC] 标识符 可用的字符 处理括号类字符,分隔符之外,其他所有的可打印的ASCII字符,如字母,数字,下划线和美元符号($)均可出现在Scala标识符中 插入符包括了(,) [,] {,and} ...

  4. Sublime Text3常用插件以及安装方法(实用)

    Package Control组件在线安装 按Ctrl+`调出console(注:避免热键冲突) 粘贴以下代码到命令行并回车: import urllib.request,os; pf = 'Pack ...

  5. css经典布局之左侧固定大小右侧自动适应

    最近学习了一种经典布局,固定左侧或右侧的宽度,另一侧自适应宽度,此种布局挺常用,尤其是像后台,大部分都是采用这种结构,还比如像订餐类的APP,进入商家的时候,会出现一堆饭的列表,左侧是饭的分类,右侧是 ...

  6. vs2010入门程序和出错问题解决方案

    本篇文章分两个部分: 第一,如何建立一个Helloword工程 1.打开Vs2010新建项目 2.选择Visual C++>>Win32>>Win32控制台应用程序,输入项目名 ...

  7. mktime性能问题调查

    一.问题提出 会议中有同学提到使用mktime遇到一些问题: 1) 设置tm_isdst后速度很慢 2) 设置TZ环境变量提速极大 所以想调查下具体情况.   mktime真的这么慢?如果是,为什么? ...

  8. 可能是一份没什么用的爬虫代理IP指南

    写在前面 做爬虫的小伙伴一般都绕不过代理IP这个问题. PS:如果还没遇到被封IP的场景,要不就是你量太小人家懒得理你,要不就是人家压根不在乎... 爬虫用户自己是没有能力维护一系列的代理服务器和代理 ...

  9. GCD(关于容斥原理)

    Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...

  10. esri-leaflet入门教程(5)- 动态要素加载

    esri-leaflet入门教程(5)- 动态要素加载 by 李远祥 在上一章节中已经说明了esr-leaflet是如何加载ArcGIS Server提供的各种服务,这些都是服务本身来决定的,API脚 ...