20135328信息安全系统设计基础第八周期中总结

信息安全系统设计基础第八周期中总结

第八周(10.26-11.01):期中总结

一、学习目标

复习前面Linux 命令,Linux 编程基础,教材前七章内容

二、学习资源

  1. 教材
    2.答案解析见http://group.cnblogs.com/topic/73060.html
    考试中错的最多的会再考,关注一下排名前十的同学做错的题目

三、学习方法

  1. 进度很重要:必须跟上每周的进度,阅读,练习,问答,项目。我会认真对待每一位同学,请你不要因为困难半途而废。
  2. 问答很重要:遇到知识难点请多多提问,这是你的权利更是您对自己负责的义务。问答到博客园讨论小组:http://group.cnblogs.com/103791/
  3. 实践很重要:解决书中习题,实践书中实例,完成每周项目,才算真的消化了这本好书。通过实验楼环境或自己安装的虚拟机在实践中进行学习
  4. 实验报告很重要:详细记录你完成项目任务的思路,获得老师点评和帮助自己复习。学习完成后在博客园中(http://www.cnblogs.com/)把学习过程通过博客发表,博客标题“信息安全系统设计基础第八周期中总结”

四、学习任务

  1. 复习Linux命令,特别是man -k, cheat, grep -nr xxx /usr/include
  2. 复习vi, gcc, gdb,make的使用
  3. 复习教材内容ch01 ch02 ch03 ch04 ch06 ch07
  4. 复习前面的考题(答案解析见http://group.cnblogs.com/topic/73060.html) ,下次考试考每次考试错的最多的题目

五、学习过程

week2:

linux命令
Linux Bash中,Ctrl+a快捷键的作用是将光标移至输入行头,相当于Home键。
Linux Bash中, man printf和man 1 printf 功能等价。
在 Linux 里面可以使用使用groups命令知道自己属于哪些用户组。
在 Linux 里面可以使用使用chmod命令修改文件的权限。
Linux中没有C盘,D盘,其文件系统的目录是由FHS标准规定好的。
Linux Bash中,cd ~ 命令可以切换到'home'目录,cd -切换到上一个目录。
Linux Bash中,强制删除test文件的命令是rm -f test
Linux Bash中,cat -n 和 nl 命令功能等价。
Linux Bash中,source 和 . 命令功能等价。
Linux Bash中,查找home目录中x天创建的文件的命令是find ~ -ctime x。
Linux Bash中,使用tar命令把home目录打包成home.tar的命令是 tar -cf home.tar ~
Linux Bash中,zip命令使用-e参数可以创建加密压缩包。
Linux Bash中,df和 du 命令功能不等价
Linux Bash中,ls . | sort 命令的功能是显示当前目录内容并排序
Linux Bash中,使用grep查找当前目录下*.c中main函数在那个文件中的命令是grep main *.c
Linux Bash中,使用wc统计hello.c共有几行代码的的命令是wc -l hello.c
Linux Bash中,把ls命令显示当前目录的结果存入ls.txt的命令输出重定向命令是ls > ls.txt
Linux Bash中,tee命令可以同时重定向到多个文件。
vi中查看函数qsort的帮助文档的快捷键为K
Linux中显示文件file属性status的命令stat
使用du命令对当前目录下的目录或文件按大小排序 的命令是du -sk *| sort -rn
grep ~/test 文件夹下有很多c源文件,查找main函数在哪个文件中的命令grep main *.c
gdb中next和step都可以单步跟踪,根据自顶向下原则应该优先选用next.
数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch
To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )
查找当前目录下所有目录的find命令是(find . -type d)
查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include

vim编辑器

关于vim的学习过程主要通过vimtutor练习教程实践实现。[1]

(1)文本简单操作
光标在屏幕文本中的移动既可以用箭头键,也可以使用 hjkl 字母键。
h (左移) j (下行) k (上行) l (右移)
欲进入vim编辑器(从命令行提示符),请输入∶vim 文件名 <回车>
欲退出vim编辑器输入以下命令放弃所有修改∶:q!<回车>
输入以下命令保存所有修改∶ :wq <回车>
在正常模式下删除光标所在位置的字符,请按∶ x
在光标所在位置开始插入文本,请按∶i 输入必要文本

(2)删除与撤销
欲从当前光标删除至单字/单词末尾,请输入∶dw
欲从当前光标删除至当前行末尾,请输入∶d$
欲删除整行,请输入∶dd
在正常模式下一个命令的格式是∶[number] command object 或 command [number] object
number - 代表的是命令执行的次数
command - 代表要做的事情,比如 d 代表删除
object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
欲撤消以前的操作,请输入∶u (小写的u)
欲撤消在一行中所做的改动,请输入∶U (大写的U)
欲撤消以前的撤消命令,恢复以前的操作结果,请输入∶CTRL-R

(3)置入、替换和更改
要重新置入已经删除的文本内容,请输入小写字母 p。该操作可以将已删除的文本内容置于光标之后。如果最后一次删除的是一个整行,那么该行将置于当前光标所在行的下一行。
要替换光标所在位置的字符,请输入小写的 r 和要替换掉原位置字符的新字符即可。
更改类命令允许您改变指定的对象,从当前光标所在位置直到对象的末尾。比如输入 cw 可以替换当前光标到单词的末尾的内容;输入 c$ 可以替换当前光标到行末的内容。
更改类命令的格式是∶

[number] c object 或者 c [number] object

(4)定位与搜索
Ctrl-g 用于显示当前光标所在位置和文件状态信息。Shift-G 用于将光标跳转至文件最后一行。先敲入一个行号然后按 Shift-G 则是将光标移动至该行号代表的行。
输入 / 然后紧随一个字符串是则是在当前所编辑的文档中向后查找该字符串。
输入问号 ? 然后紧随一个字符串是则是在当前所编辑的文档中向前查找该字符串。完成一次查找之后按 n 键则是重复上一次的命令,可在同一方向上查找下一个字符串所在;或者按 Shift-N 向相反方向查找下该字符串所在。
如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的
括号上。
在一行内替换头一个字符串 old 为新的字符串 new,请输入 😒/old/new
在一行内替换所有的字符串 old 为新的字符串 new,请输入 😒/old/new/g
在两行内替换所有的字符串 old 为新的字符串 new,请输入 :#,#s/old/new/g
在文件内替换所有的字符串 old 为新的字符串 new,请输入 :%s/old/new/g
进行全文替换时询问用户确认每个替换需添加 c 选项,请输入 :%s/old/new/gc

(5)外部命令与文件

:!command 用于执行一个外部命令 command。

例子∶

:!dir - 用于显示当前目录的内容。

:!rm FILENAME - 用于删除名为 FILENAME 的文件

:w FILENAME 可将当前 VIM 中正在编辑的文件保存到名为FILENAME 的文件中。 :#,#w FILENAME
可将当前编辑文件第 # 行至第 # 行的内容保存到文件FILENAME 中。 :r FILENAME 可提取磁盘文件 FILENAME

并将其插入到当前文件的光标位置后面。

(6)插入
输入小写的 o 可以在光标下方打开新的一行并将光标置于新开的行首,进入插入模式。
输入大写的 O 可以在光标上方打开新的一行并将光标置于新开的行首,进入插入模式。
输入小写的 a 可以在光标所在位置之后插入文本。
输入大写的 A 可以在光标所在行的行末之后插入文本。
输入大写的 R 将进入替换模式,直至按 键退出替换模式而进入正常模式。
输入 :set xxx 可以设置 xxx 选项。

(7)在线帮助
按下 键 (如果键盘上有的话)
按下 键 (如果键盘上有的话)
输入 :help <回车>
提供一个正确的参数给":help"命令,您可以找到关于该主题的帮助。

(8)vim功能
开始编辑vimrc文件,这取决于您所使用的操作系统∶

:edit ~/.vimrc 这是Unix系统所使用的命令
:edit $VIM/_vimrc 这是Windows系统所使用的命令

接着导入vimrc范例文件∶:read $VIMRUNTIME/vimrc_example.vim
保存文件,命令为∶:write

(9)宏录制
qa 操作序列 q, @a, @@
qa 把你的操作记录在寄存器 a。于是 @a 会replay被录制的宏。
@@ 是一个快捷键用来replay最新录制的宏。

(10)分屏
:split → 创建分屏 (:vsplit创建垂直分屏)
dir:dir就是方向,可以是 hjkl 或是 ←↓↑→ 中的一个,其用来切换分屏。
_ (或 |) : 最大化尺寸 (| 垂直分屏)

  • (或 -) : 增加尺寸

GCC编译的四个步骤:

选项可以简记为“ESc”,相应的产出文件的后缀可以简记为“iso”

2 静态链接库的生成:ar rcsv libxxx.a xxx.o

静态库的使用: gcc -o main main.c -L. -lxxx 注意-L -l 的含义

3 共享库的生成

gcc -fPIC -c xxx.c
gcc -shared -o libxxx.so xxx.o

共享库的使用:gcc -o main main.c -L. -lxxx

教材重点:

教材第一章:
p1 理解信息就是位+上下文
p2 查看源文件可以用od 命令 : od -tc -tx1 hello.c
p5 冯式结构,理解p6 CPU执行指令的操作(加载、存储、操作、跳转)
p9 存储系统的核心思想:缓存
p10 操作系统核心抽象(文件、虚存、进程、虚拟机):可以指导大家学习《操作系统》
教材第七章:
p450 链接器的两个任务、目标文件的三种形式、目标文件格式(a.out COFF
PE ELF) :这四种格式,特别是PE,ELF格式是信安专业同学要掌握的,是研究病毒等恶意代码的基础。
p451: ELF文件格式:试试readelf命令
p455: 理解全局符号的解析:学会多个模块。
p473: 处理目标文件的工具
p20: 三种数字:无符号数、有符号数(2进制补码)、浮点数,信息安全系同学从逆向角度考虑为什么会产生漏洞
教材第二章
p22: 进制转换,注意拿二进制作中间结果就好转了
p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码
p26: 字节顺序是网络编程的基础,记住小端是“高对高、低对低”,大端与之相反就可以了。
p28: 代码执行一下
p32: 能区分逻辑运算(结果是1或0)和位运算(结果是位向量),所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。
p33: 掩码是位运算的重要应用,对特定位可以置一,可以清零
p38: 要用C99中的“long long”类型,编译是要用 gcc -std=c99
p39: 补码的利用寄存器的长度是固定的特性简化数学运算。想想钟表,12-1 等价于 12 + 11,利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。
p44: 注意C语言中有符号数和无符号数的转换规则,位向量不变。想想第一章说的 信息就是“位+上下文”
p48: 怎么样让负数等于正数? 信息安全的逆向思维
p49: 0扩展和符号扩展
p52: 深入思考一下代码和结果
p54: 如何让整数运算溢出?如何避免? p62例子看看
p67: 关于整数运算的最后思考
p67: 浮点数有科学计数法的基础就不难理解,IEEE标准754
p68: 浮点数运算的不精确性与舍入
p70: IEEE浮点标准,float/double类型
p74: 整数与浮点数表示同一个数字的关系
p78: 整数与浮点数转换规则
教材第三章
本章学习内容是汇编语言,现在直接写汇编的机会不多了,但一定要能读懂,信息安全的核心思维方式“逆向”在这有很好很直接的体现,反汇编就是直接的逆向工程。
本章重点是3.7,但没有3.1-3.6的基础也是不行,如果想真正的提高动手能力,3.11如何用GDB调试汇编要好好练习一下,不过大多GDB技巧大家都会了。
p104, p105: X86 寻址方式经历三代:
1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
2 8086的分段模式
3 IA32的带保护模式的平坦模式
p106: ISA的定义,ISA需要大家能总结规律,举一反三,比如能对比学习ARM的ISA;PC寄存器要好好理解;
p107: gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧,应该理解、熟记。
注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c
MAC OS中没有objdump, 有个基本等价的命令otool
Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
p108: 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt
p109: gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读
p110: 了解Linux和Windows的汇编格式有点区别:ATT格式和Intel格式
p111: 表中不同数据的汇编代码后缀
p112: 这几个寄存器要深入理解,知道它们的用处。esi edi可以用来操纵数组,esp ebp用来操纵栈帧。
对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,大家要理解32位的eax,16位的ax,8位的ah,al都是独立的,我们通过下面例子说明:
假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw $0x8266, %ax指令后eax的值是多少?
解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出.
p113: 结合表,深入理解各种 寻址方式;理解操作数的三种类型:立即数、寄存器、存储器;掌握有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
p114: MOV相当于C语言的赋值”=“,注意ATT格式中的方向, 另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。能区分MOV,MOVS,MOVZ,掌握push,pop
p115/p116: 栈帧与push pop; 注意栈顶元素的地址是所有栈中元素地址中最低的。
p117: 指针就是地址;局部变量保存在寄存器中。
p119: 结合表理解一下算术和逻辑运算, 注意目的操作数都是什么类型
特别注意一下减法是谁减去谁
注意移位操作移位量可以是立即数或%cl中的数
p123: 结合C语言理解一下控制部分,也就是分支(if/switch),循环语句(while, for)如何实现的。考验大家举一反三的学习能力。控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto)
p124: 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器)
注意leal不改变条件码寄存器
思考一下:CMP和SUB用在什么地方
p125: SET指令根据t=a-b的结果设置条件码
p127: 跳转与标号
p130/p131: if-else 的汇编结构
p132/p133: do-while
p134/p135: while
p137/p138: for
p144/p145: switch
p149: IA32通过栈来实现过程调用。掌握栈帧结构,注意函数参数的压栈顺序.
p150/p151: call/ret; 函数返回值存在%eax中
p174: bt/frame/up/down :关于栈帧的gdb命令
教材第四章
本章内容是处理器体系结构,重点掌握ISA,并能举一反三;本章带着大家设计并实现了一个结合CISC和RISC思想的处理器Y86,一个类IA32体系的处理器;ISA在编译器编写者和处理器设计者之间提供了一个抽象。
本章重点是4.1-4.3
教材第六章
了解存储设备的类型和特点;重点理解局部性原理和缓存思想在存储层次结构中的应用
重点练习题:6.2,6.3,6.4,6.8,6.9,6.10,6.11,6.12, 6.13
6.1 节
了解三种常见存储技术:RAM/ROM/磁盘;
RAM有SRAM和DRAM,特点和应用;
ROM有PROM,EPROM,E2PROM,FLASH;
磁盘是重点,涉及到后面的i/o和文件系统,做好相关练习
磁盘结构:盘片、磁道、扇区、间隙、柱面;磁盘驱动器
磁盘容量
访问时间:寻道、旋转、传送
逻辑磁盘块:这个很重要,内存可以看成字节数组、磁盘可以看成块数组
总线
数据总线、控制总线、地址总线
系统总线、存储总线、I/O总线:p395图要理解
读写事务:P389图要能理解
6.2 节
局部性原理:时间局部性、空间局部性,有能力者理解一下p429最后一段“存储器山”
数据引用局部性
取指令局部性
6.3 节
存储层次结构:系统观(1+1>2)(举一反三:对称不对称加密形成的混合加密系统,混合动力汽车...)
中心思想:每层存储设备都是下一层的“缓存”
对照p408的表理解
6.4节
高速缓存结构(S,E,B,m):高速缓存组、高速缓存行、块
映射
命中
缓存管理

错题复习

  • man -k 填空: 数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch)

  • cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )

  • C语言中,全局变量是强符号。(X)

    -

  1. 在vi中,查看scanf和printf man pages(帮助文档)的命令分别是?(2分)
    K 3K

  2. 编译和运行以上代码的命令(2分)
    gcc *.c -o main
    ./main

  3. 使用GDB调试以上代码:编译代码的命令是?main.c中如何给main函数设置断点?如何在第六行设置断点?(3分)
    gcc -g *.c -o main
    b main
    b 6

  4. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?(3分)
    gcc -c add.c sub.c mul.c div.c
    ar rcvs libmymath.a add.o sub.o mul.o div.o
    gcc main.c -o main -L. -lmymath (or gcc main.c ./libmymath.a -o main)

  5. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?(4分)

     gcc -fPIC -c add.c sub.c mul.c div.c
     gcc -shared -o libmymath.so add.o sub.o mul.o div.o
    

    gcc -o main main.c -L. -lmymath
    libmymath.so 要拷贝到/lib or /usr/lib

  6. 写出编译上面代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.(4分)

    testmymath: main.o add.o sub.o mul.o div.o
    gcc main.o add.o sub.o mul.o div.o -o testmymath
    main.o: main.c head.h
    gcc -c main.c
    add.o: add.c head.h
    gcc -c add.c
    sub.o: sub.c head.h
    gcc -c sub.c
    mul.o: mul.c head.h
    gcc -c mul.c
    div.o: div.c head.h
    gcc -c div.c

六、遇到的问题及解决

  1. 有的知识点当时就没学得很扎实,再看像再学一遍一样。
  2. vim使用不熟练.
  3. 计算机硬件部分相对好理解,但细化到各部分联系还是不够明白。
  4. 赶进度。

七、其他

半个学期转眼就过去了,实在是太快了,再年轻时间也是不够的,这个学期很多事,自己也找了些事来做,现在看来是太高估自己了,但不后悔,就像李笑来老师的书中说的一样,不要妄图去管理时间,去尝试和时间做朋友。我现在欠缺的就是这点吧。
希望后半学期在课程上跟上进度,多学到些实实在在有些用的东西,技多不压身,也别让自己,只是看起来很努力。


  1. 本段摘自20135317韩玉琪博客园 ↩︎

posted on 2015-10-27 18:42  海的沉淀  阅读(191)  评论(1编辑  收藏  举报

导航