2.1 信息存储 计算机使用 字节 (byte,8 位)作为最小的可寻址内存单位 机器级程序将内存视为一个非常大的字节数组,称为 虚拟内存 内存的每个字节都由一个唯一的数字来标识,称为它的 地址 所有可能的地址集合称为 虚拟地址空间 2.1.1 十六进制表示法 C语言中,用 0x 或 0X 开头的数字表示十六进制 2.1.2 字数据大小 每台计算机都有一个字长,指明指针数据的标称大小 因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。对于一个字长为 w 位的机器而言,虚拟地址的范围为 $0 \sim 2^w - 1$,程序最多访问 $2^w$ 个字 …
引言 本章中主要围绕一个简单的 C 语言程序展开 #include <stdio.h> int main() { printf("hello, world\n"); return 0; } 1.1 信息就是位+上下文 源程序(源文件)是一个由 0 和 1 组成的位序列,每 8 位称为 1 字节。 通常我们编辑源程序的最小单位就是字节,如 010editor、IDA 中的 patch 只由 ASCII 字符构成的文件称为文本文件,其他的所有文件都称为二进制文件。 1.2 程序被其他程序翻译成不同的格式 高级语言必须被其他程序转化为一系列的低级机器语言指令,然后这些指令 …
pwntools 工具手册 一、连接 1. process 建立一个本地连接 class process( argv: Any | None = None, shell: bool = False, executable: Any | None = None, cwd: Any | None = None, env: Any | None = None, stdin: int = PIPE, stdout: PTY = PTY, stderr: int = STDOUT, close_fds: bool = True, preexec_fn: () -> None = lambda : …
IDA 使用手册 快捷键 Space:切换视图(文本视图,图形视图) Tab、F5:反编译 R:(选中一个数据)数字转字符 H:(选中一个数据)十六进制与十进制转换 B:(选中一个数据)十六进制与二进制转换 Q:(选中一个数据)转换为十六进制 C:(选中一个地址)将一段汇编代码标记为 code(代码) D:(选中一个地址)将一段汇编代码标记为 data(数据) U:(选中一个地址)取消函数、代码、数据的定义 P:(选中一个地址)标记为函数 G:快速跳转到某个地址 X:(选中一个函数或变量)查看它的交叉引用 N:(选中一个数据)重新命名 Y:更改变量类型 A:解释光标的地址为字符串的首地址 *: …
去掉 Xshell 的弹窗 参考文章[原创] Xshell、Xftp 免费版去除退出弹窗提示-新手实战,所有详细操作均出自此文章 反反调试 安装 x32dbg、x64dbg 安装 ScyllaHide(反反调试) 插件 配置插件参数,在 options 中选择VMProtect x86/x64 设置弹窗断点 在弹窗处(本程序中为 CreateWindowExW)处打断点,在命令行执行 bp CreateWindowExW,然后双击可以定位到断点位置。 在退出程序之前可以先禁用断点,以免影响其他弹窗命令的执行。 调用堆栈定位 在关闭窗口前启用弹窗断点,关闭窗口,此时未弹窗, …
0x01_Linux基础指令 pwd: 查看当前位置 man <name>: 查看某命令参数 cd <path>: 切换目录 ls [-l] [-a]: 查看当前目录下的文件与文件夹,ls -l可以查看详细信息。Linux系统下“一切皆文件”,ls -la可以查看隐藏文件(以点开头的文件) cat <path>: 查看文件内容 mkdir: 创建目录 touch <path>: 创建空文件 rm [-r] <path>: 删除文件 echo <text>: 打印字符串。echo $? …
0x02_Vim的使用 安装:(Debian系列,如Ubuntu)sudo apt-get install vim;(RedHat系列,如CentOS)yum install vim 一些常用快捷键: i: 插入内容 :q: 不保存退出 :wq: 保存退出 o: 在最后一行插入内容 syntax on: 开启语法高亮 set number: 显示行号 Shift + G: 到达文件末端 (命令行中使用)vim -O <file1> <file2>: 打开一个编辑会话,水平分割窗口,Ctrl W + ←/→调整光标所在窗口 :! + <命令行命令>: 执行命 …
0x03_CPU基础 eax/ebx:寄存器 pc/rip/eip/ip:程序计数器 mov r1,r2:将r2的值赋给r1 add r1,r2:将r2的值与r1相加,结果存储在r1 sub r1,r2:将r2的值与r1相减,结果存在r1 esp/sp/rsp:栈指针 push val:入栈 pop r1:将栈顶元素弹出,值存在r1中 jmp num:无条件跳转到对应位置的指令,相当于mov eip,5 zeroflag:一个特殊的寄存器,用于保存最后一次运算生成的结果是否为0,是则为1,不是为0 je num:跳转到对应位置的指令当上一次运算的结果为0时(jump equal) jnz …
0x04_工具准备 gdb 一款UNIX及UNIX-like下的调试工具。 gdb <文件名>进入调试,输入disassemble main查看指定函数的反汇编机器代码。set disassembly-flavor intel转换为Intel风格的汇编 break *main:在main函数设置断点 run:运行程序 info registers:查看寄存器信息 si:执行一条指令(step instruction),若该指令有函数调用则进入该函数,相当于step into(单步跟踪进入) ni:执行一条指令(next instruction),若该指令有函数则直接执行该函数,相 …
0x05_初级逆向 不可破解的程序 如果直接将密钥写在文件中与用户输入对比,人们可以轻松地通过提取二进制文件中的字符串获取到密钥。因此,最好不要把安全密钥放在(代码)里面,而是通过编写一个算法密钥来完成。 即使写了一个很复杂的密钥生成算法(Keygen),只要足够耐心,也有找到密钥的机会。对于二进制文件来说,一般的解析工具必须通过解析器读取和解析可执行文件才能向用户提供可靠信息。而每个工具实现解析的方式都有所区别,所以对于同一个二进制文件输入,Linux可能正常执行,而gdb或者radare会报错。我们可以通过fuzzing的方法来生成这样的文件。LiveOverflow采用的是一种非常简单的 …