我是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
答案 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)计算机架构:
cmp %edx,%eax
jmp
je
; jle
等 - 与条件代码或标志或状态寄存器 call
; sub $0x38,%esp
lea -0x24(%ebp),%eax
addl $0x1,-0xc(%ebp)
2)语言的语法
3)本地堆栈帧,局部变量和指针的概念
push ebp; mov esp, ebp;
了解这一点的最佳方法是使用指令级调试器来显示内存和放大器。注册内容并最佳突出显示每条指令之间的变化。当然,阅读指令集架构手册和应用程序二进制接口规范。
祝你好运!