2017-2018-1 20155321 《信息安全系统设计基础》课下作业3

2017-2018-1 20155321 《信息安全系统设计基础》课下作业3

课堂练习第五题

  • 因为虚拟机是64位的,所以先输入命令sudo apt-get install libc6-dev-i386为配置32位环境做准备

  • 使用gdb调试器,调出汇编代码

  • 使用命令l查看代码并使用命令b 13在main()处设置断点,后再输入命令run,使用命令disassemble获取汇编代码,输入命令info registers查看当前各寄存器的值

    可见此时主函数的栈基址为0xffffd048,查看其内容为0

  • 输入命令display /i $pc使得每次执行下一条汇编语句时,均打印出当前执行的代码

  • 调用f函数,call指令将下一句要执行的指令的地址入栈

  • 将f函数的基地址入栈,可发现sp寄存器的值发生变化

  • 执行sub语句

  • 执行赋值语句

  • f函数的汇编代码

  • 实参入栈:

  • call指令将下一条指令的地址入栈:

  • 执行系列运算指令


  • pop %ebp指令将栈顶弹到%ebp中,同时%esp增加4字节:

  • ret指令将栈顶弹给%eip:

  • 因为函数f修改了%esp,所以用leave指令恢复。leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp:

缓冲区溢出漏洞实验

  • 缓冲区溢出:向缓冲区写入超出预分配固定长度的数据。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。

  • 因实验楼提供的是64位的环境,因此首先要配置32位的环境,输入以下三个命令,为之后的实验做好准备

sudo apt-get update

sudo apt-get install lib32z1 libc6-dev-i386

sudo apt-get install lib32readline-gplv2-dev

  • 输入命令sudo sysctl -w kernel.randomize_va_space=0关闭系统使用地址空间随机化来随机堆和栈的初始地址

  • 创建另一个shell程序(zsh)代替/bin/bash

  • 编写漏洞程序

  • 编译stack.c程序并设置SET-UID

  • 编写攻击程序

  • 得到shellcode在内存中的地址

  • 计算shellcode的地址并修改exploit.c中x??x??x??x??代码,如下图所示:

  • 运行攻击程序exploit和漏洞程序stack,通过攻击得到root权限

原文地址:https://www.cnblogs.com/rafell/p/7750032.html