2017-2018-1 20155308 《信息安全系统设计基础》第六周课上+课下测试

2017-2018-1 20155308 《信息安全系统设计基础》第六周课上+课下测试

本次测试我在课上已经做完了前四个练习,所以以下博客是我补的第五个测试和课下的练习

测试内容

  1. 通过输入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;
}
  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
    1071573-20171029182033508-1943235736.png

  • 设置断点:b 9
  • 获取汇编代码disassemble
  • 打印出当前寄存器 info registers
    1071573-20171029182105383-1684662017.png

    1071573-20171029185821976-1865129565.png

  • 结合display命令和寄存器或pc内部变量。输入命令display /i $pc使得每次执行下一条汇编语句时,均打印出当前执行的代码。
    1071573-20171029190025055-805107361.png

  • call指令将下一句要执行的指令的地址入栈。
    1071573-20171029190138242-805279160.png

  • 将上一个函数的基址入栈
    1071573-20171029190241773-835255855.png

  • 执行sub
    1071573-20171029190339383-1769938346.png

  • 执行赋值语句
    1071573-20171029190430930-1923921211.png

  • f函数的汇编代码
    1071573-20171029190511336-1464785249.png

  • 实参入栈:
    1071573-20171029191233117-1322105209.png

  • 下一条指令的地址入栈:
    1071573-20171029191337398-618656725.png

  • 执行系列运算指令
    1071573-20171029191429070-1706281579.png

1071573-20171029191645226-1029455374.png

1071573-20171029191732320-512953068.png

  • 将栈顶弹到%ebp中,同时%esp增加4字节:
    1071573-20171029191843836-1384695247.png

1071573-20171029191937601-1090727925.png

  • 将栈顶弹给%eip:
    1071573-20171029192114914-1292839570.png

  • 所以用leave指令恢%esp复
  • leave指令先将%esp对其到%ebp,然后把栈顶弹给%ebp。
    1071573-20171029192322930-1307614999.png
    1071573-20171029202942617-2116376909.png

1071573-20171029205303351-717682065.png

1071573-20171029205310211-1704308866.png

实验中的错误

  • 我在实验过程中遇到了这个问题:

1071573-20171029192521398-535163160.png

我加入了指令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

  • 运行结果

1071573-20171206211807128-455253212.png

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

  • 运行结果

1071573-20171206211813534-690325501.png

实验楼(课下测试2)

  • 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
  • 输入命令“linux32”进入32位linux环境。此时你会发现,命令行用起来没那么爽了,比如不能tab补全了,所以输入“/bin/bash”使用bash:
  • 创建另一个shell程序(zsh)代替/bin/bash
    1071573-20171029222939570-1026015164.png

  • 编译
    1071573-20171029222945664-1213790587.png

1071573-20171029222952164-175987443.png

1071573-20171029222958336-44881548.png

1071573-20171029223005289-762705443.png

  • 运行攻击程序exploit和漏洞程序stack,通过攻击得到root权限
    1071573-20171029223011367-56941904.png
    1071573-20171029223859742-1315670433.png

实验中的问题

1071573-20171029222932289-1995483695.png

  • 没有进入文件

转载于:https://www.cnblogs.com/JIUSHA/p/7751246.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值