- 常用的寄存器%rsp、%rip、%rdi、%rsi、%rax有什么特殊作用
- %rsp:保存栈顶地址
- %rip:保存下一条将要被执行的指令的内存地址
- %rdi:函数第一个参数传参
- %rsi:函数第二个参数传参
- %rax:保存函数返回值
- 程序GDB、GCC、OBJDUMP、READELF各有什么作用
- GDB:调试程序
- GCC:编译程序
- OBJDUMP:反编译程序
- READELF:解析elf文件
- 变量a的二进制位模式为0000 1111,b的二进制位模式为1111 0000,则
- a:0000 1111
- b:1111 0000
————————- a | b = 1111 1111
- a & b = 0000 0000
- a ^ b = 1111 1111
- ~a = 1111 0000
按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:
- 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
即相应位的值相同的,结果为 0,不相同的结果为 1。
- 二进制补码1000 1111,转换为十进制是多少
= - 2^7 + 2^3 + 2^2 + 2 +1
= -128 +15
= -113
- 在x86-64中,类型char、short、int、long、float、double一般各占多少字节
- char:1字节
- short:2字节
- int:4字节
- long:8字节
- float:4字节
- double:8字节
- *(地址):8字节
- 常见的指令movq、addq、subq、leaq、andq各起什么作用
- movq:数据传输
- movq:a,b
- a的值 ——> b的值
- addq:相加
- addq:a,b
- b = a + b
- subq:相减
- subq:a,b
- b = a - b
- leaq:地址加载
- leap:2(%rdi,%rcx,2),%rsi
- 2 + %rdi + 2 * %rcx
- andq:按位与
- 程序的编译要经过哪几个步骤
- 预处理 ——> 可汇编文件
- 编译 ——> 可重定位目标文件
- 汇编 ——> 可执行目标文件
- 链接
- 可重定位目标文件、可执行目标文件、共享目标文件各用来干什么的
- 可重定位目标文件:程序的链接输入文件
- 可执行目标文件:可加载到内存直接执行
- 共享目标文件:动态链接用的
- ELF文件中常见的.text节、.data节、.rodata节、.symtab节、.rel.data节、.rel.text节各存放什么东西
- .text节:存放程序指令的机器码(代码)
- .data节:存放程序可读写的数据(程序可读数据)
- .rodata节:存放程序的只读数据
- .symtab节:存放符号表
- .rel.data节:存放.data节的重定位信息
- .rel.text节:存放.text节的重定位信息
- 链接中的两个重要的工作是什么?各有什么用?
- 符号解析:将每个符号找到对应的定义
- 重定位:将地址信息修改正确
- IEEE754标准下,十进制的浮点数float a = 1.0(规则化浮点数)转换成位模式是多少?
- 0011 1111 1000 0000 0000 0000 0000 0000
- 小端模式和大端模式的系统分别是什么样的
- 小端模式:内存低地址存数据的低权重位
- 大端模式:内存低地址存数据的高权重位
- 二进制1010 0111转成十六进制是多少?十六进制数0xA7CB转成二进制是多少?
- 1010 = 2^3 + 2 = 10 = A
- 0111 = 2^2 + 2 + 1 = 7
- 即 0xA7
- A = 1010
- 7 = 0111
- C = 1100
- B = 1011
- 即1010 0111 1100 1011
- 汇编指令的b、w、l、q这些后缀表示什么
- 表示操作的字节数量
- b 为 1 字节
- w 为 2 字节
- l 为 4 字节
- q 为 8 字节
- 什么是强符号?什么是弱符号?存在同名的强符号会怎么样?如果没有强符号,存在同名的弱符号会怎么样?
- 强符号:函数、已初始化的全局变量
- 弱符号:没被初始化的全局变量
- 存在同名的强符号:会报错
- 如果没有强符号,存在同名的弱符号,则链接时会随机选择一个弱符号作为最终的符号解析
- 什么是缓冲区溢出攻击?什么是金丝雀值?什么是ASLR?什么是限制可执行代码区?
- 缓冲区溢出攻击:指往缓冲区填充恶意代码并覆盖返回点地址,使得程序跳转到攻击代码并执行
- 金丝雀值:在缓冲区与程序状态数据之间插入的一个特殊值,用来检测有没有发生缓冲区溢出
- ASLR:指栈空间随机化,程序每次运行都有不同的栈地址,用来对抗缓冲区溢出攻击
- 限制可执行代码区:指将栈空间等内存区域标识为不能执行,使得所注入的攻击代码得不到运行,用来对抗缓冲区溢出攻击
- 在64位Linux系统中,%rdx用于函数返回值
- 在x86-64体系结构的汇编语言中,%rax 和 %rdx 是寄存器的名称
- %rax 是一个64位的寄存器,它是32位寄存器 EAX 的扩展。在某些情况下,%rax 用于存储函数的返回值
- %rdx 也是一个64位的寄存器,它是32位寄存器 EDX 的扩展。在某些情况下,%rdx 用于存储函数的返回值或者作为某些指令的操作数
- 在现代系统中,链接是由叫做链接器(linker)的程序自动执行的
- 所有函数参数都传递给堆栈
- x86-64不需要帧指针寄存器,即RBP可用作普通寄存器使用