装配 - 二进制炸弹
问题描述:
在确定x86中二进制炸弹实验室的特定区段时遇到了一些麻烦。装配 - 二进制炸弹
0x08048ce8 <+0>: sub $0x1c,%esp
0x08048ceb <+3>: movl $0x804a4e4,(%esp)
0x08048cf2 <+10>: call 0x804917b <string_length>
0x08048cf7 <+15>: add $0x1,%eax
0x08048cfa <+18>: mov %eax,(%esp)
0x08048cfd <+21>: call 0x8048870 <[email protected]>
0x08048d02 <+26>: movl $0x776f7242,(%eax)
0x08048d08 <+32>: movl $0x2c65696e,0x4(%eax)
0x08048d0f <+39>: movl $0x756f7920,0x8(%eax)
0x08048d16 <+46>: movl $0x65726120,0xc(%eax)
0x08048d1d <+53>: movl $0x696f6420,0x10(%eax)
0x08048d24 <+60>: movl $0x6120676e,0x14(%eax)
0x08048d2b <+67>: movl $0x63656820,0x18(%eax)
0x08048d32 <+74>: movl $0x666f206b,0x1c(%eax)
0x08048d39 <+81>: movl $0x6a206120,0x20(%eax)
0x08048d40 <+88>: movl $0x2e626f,0x24(%eax)
0x08048d47 <+95>: movb $0x62,0xc(%eax)
我不确定movoc指令在malloc之后做了什么。当我尝试检查gdb中的地址时,我得到“无法访问内存......”。那么这些举措的重点是什么?
编辑
感谢您对malloc部分的帮助。我仍然卡住,但这是直接在上面的部分。
mov %eax,0x4(%esp) <== moves string loaded into malloc to esp
mov 0x20(%esp),%eax <== takes user input and move to eax
mov %eax,(%esp) <== moves that user input back into esp?
call 0x804919a <strings_not_equal>
答
在malloc之后,EAX持有指向最近配对的内存的基指针。随后的每一个movl都将双字常量移动到EAX,并带有适当的偏移量。所以很明显,movl只是将数据加载到最近的malloc'd区域。
'%eax'包含_malloc_返回的指针。所有这些举措都将即时数据值转移到malloc的内存区域。这些值似乎是文本编码为32位整数。 4个字节的文本可以适合32位值。 'movl $ 0x776f7242,(%eax)'例如似乎将0x42,0x72,0x6f,0x77的ascii字符(记得我们是小端,所以顺序反转)到malloc'ed内存的前4个字节区。 –
'mov%eax,0x4(%esp)'将'%eax'中的32位值移动到0x04 +%esp开始的内存位置。 'mov 0x20(%esp),%eax'移动从内存位置%esp + 0x20开始的32位值并将它们放入%eax。 'mov%eax,(%esp)'将%eax中的值移动到0x00 +%esp开始的内存位置。我建议你看看一些关于[80386寻址模式]的文档(https://en.wikipedia.org/wiki/X86#Addressing_modes),也许https://cs.nyu.edu/courses/fall10/V22.0201- 002/addressing_modes.pdf –