我编写了一个简单的 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
标签,但没有成功有没有人遇到类似的问题并可以提供帮助?我还附上了所做的更改,以防问题可能是双重的。
我已经解决了这个问题。
对于遇到类似问题的任何人,这是由于证书无效,并且需要重新签名二进制文件。
要在没有 Apple 开发者 ID 的情况下执行此操作,您需要:
Open 'Keychain Access' -> (Toolbar) Keychain Access -> Certificate Assistant -> Create a Certificate
并创建代码签名证书。
然后对二进制文件进行协同设计:
codesign -fs name-of-certificate path/to/binary-to-be-signed