sin(x)

Category: 读书笔记

深入理解计算机系统:缓存实验

缓存实验由两部分组成:模拟缓存程序的实现和局部性优化。

第一部分:缓存模拟程序

第一部分的任务就是写一个cache模拟器,程序读取一个读写指令,判断出这一条指令时hit还是miss,如果是miss并且原来的cache已经满了,就需要eviction。

Continue reading

深入理解计算机系统:Unix Shell实验

这个实验(文件下载)就是写一个简单的Unix Shell,也就是读取命令,创建进程,运行程序,reap僵尸进程等功能,实验文件当中已经设计好了基本框架,只要把几个函数填上就好了完整代码

eval

这是一个非常重要的函数,它要负责命令的执行。需要注意以下几点: ​

  1. 避免子进程在添加到列表之前被reap掉,在运行程序和添加任务的过程中务必要屏蔽SIGCHLD。由于子进程会集成父进程的特性,所以记得要在子进程中调用execve前解除屏蔽;

  2. 子进程和父进程在同一个进程组之中,为了避免Signal对子进程的运行产生干扰,应该把子进程放入一个新的进程组,所以要在调用execve前调用setpgid(0, 0);

  3. 由于子进程的reap依赖于SIGCHLD,所以waitfg的调用要放在解除屏蔽之后。

Continue reading

深入理解计算机系统:缓冲区溢出攻击实验

这个实验(文件下载)非常好玩!这个实验没有标准答案。

在开始这个实验之前记得建立cookie,并且在运行bufbomb的时候一定要传入cookie,需要hex2raw这个工具把我们的十六进制攻击代码转化为字符串:

zhang@zhang-virtual-machine:~/CSAPP/buflab$ ./makecookie zzh
0x2552e1a9
zhang@zhang-virtual-machine:~/CSAPP/buflab$ ./hex2raw < level0.txt | ./bufbomb -u zzh
Userid: zzh
Cookie: 0x2552e1a9
Type string:Smoke!: You called smoke()
VALID
NICE JOB!

和上一个实验一样,我需要对程序进行反编译,查看程序的汇编代码。我们先来观察一下getbuf函数,它是我们注入攻击代码的入口:

080491f4 <getbuf>:
 80491f4:	55                   	push   %ebp
 80491f5:	89 e5                	mov    %esp,%ebp
 80491f7:	83 ec 38             	sub    $0x38,%esp
 80491fa:	8d 45 d8             	lea    -0x28(%ebp),%eax
 80491fd:	89 04 24             	mov    %eax,(%esp)
 8049200:	e8 f5 fa ff ff       	call   8048cfa <Gets>
 8049205:	b8 01 00 00 00       	mov    $0x1,%eax
 804920a:	c9                   	leave  
 804920b:	c3                   	ret

Continue reading

深入理解计算机系统:二进制炸弹实验

这个实验(文件下载)考察我们的“逆向工程”的能力,我对自己的完成速度(我的答案)还是很满意的。

首先,我们要使用objdump对程序进行反编译操作,获得反编译文件

Phase 1

这一步是判断输入字符串和目标字符串Public speaking is very easy.是否相同,如果相同就可以通过,所以答案就是Public speaking is very easy.了。

08048b20 <phase_1>:
 8048b20:	55                   	push   %ebp
 8048b21:	89 e5                	mov    %esp,%ebp
 8048b23:	83 ec 08             	sub    $0x8,%esp				
 8048b26:	8b 45 08             	mov    0x8(%ebp),%eax				# Get input string
 8048b29:	83 c4 f8             	add    $0xfffffff8,%esp
 8048b2c:	68 c0 97 04 08       	push   $0x80497c0					# Pass answer string
 8048b31:	50                   	push   %eax							# Pass input string
 8048b32:	e8 f9 04 00 00       	call   8049030 <strings_not_equal>	# Call string_not_equal
 8048b37:	83 c4 10             	add    $0x10,%esp
 8048b3a:	85 c0                	test   %eax,%eax					# Test %eax
 8048b3c:	74 05                	je     8048b43 <phase_1+0x23>		# If string_not_equal return 0, go to phase_2
 8048b3e:	e8 b9 09 00 00       	call   80494fc <explode_bomb>		# Call explode_bomb
 8048b43:	89 ec                	mov    %ebp,%esp
 8048b45:	5d                   	pop    %ebp
 8048b46:	c3                   	ret    
 8048b47:	90                   	nop

Continue reading

深入理解计算机系统:位操作实验

这是《深入理解计算机系统》的第一个实验(文件下载),从大一下的期中开始做,直到暑假才得以完成(答案)。本实验要求对计算机编码的了解和一定的编程技巧,有很高的趣味性。 ​

位操作

BitAnd

用德摩根律轻松解决。

/*
* bitAnd - x&y using only ~ and |
*   Example: bitAnd(6, 5) = 4
*   Legal ops: ~ |
*   Max ops: 8
*   Rating: 1
*/
int bitAnd(int x, int y) {
  return ~(~x|~y);
}

Continue reading

Newer posts »

Copyright © 2019 sin(x)

Theme by Anders Noren, host by Coding PagesUp ↑