2017-2018-1 20155308 《信息安全系统设计基础》第六周课上+课下测试
本次测试我在课上已经做完了前四个练习,所以以下博客是我补的第五个测试和课下的练习
测试内容
- 通过输入
gcc -S -o main.s main.c
将下面c程序”week0603学号.c“编译成汇编代码
int g(int x){
return x+3;
}
int f(int x){
int i = 学号后两位;
return g(x)+i;
}
int main(void){
return f(8)+1;
}
参考 http://www.cnblogs.com/lxm20145215----/p/5982554.html ,使用gdb跟踪汇编代码,在纸上画出f中每一条语句引起的eip(rip),ebp(rbp),esp(rsb),eax(rax)的值和栈的变化情况。提交照片,要有学号信息。
实验过程
- 首先将打入代码到example.c文件中,然后用
cat -n example.c
查看代码。
使用gdb
- 设置断点:
b 9
- 获取汇编代码
disassemble
打印出当前寄存器
info registers
结合display命令和寄存器或pc内部变量。输入命令
display /i
$pc使得每次执行下一条汇编语句时,均打印出当前执行的代码。call指令将下一句要执行的指令的地址入栈。
将上一个函数的基址入栈
执行sub
执行赋值语句
f函数的汇编代码
实参入栈:
下一条指令的地址入栈:
执行系列运算指令
- 将栈顶弹到%ebp中,同时%esp增加4字节:
将栈顶弹给%eip:
- 所以用leave指令恢%esp复
leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp。
实验中的错误
- 我在实验过程中遇到了这个问题:
我加入了指令sudo apt-get install libc6-dev-i386
安装一个库。之后就可以正常进行了。
P97(课下测试1)
2.96
- 题目要求
遵循位级浮点编码规则,实现具有如下原型的函数:
/*
*Compute (int) f.
*If conversion causes overflow or f is NaN, return
*/
int float_f2i(float bits f);
对于浮点数f,这个函数计算(int)f。如果f是NaN,你的函数应该向零舍人。如果f不能用整数表示(例如,超出表示范围,或者它是一个NaN),那么函数应该返回。x800000000测试你的函数,对参数f可以取的所有2^32个值求值,将结果与你使用机器的浮点运算得到的结果相比较。
- 怎么判断f是不是NaN
#define isnan(x) \
( sizeof(x) == sizeof(float) ? __inline_isnanf((float)(x)) \
: sizeof(x) == sizeof(double) ? __inline_isnand((double)(x)) \
: __inline_isnanl((long double)(x)))
- 代码
https://gitee.com/haowenfei25/XinXiAnQuanXiTongSheJiJiChu20155308/blob/master/ketang/shu296.c
- 运行结果
2.97
- 题目和要求
遵循位级浮点编码规则,实现具有如下原型的函数:
/*Compute (float) i*/
float bits float_i2f(int i);
对于函数i,这个函数计算(float) i的位级表示。
测试你的函数,对参数f可以取的所有2^32个值求值,将结果与你使用机器的浮点运算得到的
结果相比较。
- 与上题不同的地方在于:
主函数加了一个循环,不用每次输入都运行。
- 代码
https://gitee.com/haowenfei25/XinXiAnQuanXiTongSheJiJiChu20155308/blob/master/ketang/shu297.c
- 运行结果
实验楼(课下测试2)
- 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
- 输入命令“linux32”进入32位linux环境。此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,所以输入“/bin/bash”使用bash:
创建另一个shell程序(zsh)代替/bin/bash
编译
- 运行攻击程序exploit和漏洞程序stack,通过攻击得到root权限
实验中的问题
- 没有进入文件