我已经写了一个简单的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 只打开二进制文件,然后在不做任何更改的情况下将其保存为原始字节.再说一次,它不会运行.
有没有人遇到过类似的问题,可以帮上忙?我也附上了更改,以防问题可能是双重的.