【发布时间】:2015-04-15 22:38:09
【问题描述】:
我最近自学了计算机系统。我不明白二进制炸弹实验室第 2 阶段的以下代码。我输入了 1 2 3 4 5 6 作为输入
这些车道有什么作用? 这个-0x20是怎么来的?它的目的是什么?
0x08048bab <+7>: lea -0x20(%ebp),%eax
0x08048bae <+10>: mov %eax,0x4(%esp)
这些代码来自
Dump of assembler code for function phase_2:
0x08048ba4 <+0>: push %ebp
0x08048ba5 <+1>: mov %esp,%ebp
0x08048ba7 <+3>: push %ebx
0x08048ba8 <+4>: sub $0x34,%esp
0x08048bab <+7>: lea -0x20(%ebp),%eax
0x08048bae <+10>: mov %eax,0x4(%esp)
0x08048bb2 <+14>: mov 0x8(%ebp),%eax
0x08048bb5 <+17>: mov %eax,(%esp)
0x08048bb8 <+20>: call 0x804928d <read_six_numbers>
0x08048bbd <+25>: cmpl $0x0,-0x20(%ebp)
0x08048bc1 <+29>: jns 0x8048be3 <phase_2+63>
0x08048bc3 <+31>: call 0x804924b <explode_bomb>
0x08048bc8 <+36>: jmp 0x8048be3 <phase_2+63>
0x08048bca <+38>: mov %ebx,%eax
0x08048bcc <+40>: add -0x24(%ebp,%ebx,4),%eax
0x08048bd0 <+44>: cmp %eax,-0x20(%ebp,%ebx,4)
0x08048bd4 <+48>: je 0x8048bdb <phase_2+55>
0x08048bd6 <+50>: call 0x804924b <explode_bomb>
0x08048bdb <+55>: inc %ebx
0x08048bdc <+56>: cmp $0x6,%ebx
0x08048bdf <+59>: jne 0x8048bca <phase_2+38>
0x08048be1 <+61>: jmp 0x8048bea <phase_2+70>
2.
感觉
mov 0xc(%ebp),%eax
正在获取输入。
我试过 x /s $ebp+oxc,它打印这个字符串 \350\366\377\277\b\367\377\277>\223\004\b{\246\004\b. 那是什么?我真的很难理解这是在做什么?我试图打印出每个内存地址中的值,但没有帮助。
当我尝试在 cmp $0x5,%eax 之前打印 x /d $eax 时,它显示无法访问地址 0x0 的内存。
Dump of assembler code for function read_six_numbers:
0x0804928d <+0>: push %ebp
0x0804928e <+1>: mov %esp,%ebp
0x08049290 <+3>: sub $0x28,%esp
0x08049293 <+6>: mov 0xc(%ebp),%eax
0x08049296 <+9>: lea 0x14(%eax),%edx
0x08049299 <+12>: mov %edx,0x1c(%esp)
0x0804929d <+16>: lea 0x10(%eax),%edx
0x080492a0 <+19>: mov %edx,0x18(%esp)
0x080492a4 <+23>: lea 0xc(%eax),%edx
0x080492a7 <+26>: mov %edx,0x14(%esp)
0x080492ab <+30>: lea 0x8(%eax),%edx
0x080492ae <+33>: mov %edx,0x10(%esp)
0x080492b2 <+37>: lea 0x4(%eax),%edx
0x080492b5 <+40>: mov %edx,0xc(%esp)
0x080492b9 <+44>: mov %eax,0x8(%esp)
0x080492bd <+48>: movl $0x804a64b,0x4(%esp)
0x080492c5 <+56>: mov 0x8(%ebp),%eax
0x080492c8 <+59>: mov %eax,(%esp)
0x080492cb <+62>: call 0x8048860 <__isoc99_sscanf@plt>
0x080492d0 <+67>: cmp $0x5,%eax
0x080492d3 <+70>: jg 0x80492da <read_six_numbers+77>
0x080492d5 <+72>: call 0x804924b <explode_bomb>
【问题讨论】:
-
sub $0x34,%esp指令在堆栈上为局部变量之类的东西创建了一些暂存空间。lea -0x20(%ebp),%eax指令将此暂存空间中的位置地址加载到eax。
标签: assembly