《信息安全系统设计基础》家庭作业 6.32 7.6 7.8 7.13.7.14 8.20
第六章 6.32
6.32
- 假设程序使用6.31中的高速缓存,引用位于地址ox0718处的1字节字。
- A 0x718
- 12 11 10 9 8 7 6 5 4 3 2 1 0 (每个数字分别对应下面一位)
- 0 0 1 1 1 0 0 0 1 1 0 0 0
- B
- 参数 - 值
- 块偏移CO - 0x00
- 索引CI - 0x6
- 标记CT- 0x38
- 命中? - Yes
- 返回值- 0xFA
第七章 7.6 7.8 7.13 7.14
7.6
- 指出定义该符号的模块、符号类型以及在它模块中所处的节
7.8
- 说明链接器是如何解析在每个模块中有多重定义引用的
- A
- a)REF(main.1)-->DEF(main.1)
- b)REF(main.2)-->DEF(main.2)
- B
- UNKNOWN
- C
- ERROR
- A
7.13
- 这道题可以推测出来哪些代码需要重定位。
当然,我们假设所有的符号都已经有了运行时地址。-
.text中有3个地方有重定位。
-
第12行是调用p3,返回值被放在了edx中。
-
14行要将xp的值放入eax。这里的0x0其实应该重定位为xp的地址,所以这应该是一个绝对引用。
-
接着add (%eax),%edx,也就是完成了*xp + p3()。
-
然后再push %edx,作为参数压入栈。
-
第17行是调用p2()。最后返回。
-
所以.text中有三个地方需要重定位。
-
在.data节中,第一个x是不需要重定位的,第二个xp的值需要重定位为x的地址。
-
7.14
汇编代码其实比较好理解。eax是val,最开始val-100和5比较,如果大于5,就直接到16行去+6。
否则根据跳转表跳到相应的地址(edx*4+0)。
所以,重定位时,需要将所有的ja和jmp指令的目的地修改为对应的地址。
需要注意的是第8行,jmp *0x0(,%edx,4)这一句。
这里的0x0是指.rodata的地址,这是肯定需要重定位的。
在.rodata中,所有的跳转表都需要重定位到相应代码的位置。
第八章8.20
8.20
其实这道题不需要在环境变量里抓取name,只要用execve。
int main(int argc, char* args[])
{
execve("/bin/ls", args, environ); //没有错误处理,注意环境变量
return 0;
}