【发布时间】:2012-02-08 00:22:08
【问题描述】:
所以有点背景。我是 c 和汇编代码的初学者,我们有一个“炸弹”作业(用 c 编写)调用需要某些密码的方法,但代码不可见,我需要通过查看汇编代码来确定正确的密码.
代码表明此方法的密码是 6 位数字,作为“输入”传递给方法阶段 2(我试图避免触发)。
我感到困惑的部分是从 +64 跳到 +42。这似乎是一个循环,但我不确定每次传递如何影响堆栈。如果最后两个数字相同,则看起来循环退出,并且它与加减 4 有关,但我不确定如何遍历地址。 如果有人可以翻译到底发生了什么,或者如果我需要查看任何特定的寄存器/位置,那将有很大帮助。还有 4 个阶段,每个阶段都应该更复杂,所以我想很好地理解如何阅读这些。
另外,如果有人有一个很好的资源(比如可打印的表格),其中包含汇编代码关键字也会很有帮助,而且如果 32 位和 64 位寄存器之间存在任何差异,我需要担心的是注册名字..
82 phase_2(input);
(gdb) disas phase_2
Dump of assembler code for function phase_2:
0x000000000040106b <phase_2+0>: push %rbp
0x000000000040106c <phase_2+1>: push %rbx
0x000000000040106d <phase_2+2>: sub $0x28,%rsp
0x0000000000401071 <phase_2+6>: mov %rsp,%rsi
0x0000000000401074 <phase_2+9>: callq 0x401457 <read_six_numbers>
0x0000000000401079 <phase_2+14>: cmpl $0x0,(%rsp)
0x000000000040107d <phase_2+18>: jne 0x401086 <phase_2+27>
0x000000000040107f <phase_2+20>: cmpl $0x1,0x4(%rsp)
0x0000000000401084 <phase_2+25>: je 0x40108b <phase_2+32>
0x0000000000401086 <phase_2+27>: callq 0x401421 <explode_bomb>
0x000000000040108b <phase_2+32>: lea 0x8(%rsp),%rbx
0x0000000000401090 <phase_2+37>: lea 0x18(%rsp),%rbp
0x0000000000401095 <phase_2+42>: mov -0x8(%rbx),%eax
0x0000000000401098 <phase_2+45>: add -0x4(%rbx),%eax
0x000000000040109b <phase_2+48>: cmp %eax,(%rbx)
0x000000000040109d <phase_2+50>: je 0x4010a4 <phase_2+57>
0x000000000040109f <phase_2+52>: callq 0x401421 <explode_bomb>
0x00000000004010a4 <phase_2+57>: add $0x4,%rbx
0x00000000004010a8 <phase_2+61>: cmp %rbp,%rbx
0x00000000004010ab <phase_2+64>: jne 0x401095 <phase_2+42>
0x00000000004010ad <phase_2+66>: add $0x28,%rsp
0x00000000004010b1 <phase_2+70>: pop %rbx
0x00000000004010b2 <phase_2+71>: pop %rbp
0x00000000004010b3 <phase_2+72>: retq
【问题讨论】:
-
如果您使用的是 Windows,我会推荐这个:ollydbg.de 和 gdb(我刚刚发现)使用 TUI,stackoverflow.com/a/2422063/1149736 和:
layout asmstartlayout regs@987654328 @nini:) 并仔细跟踪堆栈chemie.fu-berlin.de/chemnet/use/info/gdb/gdb_7.html -
你有一个很酷的老师:)
标签: c gdb assemblies