Я только начал погружаться в сборку для решения сложных задач CTF, и я прекрасно провожу время. Однако текущая проблема, над которой я работаю, поставила меня в тупик - надеясь, что кто-то может помочь с несколькими основными вопросами Ассамблеи - или укажет на хорошие ресурсы.
Я запустил двоичный файл, предоставленный для вызова, через двоичного ниндзя и определил ключевую функцию - отслеживание логики в этой функции доставляет мне проблемы.
Функция запускается довольно простым способом - я добавил свои собственные комментарии, насколько я понимаю:
08048661 push ebp {__saved_ebp} ;Push old base pointer onto stack
08048662 mov ebp, esp {__saved_ebp} ;Function preamble (?)
08048664 sub esp, 0x18
08048667 sub esp, 0xc
0804866a push dword [ebp+0x8 {arg1}] {var_2c} ;var_2c is user input (arg1)
0804866d call strlen ;Get the string length of user input
08048672 add esp, 0x10 ;??
08048675 mov dword [ebp-0x10 {var_14}], eax ;Assign EAX to var_14
08048678 cmp dword [ebp-0x10 {var_14}], 0x13
;Compares string length to 0x13 (decimal 19) - if it's longer continue
0804867c ja 0x8048688
Этот первый блок, кажется, получает длину строки ввода пользователя - и если длина строки больше 19, он продолжается до следующего блока.
В следующем блоке я думаю, что мое понимание неверно:
08048688 mov eax, dword [ebp+0x8 {arg1}]
;Set EAX to the memory location of the user input (arg1)
0804868b movzx eax, byte [eax]
;Replace EAX with the first byte of EAX (arg1)
0804868e cmp al, 0x61
;Compare the first byte of EAX with 0x61 (decimal 97 / binary 01100001)
;if equal, continue to next block
08048690 je 0x8048699
Это будет означать, что первый байт правильного ответа должен быть 01100001 - но это, кажется, противоречит следующему блоку:
08048699 mov eax, dword [ebp+0x8 {arg1}]
;Set EAX to the memory location of the user input (arg1)
0804869c add eax, 0x1
;Add 0x1 to EAX (decimal 1 / binary 00000001)
0804869f movzx eax, byte [eax]
;Replace EAX with only the first byte of EAX (arg1+1)
080486a2 cmp al, 0x71
;Compare the first byte of EAX with 0x71 (decimal 113 / binary 01110001)
;if equal, continue to next block
080486a4 je 0x80486ad
Это то место, где я в данный момент застрял - если первый байт ввода должен быть десятичным 97 / двоичный 01100001 для прохождения второго блока, то как добавление 1 к нему может привести к десятичному 113 / двоичному 01110001? пройти третий блок кода?
Я не уверен, где мое понимание кода неверно - очень ценю любые советы или указатели. Прошу прощения, если это охватывает базовые знания - я прорабатываю их самостоятельно.
Спасибо!