二进制文件分析
1. 参考测试程序
// main.c
#include <stdio.h>
void main()
{
int money = 0;
int vip = 1;
asm("nop"); // 无效指令
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
if (money == 0) { vip = 0; };
printf("money %d vip %d\r\n", money, vip);
if (vip == 1) { printf("授权成功\r\n"); }
else { printf("未授权\r\n"); }
}
2. 编译与反汇编
# 编译
gcc -g main.c -o main.out
# 反汇编
objdump main.out -S > main.dis
3. 从main.dis文件中定位破解位置
if (money == 0) { vip = 0; };
118a: 83 7d fc 00 cmpl $0x0,-0x4(%rbp)
118e: 75 07 jne 1197 <main+0x2e>
1190: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%rbp)
定位到上述代码中的c7 45 f8 00 00 00 00
为破解点。
4. 查看与编辑二进制文件
可以使用vscode+hex插件
查看和编辑main.out文件。
在main.out文件中定位c7 45 f8 00 00 00 00
并将其修改为nop
指令对应的90 90 90 90 90 90 90
即完成破解。