Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 推导x86汇编代码_Assembly - Fatal编程技术网

Assembly 推导x86汇编代码

Assembly 推导x86汇编代码,assembly,Assembly,我有一些汇编代码,基本上是想弄清楚它的功能。我在gdb中运行disassem得出以下结论: Dump of assembler code for function Q5bomb: 0x08048454 <+0>: push %ebp 0x08048455 <+1>: mov %esp,%ebp 0x08048457 <+3>: sub $0x28,%esp 0x0804845a <+6>: cmpl $0

我有一些汇编代码,基本上是想弄清楚它的功能。我在gdb中运行disassem得出以下结论:

Dump of assembler code for function Q5bomb:
   0x08048454 <+0>: push   %ebp
   0x08048455 <+1>: mov    %esp,%ebp
   0x08048457 <+3>: sub    $0x28,%esp
   0x0804845a <+6>: cmpl   $0x0,0x8(%ebp)
   0x0804845e <+10>:    je     0x80484bb <Q5bomb+103>
   0x08048460 <+12>:    movb   $0x61,-0x12(%ebp)
   0x08048464 <+16>:    movb   $0x7a,-0x11(%ebp)
   0x08048468 <+20>:    movl   $0x0,-0x10(%ebp)
   0x0804846f <+27>:    mov    0x8(%ebp),%eax
   0x08048472 <+30>:    mov    %eax,-0xc(%ebp)
   0x08048475 <+33>:    jmp    0x8048495 <Q5bomb+65>
   0x08048477 <+35>:    mov    -0xc(%ebp),%eax
   0x0804847a <+38>:    movzbl (%eax),%eax
   0x0804847d <+41>:    cmp    -0x12(%ebp),%al
   0x08048480 <+44>:    jl     0x80484be <Q5bomb+106>
   0x08048482 <+46>:    mov    -0xc(%ebp),%eax
   0x08048485 <+49>:    movzbl (%eax),%eax
   0x08048488 <+52>:    cmp    -0x11(%ebp),%al
   0x0804848b <+55>:    jg     0x80484c1 <Q5bomb+109>
   0x0804848d <+57>:    addl   $0x1,-0xc(%ebp)
   0x08048491 <+61>:    addl   $0x1,-0x10(%ebp)
   0x08048495 <+65>:    mov    -0xc(%ebp),%eax
   0x08048498 <+68>:    movzbl (%eax),%eax
   0x0804849b <+71>:    test   %al,%al
   0x0804849d <+73>:    jne    0x8048477 <Q5bomb+35>
   0x0804849f <+75>:    cmpl   $0x13,-0x10(%ebp)
   0x080484a3 <+79>:    jle    0x80484c4 <Q5bomb+112>
   0x080484a5 <+81>:    mov    $0x80485ce,%eax
   0x080484aa <+86>:    mov    0x8(%ebp),%edx
   0x080484ad <+89>:    mov    %edx,0x4(%esp)
   0x080484b1 <+93>:    mov    %eax,(%esp)
   0x080484b4 <+96>:    call   0x8048330 <printf@plt>
   0x080484b9 <+101>:   jmp    0x80484cf <Q5bomb+123> //skips segfault
   0x080484bb <+103>:   nop
   0x080484bc <+104>:   jmp    0x80484c5 <Q5bomb+113>
   0x080484be <+106>:   nop
   0x080484bf <+107>:   jmp    0x80484c5 <Q5bomb+113>
   0x080484c1 <+109>:   nop
   0x080484c2 <+110>:   jmp    0x80484c5 <Q5bomb+113>
   0x080484c4 <+112>:   nop
   0x080484c5 <+113>:   mov    $0x0,%eax //segfaults the code
   0x080484ca <+118>:   mov    (%eax),%eax
   0x080484cc <+120>:   mov    %eax,-0x10(%ebp)
   0x080484cf <+123>:   leave  
   0x080484d0 <+124>:   ret    
---Type <return> to continue, or q <return> to quit---
End of assembler dump.
函数Q5bomb的汇编程序代码转储: 0x08048454:推送%ebp 0x08048455:mov%esp,%ebp 0x08048457:子$0x28,%esp 0x0804845a:cmpl$0x0,0x8(%ebp) 0x0804845e:je 0x80484bb 0x08048460:movb$0x61,-0x12(%ebp) 0x08048464:movb$0x7a,-0x11(%ebp) 0x08048468:movl$0x0,-0x10(%ebp) 0x0804846f:mov 0x8(%ebp),%eax 0x08048472:mov%eax,-0xc(%ebp) 0x08048475:jmp 0x8048495 0x08048477:mov-0xc(%ebp),%eax 0x0804847a:movzbl(%eax),%eax 0x0804847d:cmp-0x12(%ebp),%al 0x08048480:jl 0x80484be 0x08048482:mov-0xc(%ebp),%eax 0x08048485:movzbl(%eax),%eax 0x08048488:cmp-0x11(%ebp),%al 0x0804848b:jg 0x80484c1 0x0804848d:添加$0x1,-0xc(%ebp) 0x08048491:添加$0x1,-0x10(%ebp) 0x08048495:mov-0xc(%ebp),%eax 0x08048498:movzbl(%eax),%eax 0x0804849b:测试%al,%al 0x0804849d:jne 0x8048477 0x0804849f:cmpl$0x13,-0x10(%ebp) 0x080484a3:jle 0x80484c4 0x080484a5:mov$0x80485ce,%eax 0x080484aa:mov 0x8(%ebp),%edx 0x080484ad:mov%edx,0x4(%esp) 0x080484b1:mov%eax,(%esp) 0x080484b4:调用0x8048330 0x080484b9:jmp 0x80484cf//跳过segfault 0x080484bb:nop 0x080484bc:jmp 0x80484c5 0x080484be:否 0x080484bf:jmp 0x80484c5 0x080484c1:否 0x080484c2:jmp 0x80484c5 0x080484c4:否 0x080484c5:mov$0x0,%eax//seg对代码进行故障诊断 0x080484ca:mov(%eax),%eax 0x080484cc:mov%eax,-0x10(%ebp) 0x080484cf:离开 0x08048400:ret ---键入以继续,或键入q以退出--- 汇编程序转储结束。 现在,我对汇编一般来说是新手,不希望知道每个命令都做什么。然而,程序本身接受一个字符串输入,除非您输入某种正确的字符串,否则它似乎会出错。有了这些知识,我基本上是想找到一个“正确的字符串”应该是什么样子

根据我收集的数据,113、118和120在代码中抛出一个seg错误(这是用stepi进行实验测试的)。绕开这一点的唯一方法是以某种方式到达101,它跳过segfault并返回一个值

此外,12似乎添加了“a”作为局部变量,16添加了“z”作为局部变量。57似乎将输入的第一个字符去掉了

第71行调用了test%al%al,在某种程度上似乎对程序至关重要。我输入的每个输入字符串最终都无法通过测试,并返回到35,在这里,它似乎注定会丢失字符串的第一个字符,并一次又一次地执行该过程,直到只剩下“”而程序再次崩溃


有人能给我解释一下临界线71在做什么,或者对这段代码作为一个整体是如何工作的提供一些见解吗?

在以下情况下,这段代码会出错

  • 参数是空指针。需要指向ASCIIZ字符串的指针
  • 字符串包含除小写字母以外的任何内容
  • 该字符串少于20个字符
处的行将确定是否已到达字符串的末尾。它可以像
cmp$0x0,%al
那样编写,但许多汇编语言程序员更喜欢使用
test%al,%al
。结果是一样的

0x0804849b <+71>:    test   %al,%al
0x0804849b:测试%al,%al

test al,al
是表示
cmp al,0
的一种优化方式。