workspace/tags/re/

Re

  • 0-0 计算机组成初步

    从 C 语言到汇编:二进制安全需要的计算机组成基础

    我们平时编写 C 语言程序时,习惯用变量、循环、判断和函数来描述程序逻辑:

    int add(int a, int b) {
        return a + b;
    }
    

    但是 CPU 并不认识 intreturn 或函数名。源代码经过编译器处理后,会被翻译成机器指令;机器指令本质上是一串二进制数据。汇编语言则为这些机器指令提供了便于人类阅读的写法。上面的函数可能对应如下汇编逻辑:

    add:
        lea eax, [rdi + rsi]
        ret
    

    对于普通软件开发,我们未必需要关心翻译后的结果;但在逆向工程、漏洞分析和恶意代码分析中,拿到的往往只有编译后的程序。此时,我们必须从寄存器、内存和汇编指令出发,重新理解程序做了什么。

    本文不会完整讲授数字电路、流水线或缓存一致性等计算机组成原理课程内容,而是围绕二进制安全所需的主线展开:

    硬件如何协作 → CPU 如何保存数据 → 汇编指令如何操作数据和改变控制流 → 函数如何使用栈与寄存器。

    文中的汇编代码采用 x86-64 Intel 语法,运行环境默认为 Linux 用户态,函数调用遵循 System V AMD64 ABI。示例以讲清原理为第一目标,实际编译结果会随着编译器版本、优化等级和源代码写法发生变化。

    计算机由哪些主要硬件组成

    一台计算机包含很多部件。对于分析普通用户态程序,我们首先需要认识 CPU、内存、外部存储、总线和输入输出设备。

    部件主要作用与二进制分析的关系
    CPU解释并执行机器指令,完成运算和控制汇编指令最终在 CPU 中执行
    内存(RAM)临时保存正在运行的程序、代码和数据代码、栈、堆和全局变量都位于进程的虚拟地址空间中
    硬盘或固态硬盘长期保存程序和文件,断电后数据仍存在ELF 可执行文件最初存放在这里,运行时再由系统装入内存
    总线在 CPU、内存和设备之间传输地址、数据和控制信息决定各硬件如何交换信息,但初学阶段不必深入电气细节
    输入输出设备让计算机与用户和外界交换数据程序通常通过操作系统提供的接口访问这些设备

    1. CPU 内部有什么

    为了便于理解,可以把 CPU 内部的重要部分概括为:

Terminal

C0nvR3 Lab terminal ready. Type help for commands.