分析原理
首先了解调用约定,了解函数的入参方式;
然后分析ebp,ebp是当前栈底,ebp-x是获取入参,因为入参是调用方准备好的,ebp+x是局部变量,因为这部分在当前栈帧中。
动态分析
gdb无源码分析
# 1.启动并在第一条指令处停止
starti
# 2.单步调试
si
ni
# 3.查看寄存器信息
info registers
# 4.查看寄存器值
x/4xw 0x1000
# 5.设置断点
break *0x1234
解读:
Dump of assembler code for function main:
0x0000000000400526 <+0>: push %rbp
| | |
| | 汇编指令
| 指令偏移量
|
指令地址
指令偏移量:+0
表示函数的起始地址,+4
表示相对于函数起始地址的偏移地址。
IDA free
todo.
静态分析
查看基本信息
file ./a.out
objdump -f <可执行文件>
readelf -a <可执行文件>
查看二进制内容
# 最全面的方法
objdump -s <可执行文件> | less
# 以十六进制和ASCII查看二进制
hexdump -C <可执行文件>
# 编辑二进制,和objdump不同,hexdump可以查看任意文件
hexdump -C <可执行文件> | vim -
# 查看二进制中的字符
strings <可执行文件>
查看反汇编内容
objdump -d <可执行文件> | less
查看符号表
nm <可执行文件>
objdump -t <可执行文件>
(gdb) info fuctions
查看段信息
objdump -h <可执行文件>
readelf -S <可执行文件>
查看入口函数地址
objdump -f <可执行文件>
readelf -a a.out | grep Entry
查看依赖信息
ldd <可执行文件>
查看elf类型
readelf -h <elf文件> | grep
Type: DYN (Shared object file)
破解分析
一般来说,密钥都需要比较函数,因此:
- 反汇编二进制
- nm 查看符号表
- 查找可疑的比较函数,记录下内存地址
- 使用gdb,设置断点
- 测试哪个断点处和输入密码后的比较有关
- 查看寄存器中的值,观察rdi、rsi等值和输入值的关系,推理算法
- 将算法逆向用于被比较值,得出正确的入参值
这就是简单算法的破解方案,所以才需要RSA这种不可逆推的算法。