导图社区 逆向板块知识总结
这是一篇关于逆向板块知识总结的思维导图,主要内容包括:基础部分,专题部分,反制部分。总结了逆向工程的相关知识,适合用于学习和复习逆向板块的内容。
这是一篇关于RSA题型分类的思维导图,主要内容包括:RSA基础题型,n的素因数几种特殊情况的解法,模数n直接分解攻击,共模攻击(模数相同,指数不同分为e1、e2,加密同一明文m,得到不同密文c1,c2),Rabin攻击(e=2的情况),dp泄露攻击,低加密指数攻击(一般e=3)。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
逆向板块知识总结
基础部分
逆向基础:在CTF竞赛中,逆向就是对已经封装好的编译文件进行反编译(exe和elf用IDA,python用uncompile.py或在线uncompile),得到程序的流程、结构、算法等,从而推理出flag的过程
算法:无论是对静态分析还是动态分析而言,在得到经过反编译的伪代码后,最重要的都是找到生成flag的代码算法,接着就是要么分析代码逻辑要么绕过
典型算法
base系列算法
import base64 byte_403020 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' alphabet = list(byte_403020) k = 1 for i in range(13): alphabet[k] = chr(ord(alphabet[k]) + 32) k += 2 for i in range(13): v3 = alphabet[i] alphabet[i] = alphabet[25 - i] alphabet[25 - i] = v3 alphabet = ''.join(alphabet) + '765321' print(alphabet) # 计算码表 cipher = 'nAdtxA66nbbdxA71tUAE2AOlnnbtrAp1nQzGtAQGtrjC7===' standard_alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' custom_alphabet = alphabet.encode() DECODE_TRANS = bytes.maketrans(custom_alphabet, standard_alphabet) def decode(input_str): return base64.b32decode(input_str.translate(DECODE_TRANS)) plain = decode(cipher) print(plain.decode()) # 解码,例子,可作为模板使用
补充:大端序和小端序(1)只有int类型才分大端序小端序(2)int类型数据在CPU中的存储是小端序,在网络中的传输是大端序
汇编语言:将exe文件或elf文件拖进IDA后,显示的第一种语言就是汇编语言,可以说(读懂)汇编语言是(做出)逆向题目的基础
寄存器:寄存器用于存储数据流和控制指令(控制流),是汇编语言逻辑执行不可缺少的一部分,寄存器有16位、32位、62位三种(如:AX、EAX、RAX),16位寄存器分为高位和低位(如:AH和AL),一般情况下EAX、RAX可以看作AX高位补零的结果,可不做区分(如 MOV AX = MOV RAX),其他寄存器同理
指令
一般指令
MOV A,B:把B中的内容移入A
LEA A,[EBX+4]:把EBX+4的地址传入A,LEA常用于获取指针或计算地址,而MOV常用于传递数值等内容
加(ADD)、减(SUB)、自增(INC)、自减(DEC)
与(AND)、或(OR)、异或(XOR)、非(NOT)
逻辑左移(SHL)、逻辑右移(SHR)、循环左移(ROL)、循环右移(ROR)
乘:MUL ECX,EAX = EAX*ECX
除:DIV ECX, 商在EAX中,余数在EDX中
NOP:空指令,不做操作,后续会用到
栈操作指令
两点前提:(1)任意时刻,ESP中的栈指针均指向栈顶位置(2)堆栈顺序:栈顶是低地址,栈底是高地址;PUSH时ESP自减,POP时ESP自增
PUSH:数据入栈操作,ESP先自减(上移)为数据留空,再将数据放入栈中,如PUSH EAX即将EAX中的4字节值压入栈
POP:数据出栈操作,先将栈顶数据弹出后,ESP自增(下移),如POP EAX即为将栈顶的4字节值弹出到EAX中
控制流指令
CMP(在后续做题中经常遇到):算术比较指令,CMP A ,B 比较A和B中的值,实现方法是A-B,如果A、B相等,标志位ZF = 1;A>B,ZF = 0且SF = 0;A < B, ZF= 0且 SF = 1
TEST:逻辑比较指令
JMP:无条件跳转指令,绝对地址和相对地址都可以
JZ/JNZ:判断跳转
CALL:函数调用
控制流结构
if-else
swich-case
loop
静态分析:静态分析是指在不运行目标程序的前提下,通过反汇编工具分析代码的结构、算法,推理出程序的功能、逻辑的过程
工具选择
(1)检查文件类型和位数:exeinfope.exe
(2)反汇编工具:IDA(32位或64位)
动态调试:通过运行程序、设置断点、查看内存、跟踪寄存器和接口调用等方式,观察程序的实际运行行为与状态
调试工具:OLLYdbg
调试步骤
(1)设置断点(2)单步执行,观察寄存器和内存变化(3)查找字符串,如flag等(4)修改EIP,直接跳到目标位置
OLLYdbg调试技巧
常用快捷键
字符串查找
子主题
查找当前模块所有函数
专题部分
专题1:游戏算法逆向:迷宫问题、电灯问题、扫雷问题等
反制部分
花指令:出现在程序代码中,对数据和逻辑不产生影响的指令
(1)定位到反汇编语言中标红的代码(2)按D转为数据格式,并将数值改为90h即nop(3)再将序号标红的代码段整体选中,按p转为函数后即可反编译得到伪c代码