【发布时间】:2015-07-04 03:19:53
【问题描述】:
我们的计算机体系结构教授给了我们一个要求输入密码的示例程序。任务是在比较输入的密码并确定是否可以之后更改跳转操作码。 我编写了一个程序,它可以更改给定二进制文件中特定位置的任何字节。
这是密码程序的代码:
int main(int argc, char* argv[]){
char *pw = "12441233";
char pass[32];
printf("Enter password:\n");
scanf("%s", pass);
if(strncmp(pass,pw,8))
{
printf("Password wrong\n");
exit(-1);
}
printf("Welcome\n");
}
所以我在控制台输入$ objdump -d task 得到了这个:
...
400703:|| 48 8b 5d e8 || mov -0x18(%rbp),%rbx
400707:|| 64 48 33 1c 25 28 00 || xor %fs:0x28,%rbx
40070e:|| 00 00
400710:|| 74 05 || je 400717
400712:|| e8 29 fe ff ff || callq 400540 <__stack_chk_fail>
400717: || 48 83 c4 58 ||添加 $0x58,%rsp
40071b:|| 5b ||弹出 %rbx
...
74 是 je 的字节,我想将 jne 更改为 75。
如何获取我的74 字节在相应二进制文件中的确切位置,以便将其更改为新值?
【问题讨论】:
-
内存中的位置与文件中的位置关系不大。您知道 74 05 之前和之后的字节值。在文件中搜索这些值。
-
我知道内存地址与它无关,这就是为什么我问我还应该做什么。我的更改程序需要它,它看起来像这样:changebyte -d POSITION BYTE OLDFILE NEWFILE。我想我通过二进制编辑器搜索功能找到了相应的字节,但是对于所需的解决方案,我需要一个可重现的 wy 来找到二进制文件中的位置。
-
这是linux还是windows?我可以给你一个 windows 可执行文件的答案。
-
这个特殊的问题是在 linux 系统上。不过,我很高兴听到 Windows 解决方案。
标签: c binary opcode objdump disassembly