Pwn方向第一节课-二进制基础与工具使用¶
Part0 PWN?¶
概述¶
•破解、利用成功(程序的二进制漏洞)
•攻破(设备、服务器)
•控制(设备、服务器)
一次简单的hack¶
•exploit
•用于攻击的脚本与方案
•payload
•攻击载荷,是目标进程被劫持控制流的数据
•shellcode
•调用攻击目标的shell的代码
Part1 二进制基础¶
程序的编译与链接¶
从C源代码到可执行文件的生成过程
•编译:由C语言代码生成汇编代码
•汇编:由汇编代码生成机器码
•链接:将多个机器码的目标文件链接成一个可执行文件
Linux下的可执行文件格式ELF¶
什么是可执行文件?¶
•广义:文件中的数据是可执行代码的文件
•.out、.exe、.sh、.py
•狭义:文件中的数据是机器码的文件
•.out、.exe、.dll、.so
可执行文件的分类¶
•Windows:PE(Portable Executable)
•可执行程序:.exe
•动态链接库:.dll
•静态链接库:.lib
•Linux:ELF(Executable and Linkable Format)
•可执行程序:.out
•动态链接库:.so
•静态链接库:.a
ELF 文件结构¶
•ELF文件头表(ELF header):记录了ELF文件的组织结构
•程序头表/段表(Program header table):告诉系统如何创建进程,生成进程的可执行文件必须拥有此结构:重定位文件不一定需要
•节头表(Section header table):记录了ELF文件的节区信息,用于链接的目标文件必须拥有此结构,其它类型目标文件不一定需要
磁盘中的ELF(可执行文件)与内存中的ELF(进程内存映像)¶
进程虚拟地址空间¶
ELF文件到虚拟地址空间的映射¶
地址以字节编码 1Byte = 8bits
常以16进制表示 0x3c = 0011 1100
虚拟内存用户空间每个进程一份
虚拟内存内核空间所有进程共享一份
虚拟内存 mmap 段中的动态链接库仅在物理内存中装载一份
段(segment)与节(section)¶
•一个 段 包含多个 节
•段视图用于进程的内存区域的 rwx权限划分
•节视图用于ELF文件 编译链接时 与 在磁盘上存储时 的文件结构的组织
代码段(Text segment)包含了代码与只读数据
•.text 节
•.rodata 节
•.hash 节
•.dynsym 节
•.dynstr 节
•.plt 节
•.rel.got 节
•……
数据段(Data segment)包含了可读可写数据
•.data 节
•.dynamic 节
•.got 节
•.got.plt 节
•.bss 节
•……
栈段(Stack segment)
程序数据是如何在内存中组织的¶
程序的装载与进程的执行¶
大端序与小端序¶
小端序
•低地址存放数据低位、高地址存放数据高位
•我们所主要关注的格式
大端序
•低地址存放数据高位、高地址存放数据低位
进程的执行过程¶
寄存器结构¶
amd64寄存器结构
•rax: 8Bytes
•eax:4Bytes
•ax: 2Bytes
•ah: 1Bytes
•al: 1Bytes
部分寄存器的功能
•RIP:存放当前执行的指令的地址
•RSP:存放当前栈帧的栈顶地址
•RB:•存放当前栈帧的栈底地址
•RA:•通用寄存器。存放函数返回值
静态链接的程序的执行过程¶
动态链接的程序的执行过程¶
x86&amd64汇编简述¶
常用汇编指令¶
1 2 3 4 5 6 7 8 9 10 11 |
|
MOV¶
1 2 3 4 5 6 |
|
LEA¶
1 2 3 |
|
ADD/SUB¶
1 2 3 4 |
|
INC/DEC¶
1 |
|
PUSH/POP¶
1 2 3 4 5 6 |
|
LEAVE¶
1 2 3 4 |
|
RET¶
1 2 3 |
|
两种汇编格式¶
Part2 内存保护措施¶
ASLR¶
ASLR(Address Space Layout Randomization)
1 2 3 4 |
|
PIE¶
PIE (Position-Independent Executable)
1 2 3 |
|
The NX bits¶
The NX bits (the No-eXecute bits)
1 2 |
|
Canary¶
1 2 3 |
|
RELRO¶
RELRO (RELocate Read-Only)
1 2 3 |
|
Part3 PWN Tools¶
1 2 3 4 5 6 7 8 |
|