我正在尝试解决此问题crackme。在我没有尝试自己解决之前,我不想检查解决方案。不幸的是我无法弄清楚这里发生了什么:
0x080496e0: movl $0xc324148b, 0x804974b
0x080496ea: call 0x804974b
...
0x0804974b: jmp 0x080496e0
答案 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
)`调用该地址,因此动态创建的指令对将被执行。