逆向工程小窥

本文介绍了一种通过直接修改二进制文件实现代码破解的方法。以一个简单的示例程序为例,展示了如何利用otool等工具找到关键指令的位置,并使用二进制编辑器修改返回值,从而让程序输出预期结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目标:通过直接修改二进制让下面的代码输出 jail break success

$cat main.c
#include <stdio.h>

int test() {
  return 0xf3f3;
}

int main(int argc, const char *argv[])
{
  if (0 == test()) {
    printf("jail break success\n");
  } else {
    printf("jail break fail\n");
  }
  return 0;
}

工具:otool、二进制编辑器、gdb

首先看二进制文件的text段基本信息,例如文件中的偏移,内存的载入地址。
根据这些信息,结合反汇编信息,就能推导出返回值0xf3f3的地址,然后直接用二进制编辑器修改之即可。

$otool -l a.out
....
Section
  sectname __text
   segname __TEXT
      addr 0x0000000100000f00
      size 0x0000000000000064
    offset 3840
     align 2^4 (16)
    reloff 0
    nreloc 0
     flags 0x80000400
 reserved1 0
 reserved2 0
Section

二进制text段:

$otool -t a.out
a.out:
(__TEXT,__text) section
0000000100000f00 55 48 89 e5 b8 f3 f3 00 00 5d c3 0f 1f 44 00 00
0000000100000f10 55 48 89 e5 48 83 ec 20 c7 45 fc 00 00 00 00 89
0000000100000f20 7d f8 48 89 75 f0 e8 d5 ff ff ff 31 ff 39 c7 0f
0000000100000f30 85 16 00 00 00 48 8d 3d 4a 00 00 00 b0 00 e8 21
0000000100000f40 00 00 00 89 45 ec e9 11 00 00 00 48 8d 3d 48 00
0000000100000f50 00 00 b0 00 e8 0b 00 00 00 89 45 e8 31 c0 48 83
0000000100000f60 c4 20 5d c3

反汇编:

$otool -tV a.out
a.out:
(__TEXT,__text) section
_test:
0000000100000f00  pushq %rbp
0000000100000f01  movq  %rsp, %rbp
0000000100000f04  movl  $0xf3f3, %eax           ## imm = 0xF3F3
0000000100000f09  popq  %rbp
0000000100000f0a  retq
0000000100000f0b  nopl  (%rax,%rax)
_main:
0000000100000f10  pushq %rbp
0000000100000f11  movq  %rsp, %rbp
0000000100000f14  subq  $0x20, %rsp
0000000100000f18  movl  $0x0, -0x4(%rbp)
0000000100000f1f  movl  %edi, -0x8(%rbp)
0000000100000f22  movq  %rsi, -0x10(%rbp)
0000000100000f26  callq _test
0000000100000f2b  xorl  %edi, %edi
0000000100000f2d  cmpl  %eax, %edi
0000000100000f2f  jne 0x100000f4b
0000000100000f35  leaq  0x4a(%rip), %rdi        ## literal pool for: "jail break success\n"
0000000100000f3c  movb  $0x0, %al
0000000100000f3e  callq 0x100000f64             ## symbol stub for: _printf
0000000100000f43  movl  %eax, -0x14(%rbp)
0000000100000f46  jmp 0x100000f5c
0000000100000f4b  leaq  0x48(%rip), %rdi        ## literal pool for: "jail break fail\n"
0000000100000f52  movb  $0x0, %al
0000000100000f54  callq 0x100000f64             ## symbol stub for: _printf
0000000100000f59  movl  %eax, -0x18(%rbp)
0000000100000f5c  xorl  %eax, %eax
0000000100000f5e  addq  $0x20, %rsp
0000000100000f62  popq  %rbp
0000000100000f63  retq 

计算出文件偏移后,用二进制编辑器直接修改之。保存,再运行。成功~

http://stevenygard.com/projects/class-dump/
http://pandara.xyz/2016/08/13/fake_wechat_location/
http://bbs.iosre.com/

Hopper Disassembler 见网盘-》我的软件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值