在 MacOS (AARCH64) 上的 Ghidra 中修补 Rust 二进制文件会导致进程被终止

问题描述 投票:0回答:1

我编写了一个简单的 Rust 程序来学习逆向工程,其中一个简单的循环会在您输入“正确”密码时中断,这就是程序:

use std::io;
fn main() {
    println!("Enter password:");
    let mut pass = String::new();
    loop {
        io::stdin()
            .read_line(&mut pass)
            .expect("Failed to read line");

        match pass.as_str().trim() {
            "reddit" => break,
            _ => println!("Wrong password"),
        }
    }
    println!("You've guessed it!");
}

我已经在 Ghidra 中找到了负责跳转的代码,即:

                     LAB_100002ce4                         XREF[1]:     100002ce0(j)  
       100002ce4 e8 0f 40 b9     ldr        w8,[sp, #local_124]
       100002ce8 28 01 00 37     tbnz       w8,#0x0,LAB_100002d0c
       100002cec 0f 00 00 14     b          LAB_100002d28

我在ARM64指令集手册中查找了

tbnz
指令,并基于该指令通过以下方式“修补了指令”:

tbnz       w8,#0x0,LAB_100002d0c --> tbnz       w8,#0x1,LAB_100002d0c

反编译器窗口显示的正是我所期望的:

if ((uVar1 & 1) != 0) break; --> if ((uVar1 >> 1 & 1) != 0) break;

我通过两种方式导出二进制文件:

  • 原始文件或
  • 原始字节

然后我

chmod +x
生成的二进制文件并尝试运行它们。它被杀死(SIGKILL (9))。

我尝试过的:

  • 我发现了
    xattributes
    ,所以我检查了他们是否被“隔离”,结果没有。事实上他们没有任何
    xattributes
  • 我尝试切换分支
    b
    标签,但没有成功
  • 为了排除这些代码更改,我尝试打开二进制文件,然后不做任何更改将其保存为原始字节。再次它无法运行。

有没有人遇到类似的问题并可以提供帮助?我还附上了所做的更改,以防问题可能是双重的。

macos rust reverse-engineering arm64 ghidra
1个回答
0
投票

我已经解决了这个问题。

对于遇到类似问题的任何人,这是由于证书无效,并且需要重新签名二进制文件。

要在没有 Apple 开发者 ID 的情况下执行此操作,您需要:

Open 'Keychain Access' -> (Toolbar) Keychain Access -> Certificate Assistant -> Create a Certificate

并创建代码签名证书。

然后对二进制文件进行协同设计:

codesign -fs name-of-certificate path/to/binary-to-be-signed
© www.soinside.com 2019 - 2024. All rights reserved.