汇编语言基础及编译原理(网安)

汇编语言基础及编译原理

二进制基础

程序的编译 汇编与链接

  • 从c语言到可执行程序
    源代码.c
    编译
    汇编代码.s
    汇编
    目标文件.o
    链接(静态库直接拷贝,动态库运行时通过动态链接方式加载)
    可执行文件(p)

x86机器指令入门

一种先进后出的数据结构
被用于保存函数的局部(保存局部变量和返回地址)
栈往低地址增长
esp栈顶指针
push 入栈
pop 出栈

  • 基础指令
    mov 寻址
    add 加操作
    sub 减操作
    lea 加载有效地址
    inc 加一
    dec 减一
    imul 乘法
    idiv 除法
    and or xor 与 或 异或
    not neg 非
    shl shr 左右移
  • jmp
    j[condition]
    cmp 比较
    call ret 函数调用/返回

Intel 与 AT&T

左右相反
AT&T中$表立即数
%为地址
intel为[]
AT&T为()

调用约定

调用约定约定了函数之间如何传参 如何传返回值

  • 调用者负责清理栈上参数(Caller Clean-up)
    cdecl
    optlink
  • 被调用者负责清理栈上参数(Callee Clean-up)
    stdcall
    fastcall
    主要是操作栈(64位寄存器中如果传参少可以直接用寄存器传参)
    eax保存返回值
    ebp保存栈顶指针

ELF与动态链接

ELF文件格式

  • Segment:在ELF(Executable and Linkable Format)格式中,segment是指具有相同属性的节(section)的集合。这些属性主要包括可读、可写和可执行等权限。Segment主要描述了磁盘上可执行文件的内存布局以及如何映射到内存中,是程序装载时被内核解析的必要组成部分。
  • Section:Section是指包含代码或数据的逻辑区块。例如,一个程序中的全局变量或特定的函数代码都可以构成一个section。Section的信息主要用于链接和调试,它对于程序的执行来说不是必需的,但没有节头表,会使得一些工具如gdb和objdump难以定位符号信息

Segment和section之间存在密切的关系。一个segment可以包含一个或多个section,而每个section都必须属于某个segment。

这种结构设计使得程序的不同部分可以根据需要被分配不同的属性和权限。例如,一个典型的程序可能包括一个包含代码的.text section和一个包含未初始化数据的.bss section,它们可能同属于一个具有执行权限的segment

Segment主要关注程序如何被操作系统加载到内存中,而section则更关注程序本身的结构和运行时行为。

在实际操作中,可以使用如readelf这样的工具来查看ELF文件中segment和section的具体信息。例如,使用readelf -l命令可以显示哪些section被映射到一个segment中,这有助于理解程序的内存布局和优化内存使用

  • ELF Header : 架构版本信息等,以及下面两个的位置和数量
  • Program header table : 每个表定义了一个segment,每个segment可包含多个section
  • Secton header table : 每个表定义了一个section

readelf -h 查看ELF Header

readelf -l 查看Program Header

readelf -S 查看Section Header

  • 通过/proc/[pid]/maps查看内存映射情况

静态链接启动过程

动态链接与延迟绑定

  • 动态链接是一种运行时才会加载和链接程序所依赖的共享库技术
  • linux最常见的共享库 libc
  • 重定位
  • 待填充项

(后面部分为CTF中的二进制内容,不需要的可以跳过)

GOT表劫持攻击

什么是GOT表

二进制漏洞类型与原理

栈溢出与堆溢出

整数溢出

释放后使用(UAF)

posted @ 2024-05-17 22:34  谦谦君籽  阅读(108)  评论(0)    收藏  举报