好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 TokyoAio 于 2025-11-17 15:44 编辑
TASK 1
0x00 学习c语言
之前按照菜鸟教程学到了指针,但是没有看懂,而且有半个多月没有编程,好多东西已经忘掉了。
但是这个不应该成为re学习的阻碍,C的学习我会在后续task中同步进行
-
环境配置——VS Code
- 因为重装过系统,所以重新搞了一下
-
-
报错目前靠ai来解释,正在学习中
0x01 相识IDA
- 这里我直接在相关论坛上找了配置好IDA的打包版,解压使用了
- python环境
- 打包版似乎以及集成了python,我自己又在windows中安装了一遍python,应该没问题吧
- 基础操作
- 目前会看反汇编代码、跳转、搜索、改名字等一些很简单很简单的操作,正在随着task的难度不断学习新知识
- lazyida
- 本次task可以高效提取str中的值并且转换为16进制
0x02 逆向初体验
- 凯撒加密
- 对文本进行固定的偏移
- 比较简单,容易被跑字典或者频率统计这样子破解
-
- 异或加密
- a^b=c a^c=b
-
- flag
- 解题思路
-
- 借助插件
-
TASK 2
0x01 C文件的诞生
-
C文件的编译过程
- 预编译:宏定义(替换文本)、头文件展开(把头文件内容复制进来)、处理条件编译的真假值(只保留判断为真的代码)、去除注释
- 编译:把C代码翻译成汇编语言
- 汇编:把汇编代码变成机器直接理解的机器码(二进制)
- 链接:把多个.o文件和库文件组合成一个最终可执行的exe程序
-
编译过程
- gcc -E 001.c -o 001.i
- gcc -S 001.c -o 001.s
- gcc -s 001.c -o 001.o
- gcc 001.o -o 001
0x02 PE文件结构
- PE文件的基本结构
- PE指纹:识别是否为PE文件的格式——特征4D 5A(MZ)和50 45(PE)
- DOS部分:e_magic 标识PE指纹 e_lfanew 寻找PE文件头
- PE文件头
- PE文件头标志(PE Signature):内容固定为PE00——告诉系统,这里开始是一个PE文件结构
- 标准PE头(Standard PE Header):只记录了文件信息(CPU类型、多少个节这些)
- 扩展PE头(Optional Header):包含运行相关的指令(程序入口、加载的基址等)
- 程序的真正入口点 = ImageBase + AddressOfEntryPoint
- ImageBase:程序加载到内存的基址
- AddressOfEntryPoint:程序入口地址
- 节表(Section Table):说明每个节的位置、地址、属性
- 导入表(Import Table):调用API,声明需要用到的DLL、函数
- 导出表(Export Table):声明所提供的函数
- Export Address Table:储存函数真实的RVA(相对地址)
- Name Table:储存函数名
- Ordinal Table:将名字映射到函数编号(编号再对应EAT中的函数地址)
- 重定位表:告诉系统绝对地址,再加上偏移量
- PE文件加载过程
- 找到PE文件并读取DOS头
- 读取PE头:ImageBase、SectionAlignment、SizeOfImage、AddressOfEntryPoint (OEP)
- 分配内存:ImageBase → ImageBase + SizeOfImage
- 如果地址已经被占用——重定位表(Relocation Table)
- 偏移
- 修复 IAT(导入地址表):实现调用Windows API
- TLS 回调(存在则执行):在入口点之前
- 跳转到入口点(Entry Point)执行:ImageBase + AddressOfEntryPoint
- 其他
- 偏移(Offset):相对于某个基准位置的距离
- 虚拟地址(VA / RVA)
- VA(Virtual Address,虚拟地址):程序在内存中的实际地址
- RVA(Relative Virtual Address,相对虚拟地址):相对于模块基址的偏移
- 模块基址(Image Base):PE文件加载到内存后的内存映射的起始地址
- 相关公式:
- FOA = RVA - Section.VirtualAddress + Section.PointerToRawData
- RVA = FOA - Section.PointerToRawData + Section.VirtualAddress
- PE文件并不是从第一行代码开始执行的,而是从从入口点(Entry Point)开始运行
- 入口点通常在.text节
- 入口点是一个RVA,需要加上基址模块才能得到VA:VA = ImageBase + RVA
0x03 Base编码
- 编码
- 编码是从一种固定形式转换为另一种固定形式
- 解码就是编码的逆过程
- 常见编码有:ASCII 编码、URL 编码、HTML 编码、Base64编码
- 加密
- 将明文转换成难以读取的密文,只有解密后才能拿到明文
- 主要算法:对称加密(Symmetric encryption)和非对称加密啊(Asymmetric encryption)
- 常见对称加密:DES、3DES、AES、RC5
- 常见非对称加密:RSA、DSA、ECDSA、Elgamal
- Base64编码
- 原理:
- 原数据转为二进制
- 再以3字节为为一组凑成8组(24字节)(不足3字节用=填充)
- 再以6字节为一组分为4组
- 每6个二进制值映射一个Base64字符(000000~111111)
- 特征:
- 可逆
- 只有A-Za-z0-9+/=
- 结尾通常有“=”
- 长度为4的倍数
- 区别:
- Base32:以5bit为一组划分,对应编码表
- Base58:二进制不分组,直接转化为58进制(反复除以58取余数映射字符表)
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|