我已经写了一个简单的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中找到了负责 skip 的代码,即:

                     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个二进制文件,并try 运行它们.它会被杀死(SIGKILL(9)).

我试过的是:

  • 我发现了大约xattributes个,所以我判断了他们是否被"隔离",他们没有.事实上,他们没有xattributes美元.
  • 我试过切换分支b标签,但无济于事
  • 为了排除这些代码更改,我try 只打开二进制文件,然后在不做任何更改的情况下将其保存为原始字节.再说一次,它不会运行.

有没有人遇到过类似的问题,可以帮上忙?我也附上了更改,以防问题可能是双重的.

推荐答案

我已经解决了这个问题.

对于遇到类似问题的人来说,这是由于证书无效,二进制文件需要再次签名.

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

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

并创建代码签名证书.

然后对二进制文件进行联合设计:

codesign -fs name-of-certificate path/to/binary-to-be-signed

Rust相关问答推荐

通用池类型xsx

为什么拥有的trait对象的相等运算符移动了正确的操作数?

MacOS(AARCH64)上Ghidra中的二进制补丁导致进程终止

为什么我不能从带有字符串的 struct 的引用迭代器中收集VEC<;&;str&>?

如果成员都实现特征,是否在多态集合上实现部分重叠的特征?

当第二个`let`依赖于第一个`let()`时,如何在一行中有多个`let()`?

什么时候铁 rust FFI边界上的panic 是未定义的行为?

将数组转换为HashMap的更简单方法

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

替换可变引用中的字符串会泄漏内存吗?

无法将 rust 蚀向量附加到另一个向量

使用关联类型重写时特征的实现冲突

获取已知数量的输入

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

为什么实现特征的对象期望比具体对象有更长的生命周期?

Rust 将特性传递给依赖项

在 Rust 中,将可变引用传递给函数的机制是什么?

如何使返回 XMLError 的方法与 anyhow::Error 兼容?

当我不满足特征界限时会发生什么?

在使用大型表达式时(8k 行需要一小时编译),是否可以避免 Rust 中的二次编译时间?