2017-2018-1 20155214 《信息安全系统设计基础》 第6周课下作业

2017-2018-1 20155214 《信息安全系统设计基础》

第6周课下作业


第6周课上练习

练习1
1.参考附图代码,编写一个程序 “week0601学号.c",判断一下你的电脑是大端还是小端。
2. 提交运行结果”学号XXXX的笔记本电脑是X端“的运行截图,要全屏,包含自己的学号信息

练习2

  1. 调用附图代码,编写一个程序 “week0602学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。
  2. 提交运行结果截图,要全屏,要包含自己的学号信息

练习3

  1. 编写一个程序 “week0603学号.c",运行下面代码:
    1 short int v = -学号后四位
    2 unsigned short uv = (unsigned short) v
    3 printf("v = %d, uv = %u ", v, uv);
  2. 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息
    3 分析p /x v; p /x uv 与程序运行结果的不同和联系

练习4
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. 删除汇编代码中 . 开关的代码,提交f 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码

练习5
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)的值和栈的变化情况。提交照片,要有学号信息。

作业目录
1.缓冲区溢出漏洞实验
2.遵循位级浮点编码规则实现函数

遵循位级浮点编码规则实现函数

题目要求

/*
*Compute (int)f.
*If conversion causes overflow or f is NaN,return 0x80000000 
*/
int float_f2i(float _bits f);

对于浮点数f,这个函数计算(int)f.如果f是NaN,向0舍入。如果f不能用整数表示,那么函数应该返回0x80000000.

源代码

……
int float_ftoi(float_bits f)
{
    unsigned sign=f>>31;
    unsigned exp = (f>>23)&0xff;
    unsigned frac = f&0x7fffff;

    if(exp == 0)
        return 0;
    if(exp == 0xff)
        return 0x80000000;
    unsigned m = frac+0x800000;
    
    int e =exp-127;
    if(e<0)
        return 0;
    else if(e>31)
        return 0x80000000;
    else if(e<23)
        m>>(23-e);
    else
        m<<(e-23);
    return sign<<31|m;
}
……

/*Compute (float)i*/
float_bits float_i2f(int i);

对于浮点数f,这个函数计算(float)f的位级表示.

源代码

……
float_bits float_itof(int i)
{
   unsigned sign=0;
   unsigned exp=0;

   if(i<0)
    {
       i=-i;
       sign=1;
    }

   unsigned frac=i;
   i=i|(i>>1);
   i=i|(i>>2);
   i=i|(i>>4);
   i=i|(i>>8);
   i=i|(i>>16);
   i=i^(i>>1);
   frac=(frac-i);
   while(i>>=1)
    exp++;
   frac=(frac<<(23-exp)) & 0xFFFFFFFF;
   exp+=127;
   sign=sign & 1;
    exp=exp& 0xFF;
   printf("exp=%d	 frac=%d	 i=%d	",exp,frac,i);
    return(sign<<31)|(exp<<23)|frac;
}
……

运行结果

缓冲区溢出漏洞实验

实验背景

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

实验环境

  • 实验楼环境32位Ubuntu linux

实验内容

使用sudo sysctl -w kernel.randomize_va_space=0关闭Linux系统的地址空间随机化。

编写stack.c文件,其中badfile文件储存超出缓冲区字符数组buffer个数的字符数。

3.用 –fno-stack-protector 关闭栈保护机制。-z execstack用于允许执行栈。并赋予stack执行权限。

4.找到栈地址

5.找到shellcode执行地址,0xffffd560(h)+100 = 0xffffd5c4(h)

6.运行exploit和stack,通过运行/bin/sh获取系统权限root

练习内容

思考

本次实验利用缓冲区溢出漏洞攻击,由于缓冲区字符数组buffer只有12个字节,溢出后addr1,addr2,addr3,addr4覆盖了返回地址,当bof执行完后指针将返回到str[100]处,执行shellcode。如果执行shellcode,系统将会启动/bin/sh执行的shell线程,从而获取root权限。

原文地址:https://www.cnblogs.com/besti155214/p/7750304.html