2015-04-19 2 views
-1

У меня есть код сборки, и я в основном пытаюсь выяснить, что он делает. Я побежал disassem в БГД, чтобы придумать с этим:Deducing x86 Код сборки

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 <[email protected]> 
    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. 

Теперь, я новичок в Ассамблее в целом, и не следует ожидать, чтобы знать, что делает каждый команда. Однако сама программа принимает строковый ввод и кажется segfault, если вы не вводите какую-то правильную строку. Вооружившись этим знанием, я в основном пытаюсь найти, как будет выглядеть «правильная строка».

Из того, что я собрал, 113, 118 и 120 выбрасывают в код код seg (это было проверено экспериментально с помощью stepi). Единственный способ обойти это - как-то добраться до 101, который перепрыгивает через segfault и возвращает значение.

Кроме того, 12, кажется, добавляет «a» в качестве локальной переменной, а 16 добавляет «z» в качестве локальной переменной. 57, похоже, сбривает первый символ с вашего ввода.

Линия 71, где вызывается тест% al% al, по-видимому, имеет решающее значение для программы. Каждая входная строка, которую я кормлю, заканчивается тем, что не проходит этот тест и возвращается к 35, где кажется обреченным потерять первый символ строки и пройти процесс снова и снова, пока вы не останетесь с чем-либо, кроме " », и программа снова сработает.

Может кто-нибудь объяснить мне, что делает эта критическая линия 71, или предложить какое-либо представление о том, как этот код в целом функционирует?

+0

'test al, al' - оптимизированный способ сказать' cmp al, 0'. – a3f

ответ

1

Этот код сегментации в следующих случаях

  • Аргумент является нулевым указателем. Ожидается указатель на строку ASCIIZ.
  • Строка содержит что угодно, кроме прописных букв
  • Строка короче 20 символов.

Линия в < +71> выясняет, достиг ли конец строки. Он мог бы быть написан как cmp $0x0,%al, но многие программисты на ассемблере предпочли бы использовать test %al,%al. Результат тот же.

0x0804849b <+71>: test %al,%al 
Смежные вопросы