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 updatesudo apt-get install lib32z1 libc6-dev-i386sudo 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权限