11.2 第三章习题
3.46 (p196)
A
1 | 00 00 00 00 00 40 00 76 |
B
1 | 00 00 00 00 00 40 00 34 |
C
在 gets 后,程序返回地址被溢出数据修改为了 0x400034
D
由于 rbx 的值保存在了栈上,且被覆盖掉了,所以 rbx 的值被破坏了。
E
- result 应该要分配 strlen + 1 大小的空间,因为 strlen 返回的是字符串字符内容的长度,还需要额外一位存放 NULL Byte。
- 没有检查 malloc 返回的指针是否是 NULL。
3.58
1 | long decode2(long x, long y, long z) { |
3.60
A
由函数调用规约可知:x 和 n 分别存放在 rdi 和 rsi 中;result 显然存放在 rax 中。 然后就很明显了——mask 存放在 rdx 中。
B
movl $1, %edx
movl $0, %eax
result 初始值为 0,mask 初始值为 1。
C
testq %rdx, %rdx
jne .L3
如果 mask 不为 0,则继续循环。
D
movl %esi, %ecx
...
salq %cl, %rdx
每轮循环中,mask 都会左移 n 位。
E
movq %rdi, %r8
andq %rdx, %r8
orq %r8, %rax
每轮循环中,result 都会与 x&mask 进行或运算。
F
1 | long loop(long x, int n) |
3.63
1 | long switch_prob(long x, int n) { |
3.70
A
字段 | 偏移 |
---|---|
e1.p | 0x00 |
e1.y | 0x08 |
e2.x | 0x00 |
e2.next | 0x08 |
B
0x10,也即 16 个字节。
C
1 | void proc (union ele *up) { |