2012-11-18 111 views
-3

可能重复:
Decoding and understanding assembly code解码和理解汇编代码

我与C和汇编代码初学者,我们有一个“炸弹”分配(用C语言编写),其中要求方法需要某些密码,但代码不可见,我需要通过查看汇编代码来确定正确的密码。

该代码指示此方法的密码是6个数字,它作为“输入”传递给方法puzzle_1(我试图避免触发)。

我无法理解汇编代码。

这个问题的答案是什么?

我觉得这个puzzle_1的关键字是数组。

08048db4 <puzzle_1>: 
8048db4:  push %ebp 
8048db5:  mov %esp,%ebp 
8048db7:  sub $0x38,%esp 
8048dba:  lea -0x24(%ebp),%eax 
8048dbd:  mov %eax,0x4(%esp) 
8048dc1:  mov 0x8(%ebp),%eax 
8048dc4:  mov %eax,(%esp) 
8048dc7:  call 804897e <read_six_numbers> 
8048dcc:  movl $0x1,-0xc(%ebp) 
8048dd3:  jmp 8048df9 <puzzle_1+0x45> 
8048dd5:  mov -0xc(%ebp),%eax 
8048dd8:  mov -0x24(%ebp,%eax,4),%eax 
8048ddc:  mov -0xc(%ebp),%edx 
8048ddf:   sub $0x1,%edx 
8048de2:  mov -0x24(%ebp,%edx,4),%edx 
8048de6:  add $0xbf,%edx 
8048dec:  cmp %edx,%eax 
8048dee:  je  8048df5 <puzzle_1+0x41> 
8048df0:   call 8048d93 <denied_nextstep> 
8048df5:   addl $0x1,-0xc(%ebp) 
8048df9:   cmpl $0x5,-0xc(%ebp) 
8048dfd:   jle 8048dd5 <puzzle_1+0x21> 
8048dff:   call 8048d73 <allow_nextstep> 
8048e04:  leave 
8048e05:  ret 
+5

了解程序集的技巧就是学习它。 – alex

+0

并学习如何使用调试器... –

+0

如果问题已关闭,再次提出问题并不礼貌。社区已经告诉你在这个问题上多加一些努力。 – alex

回答

2

您需要学习装配。快速入门以便您自己发现答案的方法是逐个执行指令,并使用将助记符映射到其目的的表格,不同寻址模式的表格,以及如果可以的话将十六进制映射到十进制的计算器不要在你的脑海里做,而且当你不了解某些东西时,你可以通过互联网进行一些调查。

例如,这里是第几个指令......

; Push the value in %ebp register onto stack 
8048db4:  push %ebp 

; Copy the value from %esp register into %ebp register 
8048db5:  mov %esp,%ebp 

; Subtract 0x38 from %esp register 
8048db7:  sub $0x38,%esp 

; Wasn't sure about this one, so I looked it up 
; (Looking up things you're not sure of is a 
; good way to learn about those things.) 
; http://stackoverflow.com/q/1658294/31671 
8048dba:  lea -0x24(%ebp),%eax 
3

大约有三类了解这里:

1)计算机体系结构:

  • 寄存器结构/指令集体系结构
    • 算术(如a + b)
    • 比特逻辑如A或B
    • 条件(如== B或A < b)用不同的标志有符号无符号&
      • cmp %edx,%eax
    • 跳跃
      • 无条件:jmp
      • 有条件:je; jle等 - 与条件代码标志状态寄存器
      • 子程序:call;
    • 存储器架构
    • 不同种寻址模式
      • 立即sub $0x38,%esp
    • 存储器地址计算lea -0x24(%ebp),%eax
    • CISC类型:可以你 '添加' 直接到一个存储器地址 addl $0x1,-0xc(%ebp)
    • RISC类型 - 读/修改/写回

2)的语言

  • 指令SRC,DST与INSTR DST,SRC
  • 编码
  • 标签的语法,注释,汇编指令,十进制和十六进制数

3)局部堆栈帧,局部变量和指针

  • push ebp; mov esp, ebp;
  • 呼叫在该特定示例中使用的约定(全局寄存器,通用寄存器,或堆叠(帧)的概念
  • 项不嵌合到寄存器通常是使用指针

传递给学习这将使用表示存储器&寄存器的内容进行指令级的调试器和最佳地突出显示每个指令之间的变化的最佳方式。当然还要阅读指令集体系结构手册和应用程序二进制接口规范。

祝你好运!

+0

伟大的回答,当我开始时会喜欢这个。 :) – alex