2017-2018-1 20155339 《信息安全系统设计基础》第六周课堂实践博客

2017-2018-1 20155339 《信息安全系统设计基础》第六周课堂实践博客

未完成课堂实践

实践二

1.调用附图代码,编写一个程序 “week0602学号.c",用show_int(), show_float()打印一下你的4位学号,参考教材P33打印出匹配的位序列。

  1. 提交运行结果截图,要全屏,要包含自己的学号信息

  2. 参考教材p82,给出出匹配的位序列的推导过程

  • 这个实践我没能完成的原因是,在编匹配序列时对老师的要求理解错误,在错误的方向挣扎太久,课后与同学讨论,才明白过来。对于匹配,方法一:可以将通过show_int(),show_float()打印出来的整型和浮点型转化成二进制,再进行匹配,这种方法需要注意的是我们的电脑是小端。第二种方法:首先把5339转化为二进制[1010011011011],通过将二进制小数点左移12位,我们创建这个数的一个规格化表示,得到5339=1.010011011011(2)*2的12次方,丢弃开头的1,并且在末端添加10个0,来构造小数字段,得到二进制表示[0100110110110000000000]。接下来构造阶码字段,我们用12加上偏置量127,得到139,其二进制表达式为[10001011]。加上符号位0,就得到了二进制浮点数表示[0100010110100110110110000000000].由此得到匹配的位序号:[1010011011011]
  • 运行结果如下:

实践三

  1. 编写一个程序 “week0603学号.c",运行下面代码:
    1 short int v = -5339
    2 unsigned short uv = (unsigned short) v
    3 printf("v = %d, uv = %u\n ", v, uv);

  2. 在第三行设置断点用gdb调试,用p /x v; p /x uv 查看变量的值,提交调试结果截图,要全屏,要包含自己的学号信息

3 分析p /x v; p /x uv 与程序运行结果的不同和联系

  • 我用的是gcdb,关于cgdb的调试再次就不多赘述了,这道题其实课上有提交,但课后发现没有看清楚,只是用了p打印出了v和uv的值,在此处要求的是p/x v与p/x uv,百度后发现这个是控制输出格式p/加上控制打印的进制和格式,例如:p/f输出浮点,p/c输出字符,p/x输出十六进制,因此与程序运行结果的区别是进制的不同,但是由于机器存的是补码,所以在p/x的情况下输出时一样的,,参考资料附在后面。
  • 运行截图

实践四

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 函数的汇编代码截图,图中用矩形标出函数栈帧的形成和销毁的代码
  • 由于第二题占用的时间较多,后面的题都是匆匆做了就交了,不够完备,所以在此再次给出过程与结果。
  • 汇编中以.开头的都可以删去,根据教材3.4.4,栈在处理过程中非常重要,栈是一种数据结构,可以添加或删除数据,需要遵循先进后出的原则。通过push操作把数据压入栈,通过pop操作删除数据,所以找到push以及pop就可以找到压入栈和删除数据的。

实践五

1 通过输入gcc -S -o main.s main.c 将下面c程序”week0603学号.c“编译成汇编代码

int g(int x){
   return x+3;
}
int f(int x){
    int i = 39;
   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(rsp),eax(rax)的值和栈的变化情况。提交照片,要有学号信息。
  • 学习了学长博客以及教材p164-p167的内容之后开始了这项内容,刚开始直接在64位的系统进行编译并且进入cgdb,发现好像有些出入,尝试了几次依旧如此,就试着用-m32指令,出现了错误,之后上网搜索,发现需要用sudo apt-get install libc6-dev-i386命令安装一个库,安装大概等了一两分钟,之后用-m32指令就可以了,进入cgdb,首先在主函数设置一个断点,run,使用disassemble获取汇编代码,,用i r 指令查看各寄存器的值,如下图

  • x来查看内存地址中的值。设置display /i $pc,这样就可以显示出即将执行的语句,之后只要使用si命令就可以了,如下图

  • 查看f函数的汇编代码
   0x080483e6 <+0>:     push   %ebp
   0x080483e7 <+1>:     mov    %esp,%ebp
   0x080483e9 <+3>:     sub    $0x10,%esp
   0x080483ec <+6>:     movl   $0x27,-0x4(%ebp)
   0x080483f3 <+13>:    pushl  0x8(%ebp)
   0x080483f6 <+16>:    call   0x80483db <g>
   0x080483fb <+21>:    add    $0x4,%esp
   0x080483fe <+24>:    mov    %eax,%edx
   0x08048400 <+26>:    mov    -0x4(%ebp),%eax
   0x08048403 <+29>:    add    %edx,%eax
   0x08048405 <+31>:    leave
   0x08048406 <+32>:    ret

  • 最终得到f中每一条语句引起的eip(rip),ebp(rbp),esp(rsp),eax(rax)的值和栈的变化情况,如下图

缓冲区溢出漏洞实验

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

在这一实验中,实验了很多次都不行,后来由于老师说在自己电脑上进行,我就在自己的虚拟机中进行,后来自己的虚拟机就不可以了。后来在实验楼又进行了多次,终于成功了。

  1. 按照实验步骤进行操作,攻击漏洞程序并获得root权限。
  • 按照实验步骤进行,注意我们的电脑是小端法,所以在输入地址时,注意倒过来,得到如下截图

2.通过命令”sudo sysctl -w kernel.randomize_va_space=2“打开系统的地址空间随机化机制,重复用exploit程序攻击stack程序,观察能否攻击成功,能否获得root权限。

  • 同样的步骤,只要将这个sudo sysctl -w kernel.randomize_va_space=0,设置改成sudo sysctl -w kernel.randomize_va_space=2,其他一样的步骤,但是得到的结果是段错误,修改了几次算了好几次地址也没改变,结果如下图

3.将/bin/sh重新指向/bin/bash(或/bin/dash),观察能否攻击成功,能否获得root权限。

  • 同样的步骤,得到的仍然是段错误,百度得到这两种情况是用来保护root,免收攻击,所以在这两种情况下,要想攻击是非常难的。

教材p97的家庭作业

2.96实现int float_f2i(float_bits f);

  • 首先,获得符号位,可以按位与上0x80000000,那么最高位只剩下符号位,向右移31位,那么s就是符号编码,再将其右移23位并且按位与上0xff,以获得8位阶码字段,再将原值按位与上0x7fffff,以获得23位小数字段,由于单精度规格化数的Bias是127,所以8位阶码字段减去Bias得到阶码的值,再通过阶码的值来判断其属于哪一类以及符号位的1,0,来返回得到的值,也就是得到的int。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef unsigned float_bits;
int float_f2i(float_bits f)
{
int exp,frac,E;
int  s=f&0x80000000;
exp=(f>>23)&0xff;
frac=(f&0x7fffff)|(1<<23);
E=exp-127;
if(E<0)return 0;
if(E>30) return 0x80000000;
if(E<=23){
frac=frac>>(23-E);
    if(s>>31) return -frac;
    else return frac;}
else {frac=frac<<(E-23);
if(s>>31) return -frac;
    else return frac;}
}

  • 最后进行测试,得到测试结果如下图:

2.97的实现

  • 2.97的实现,思路可以是主要参照的是教材p82,+-0的位表示为全为0的位表示,求得尾数值以及阶码值,再通过公式求出其位级表示。通过我自己的理解,编写了一个代码,并得到如下结果,但是自己感觉还是有些问题,所以想再研究一下,对于位级的理解自己好像也不是很明白,在网上搜了很多,但没有找到一点点相关的只是,所以希望老师可以讲讲。
    得到的结果如下:

感悟

对于这两章的内容发现自己真的没怎么看懂,再次回去看代码以及教材,对一些知识才有了一些理解,但还是不是很懂,而且有些知识网上也搜不到,比如位级这个,希望老师可以讲讲家庭作业的2.97怎么通过本章教材内容来编写,不是很懂,烦请老师可以讲一讲。

码云链接

posted @ 2017-10-29 18:42  20155339平措卓玛  阅读(276)  评论(0编辑  收藏  举报