-2

可能重复:
解码和理解汇编代码

我是 c 和汇编代码的初学者,我们有一个“炸弹”作业(用 c 编写)调用需要某些密码的方法,但代码不可见,我需要通过查看汇编代码来确定正确的密码.

代码表明此方法的密码是 6 个数字,作为“输入”传递给方法uzzle_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
4

2 回答 2

2

这里大约需要理解三类:

1)计算机体系结构:

  • 寄存器架构/指令集架构
    • 算术(如 a+b)
    • 按位逻辑,例如 a OR b
    • 具有不同标志的有符号和无符号条件(例如 a == 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;
  • 此特定示例中使用的调用约定(全局寄存器、通用寄存器或堆栈(帧)
  • 不适合寄存器的项目通常使用指针传递

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

祝你好运!

于 2012-11-18T10:23:19.170 回答
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
于 2012-11-18T09:49:15.447 回答