解释一些装配说明

时间:2015-12-16 13:31:47

标签: assembly

我正在尝试解决此问题crackme。在我没有尝试自己解决之前,我不想检查解决方案。不幸的是我无法弄清楚这里发生了什么:

0x080496e0:  movl   $0xc324148b, 0x804974b
0x080496ea:  call   0x804974b
...
0x0804974b:  jmp    0x080496e0

2 个答案:

答案 0 :(得分:2)

这里没有什么复杂的事情发生。如果你无法理解这一点,你可能会过度思考它。尽量像执行此操作的机器一样愚蠢。或者你可能在说明中挣扎?如果是这样,请参考一些x86参考。

0x080496e0:  movl   $0xc324148b, 0x804974b

该指令只是在地址0xc324148b的内存中写入值0x804974b。在英特尔语法中,我发现它更直观,它将写成mov dword ptr 0x804974b, 0xc324148b

0x080496ea:  call   0x804974b

该指令调用位于地址0x804974b的函数。它将推送一个返回地址,跳转到0x804974b并在那里执行代码。您可以在此注意到,这也是前一个值写入的地址。这意味着DWORD实际上是一些代码,而不是一些数据。这在像x86这样的Von Neumann架构中是完全有效的(内存的读/写/执行属性可能存在一些问题,但你可以假设它在这里设置正确)。

答案 1 :(得分:2)

第一条指令(movl $0xc324148b, 0x804974b)在地址0x804974B处写入4个字节 这些字节按顺序排列:0x8B,0x14,0x24,0xC3。

前3个形成指令:mov edx, [esp]
最后一个也形成一条指令:ret

由于第二条指令(call 0x804974b)`调用该地址,因此动态创建的指令对将被执行。