2017-2018-1 20155314 《信息安全系统设计基础》第5周学习总结
教材学习内容总结
学习目标
- 理解逆向的概念
- 掌握X86汇编基础,能够阅读(反)汇编代码
- 了解ISA(指令集体系结构)
- 理解函数调用栈帧的概念,并能用GDB进行调试
教材内容提炼
第2章 信息的表示和处理
- 三种最重要的数字表示
- 无符号编码:表示大于或等于零的数字
- 补码编码:表示有符号整数的最常见方式
- 浮点数编码:表示实数的科学记数法的以2为基数的版本
- 信息存储
- 虚拟内存:机器级程序将内存视为一个非常大的字节数组,称为虚拟内存
- 十六进制表示法
- 字数据大小
- 一个字长为w位的机器,虚拟地址的范围为0~2^w-1,程序最多访问2^w个字节
- 向后兼容:大多数64位机器也可以运行为32位机器编译的程序
- ISO C99引入一类数据类型,其数据大小是固定的,不随编译器和机器设置而变化
- int32_t:4字节
- int64_t:8字节
- 对关键字的顺序以及包括还是省略可选关键字来说,C语言允许存在多种形式:如
unsigned long
、unsigned long int
、long unsigned
、long unsigned int
均等价
- 寻址和字节顺序
- 小端法:最低有效字节在最前面
- 大端法:最高有效字节在最前面
- 表示字符串
- 表示代码
- 布尔代数简介
- 布尔环中加法运算是^,每个元素的加法逆元都是它自己本身,即对于任何值a,a^a=0
- C语言中的位级运算(按位布尔运算)
- |
- &
- ~
- ^
- C语言中的逻辑运算(逻辑运算认为所有非零的参数都表示TRUE(返回1),而参数0表示FALSE(返回0))
- ||
- &&
- !
- C语言中的移位运算
- 左移
- 右移
- 逻辑右移:在左端补k个0
- 算术右移:在左端补k个最高有效位的值
- 整数表示
- 整型数据类型
- 无符号数的编码
- 补码编码
- 有符号数和无符号数之间的转换
- C语言中的有符号数与无符号数
- 扩展一个数字的位表示
- 截断数字
- 关于有符号数与无符号数的建议
- 整数运算
- 无符号加法
- 补码加法
- 补码的非
- 无符号乘法
- 补码乘法
- 乘以常数
- 除以2的幂
- 关于整数运算的最后思考
- 浮点数
- 二进制小数
- IEEE浮点表示
- 数字示例
- 舍入
- 浮点运算
- C语言中的浮点数
- 从
int
转成float
:数字不会溢出,但可能被舍入 - 从
int
或float
转成double
:能保留精确的数值 - 从
double
转成float
:值可能溢出成+∞或-∞,还可能被舍入 - 从
float
或double
转成int
:值将会向零舍入
- 从
课后实践:mybash
实践要求
加分题-mybash的实现
- 使用fork,exec,wait实现mybash
- 写出伪代码,产品代码和测试代码
- 发表知识理解,实现过程和问题解决的博客(包含代码托管链接)
我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#define MAXARGS 20
#define ARGLEN 100
int mybash20155314(char *arglist[])
{
int pc,pr;
pc=fork();
pr=wait(NULL);
if(pc==0) execute(arglist);
else return 0;
}
int execute(char *arglist[])
{
execvp(arglist[0],arglist);
perror("execvp failed");
exit(1);
}
char *makestring(char *buf)
{
char *cp;
buf[strlen(buf)-1] = '\0';
cp = malloc( strlen(buf)+1 );
if ( cp == NULL ){
fprintf(stderr,"no memory\n");
exit(1);
}
strcpy(cp, buf);
return cp;
}
int main() {
char *arglist[MAXARGS + 1];
int numargs;
char argbuf[ARGLEN];
numargs = 0;
while (numargs < MAXARGS) {
printf("Arg[%d]? ", numargs);
if (fgets(argbuf, ARGLEN, stdin) && *argbuf != '\n')
arglist[numargs++] = makestring(argbuf);
else {
if (numargs > 0) {
arglist[numargs] = NULL;
mybash20155314(arglist);
numargs = 0;
}
}
}
return 0;
}
运行截图
教材学习中的问题和解决过程
- 问题1:什么是GCC?
- GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。
- 问题2:什么是汇编和反汇编?
- 汇编(Assembly):把汇编语言翻译成机器语言的过程
- 反汇编(Disassembly):把目标代码转为汇编代码的过程
- 问题3:什么是GUI?
- 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。
代码调试中的问题和解决过程
macOS High Sierra下终端man命令中文显示问题
解决方法
代码托管
上周考试错题总结
main.c 调用了静态库libmath.a中的函数,编译main.c的命令是()
A. gcc -static main.c ./libmath.a -o main
B. gcc -static main.c -L. -lmath -o main
C. gcc -static main.c -L. -llibmath.a -o main
D. gcc -static main.o ./libmath.a -o main
【错选】B D
【答案】A B
dll,so文件的链接是运行在()
A. 编译时
B. 加载时
C. 运行时
D. 链接时
【错选】D
【答案】C
结对及互评
本周结对学习情况
- 20155323
- 结对学习内容
- 教材第1章 计算机系统漫游
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:5小时
实际学习时间:2小时