Assembly 推导x86汇编代码
我有一些汇编代码,基本上是想弄清楚它的功能。我在gdb中运行disassem得出以下结论: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
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
的一种优化方式。