Вопросы по обучению ассемблеру для вызова CTF - PullRequest
0 голосов
/ 24 апреля 2018

Я только начал погружаться в сборку для решения сложных задач 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? пройти третий блок кода?

Я не уверен, где мое понимание кода неверно - очень ценю любые советы или указатели. Прошу прощения, если это охватывает базовые знания - я прорабатываю их самостоятельно.

Спасибо!

1 Ответ

0 голосов
/ 24 апреля 2018

Ну, это не добавление того, что должно привести к 113.Если вы посмотрите поближе, вы должны заметить, что добавление 1 к eax выполняется перед повторным считыванием значения символа в eax.Только это новое загруженное значение сравнивается с 0x71.Итак, эта первая операция служит только для приращения индекса.

Немного более подробного объяснения:

08048699  mov     eax, dword [ebp+0x8 {arg1}] 

Это загружает адрес входного буфера в eax.

0804869c  add     eax, 0x1 

После этого eax указывает на второй символ во входном буфере.

0804869f  movzx   eax, byte [eax]

Эта строка загружает символ, на который указывает eax (входной буфер), в eax (расширяется с помощьюнули до 32 бит).

И только после последней строки у вас есть сравнение с 0x71.Таким образом, второй символ должен быть 'q'.

Если добавить eax, 0x1 указывает eax на второй символ во входном буфере, означает ли это, что movzx eax, byte [eax] без add eax,0x1 указывает на первый символ в буфере?

Да, и у вас был этот код / ​​шаблон в первом блоке под адресами: 08048688 & 0804868b.add eax,1 нет, а остальное то же самое.

означает ли dword [ebp+0x8 {arg1}] входной буфер всегда или только в этом случае?

Только в этом случае - это [ebp+0x8] в основном указывает на аргумент в стеке - в этом случае это входной буфер, но он не должен быть таким.

Кстати, я думаю, что вам будет лучше с такими вопросами по Reverse Engineering .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...