• 20192408胡益琳 实验一 逆向破解与BOF实验报告


    1.实验内容

    • 实验对象pwn1中包含三个部分,分别为main(主函数)foo函数和getshell
    1. 直接修改main函数中的机器指令,使main函数跳转到getshell所在地址执行
    2. 在调用foo函数时输入攻击字符串,覆盖返回地址,使程序跳转到getshell执行
    3. 注入shellcode并执行,原理同2,输入内容覆盖函数的返回地址,使程序跳转到注入的shellcode并执行

    2.实验过程

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

    • (1)下载文件pwn1并修改文件名,用objdump -d指令进行反汇编,重点关注三个函数的地址


      同时可以看到main函数中的call 8048491 命令跳转到foo函数
      根据汇编语言的知识,e8表示跳转,而此时EIP的值应为main函数中下一条指令的地址,即80484ba,加上ffffffd7即为foo函数首地址。
      由此可知,若我们要想使main函数跳转到getshell,则需将e8后的d7ffffff改为与80484ba相加得到getshell地址(804847d)的数。
      经过计算,47d-4ba得到补码为ffffffc3,即接下去要做的是把main函数中的e8d7ffffff改为e8c3ffffff
    • (2) 修改可执行文件,如图所示,其中:%!xdd命令用于切换显示模式为十六进制,存盘退出即可。


    • (3)再次利用objdump -d指令进行反汇编查看修改结果,运行成功

    2.2 输入参数造成BOF攻击,改变程序执行

    • (1)用objdump -d指令进行反汇编,了解程序的功能

      如图可以看出foo函数中分配给输入字符的空间为0x1c,即28个字节,若输入字符大于这个数则可能会覆盖EBP、EIP,影响程序的正常执行。EBP所占大小为4个字节,即第33个字节会覆盖到EIP的位置。
    • (2)由此我们进行试验,可以看到0x35353535(即5555的ASCII码)覆盖了EIP的部分,我们只要将55555555的位置换成我们想要执行部分的地址即可以实现BOF攻击


      以下将55555555换成12345678覆盖EIP,来确定字节序。由于getshell的地址为804847d,输入应为11111111222222223333333344444444\x7d\x84\x04\x08
    • (3)由于\x7d\x84\x04\x08无法由键盘输入,所以使用perl生成字符串放到input文件中,再用管道符|将文件input的内容输入pwn20192408.1,实验成功

    2.3 注入Shellcode并执行

    • (1)修改设置。用execstack -s pwn20192408.3设置堆栈可执行。用echo "0" > /proc/sys/kernel/randomize_va_space 命令关闭地址随机化,使得攻击能够顺利进行。
    • (2)构造攻击buf,先用\x4\x3\x2\x1代替覆盖返回地址位置的命令,然后通过gdb调试确定应填入的地址。

    • 由于nops+shellcode+retaddr的结构攻击失败,所以采用retaddr+nops+shellcode的结构,即执行的shellcode代码放在缓冲区之后。如图可以计算出\x4\x3\x2\x1所在的位置,即ret所在的位置为0xffffd4ec,由于shellcode放在ret后面,所以shellcode的首地址应为0xffffd4f0,将0xffffd4f0填入\x4\x3\x2\x1所在的位置即可。
    • 如图显示成功

    3.问题及解决方案

    • 问题1:安装gdb过程(方案:在终端中用wget命令下载并解压、编译、安装)中执行到make时报1924错误
    • 问题1解决方案:直接使用apt-get install gdb指令安装。
    • 问题2:在设置堆栈可执行时输入execstack -s pwn20192408.3时报错execstack: Command not found
    • 问题2解决方案:使用命令sudo apt-get install prelink
    • 问题3:在使用命令sudo apt-get install prelink解决问题2时报错如下:Unable to locate package
    • 问题3解决方案:打开sources.list文件并添加源,用apt-get update命令更新源后再下载 prelink。
    • 问题4:在进行实验三时采用nops+shellcode+retaddr的结构造成攻击失败。
    • 问题4解决方案:通过gdb单步执行调试发现错误原因是执行shellcode过程中的某一步用到push指令,由于当前栈顶与shellcode相邻,push后将shellcode指令覆盖,导致实验失败。所以改为采用retaddr+nops+shellcode的方式进行实验。

    4.学习感悟与思考

    1. 在本次实验中对于Linux基本命令与堆栈的结构有了更深的理解的掌握。学到了使用输出重定向用于将Perl语言生成的字符串写入文件,再将文件通过管道符|输入程序的方法,可以将键盘无法输入的值输入程序中。
    2. 对于实验三最后一步的输入,即
      perl -e 'print "A" x 32;print "\x20\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x00\xd3\xff\xff\x00"' > input_shellcode
      一开始有疑问为什么代码最后仍为x00\xd3\xff\xff,删去是否有影响,后经查验资料得知x90为nop即空指令操作,经试验证明删去对实验结果无影响。
    3. 对于Linux指令的了解与掌握还有所欠缺,要在以后的学习与实践中多加练习。
  • 相关阅读:
    数据库简介
    计算机网络OSI七层协议
    信息论知识点(绪论)
    Wireshark抓取HTTP数据包
    配置FileZilla FTP服务器
    Redis集群搭建的几种方式
    Redis单个分片高可用&哨兵集群
    Redis哈希一致性&对应API操作
    MapReduce实现好友推荐
    window下使用IDEA远程调试伪分布式hadoop集群
  • 原文地址:https://www.cnblogs.com/HuYiL/p/16059891.html
Copyright © 2020-2023  润新知