Web手入门Reverse
前言
Web手入门 Reverse逆向记录. 国庆期间学习打卡。
正文
基本概念
地址概念
基地址:(段地址)
偏移地址:
如果要更清楚地理解地址的概念,可以再去看看 cache 和 主存之间的映射关系。
汇编基础
寄存器
EAX // "累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
EBX // "基地址"(base)寄存器, 在内存寻址时存放基地址。
ECX // 计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX // 则总是被用来放整数除法产生的余数。
ESP // 栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶
EBP // 基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
常见汇编指令:
PUSH 把字压入堆栈。
POP 把字弹出堆栈。
MOV 传送字或字节。
ADD 加法.
sub 减法
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
AND 与
OR 或
XOR 异或
JMP 无条件转移指令
CALL 过程调用
RET/RETF 过程返回
常见加密
RSA
加密:
$$
C= M^e mod n
$$
其中:
C 为加密后的密文
M 为加密前的明文
公钥为 (n,e) 其中 n = pq (q 和 p 为两个不相等的,较大的互质数)
e 是 小于 ф(n) 欧拉函数结果的一个随机质数
解密:
$$
M = C^d mod n
$$
私钥为 (n,d). 其中 d 是 e 对 ф(n)的模反元素. 用数学表达式表示为: e*d + yф(n) = 1
求出一对解(d,y) 能够满足上表达式即可求得 d
import gmpy2
# Origin message
M = 1314
#p and q
p = 61
q= 53
n = p * q
# φ(N)
Euler_func = (q-1) * (p -1)
# choose e
e = 17
# secret message
C = gmpy2.powmod(M, e, n)
print(C)
d = gmpy2.invert(e, Euler_func)
M = gmpy2.powmod(C, d, n)
print(M)
IDA 的基本使用
静态调试
a // display by string
shift + f12 // searching string
g // 跳转到指定地址
tab // 反编译为 C 的伪代码
space // 试图切换
r // 查看具体的值
x // 查找交叉应用
调试
f9 // start run program
f2 // breakpoint
除此之外,还有的分析工具: