解码和理解汇编代码

时间:2012-11-18 09:44:46

标签: assembly

  

可能重复:
  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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

这里有三个类别需要理解:

1)计算机架构:

  • 寄存器架构/指令集架构
    • 算术(例如a + b)
    • 按位逻辑,例如OR b
    • 具有不同标志的条件(例如a == b或a&lt; b)用于签名&amp;无符号
      • cmp %edx,%eax
      • 无条件:jmp
      • 有条件的:je; jle等 - 与条件代码标志状态寄存器
      • 相关
      • 子程序:call;
    • 内存架构
    • 不同种类的寻址模式
      • 立即sub $0x38,%esp
    • 内存地址计算lea -0x24(%ebp),%eax
    • CISC类型:您可以直接“添加”到内存地址 addl $0x1,-0xc(%ebp)
    • RISC类型 - 阅读/修改/写回

2)语言的语法

  • 指令src,dst vs. instr dst,src
  • 编码标签,注释,汇编程序指令,十进制和十六进制数字

3)本地堆栈帧,局部变量和指针的概念

  • push ebp; mov esp, ebp;
  • 此特定示例中使用的调用约定(全局寄存器,通用寄存器或堆栈(帧)
  • 不适合寄存器的项目通常使用指针传递

了解这一点的最佳方法是使用指令级调试器来显示内存和放大器。注册内容并最佳突出显示每条指令之间的变化。当然,阅读指令集架构手册和应用程序二进制接口规范。

祝你好运!