x64 Linux-обратная инженерия - понимание кода asm и ввода eax


0

В упражнении rootme я пытаюсь обойти элемент управления, реализованный для защиты функции «читать». Вы найдете прилагаемый код, на который я ссылаюсь. Как вы можете понять, что я могу вводить данные (с ограничениями) в бараках (с тем ограничением, что топор находиться под 100h из-за предыдущую инструкцию:

cmp ax, 100h 

Я знаю, что я могу изменить EAX значения перед входом в эту часть из Programe (часть програме перед ассемблерным закрытых). Тем не менее, у меня есть ощущение, что следующая инструкция предотвратить от чтения ах части регистра EAX.

movzx eax, word ptr [rax] 

вы бы иметь какие-либо идеи, если это будет возможно записать в верхние разряды rax так, чтобы он учитывался функцией чтения?

Большое спасибо! Извините, если все не очень ясно, я могу попытаться объяснить, если это необходимо.

disassembled piece of code

2

вы имели в виду старшие биты rax, а не ah? Похоже, что существует уязвимость (предположительно созданная путем компиляции и без правильной обработки 32-битного и 64-битного преобразования).

Если адрес, хранящийся в [rbp+username_buffer_input], находится за пределами 4 GiB, то верхние 32-биты будут содержать ненулевое значение в регистре rax. Следующий код может привести к очень большому значению nbytes и потенциалу переполнения буфера.

mov rax, [rbp+username_buffer_input] ; upper 32-bits of rax may not be zero 
movzx eax, word ptr [rax]    ; doesn't clear out upper 32-bits when reading from an address > 4 GiB 
movzx eax, ax       ; doesn't clear out upper 32-bits 
... 
mov rdx, rax       ; uh-oh - nbytes can have a non-zero value in the upper 32-bits of rax carried over from above 
  0

Спасибо за ваш драгоценный ответ! Вы правы, я имел в виду верхние биты 'rax', так что верхние биты' rdx' не обнуляются. Я не понимаю вашего утверждения в строке 2: «не считывает верхние 32-битные данные при чтении с адреса> 4 GiB». При отладке с помощью 'gdb' я вижу, что верхние биты' rax' очищаются при выполнении первого movzx, а 'rax' оценивается ранее' 0x7fffffffe410', так что он немного запутан ... 05 дек. 172017-12-05 20:17:40

  0

Скажем, 'rax' был '0x7fffffffe410', а 16-битное значение по этому адресу было' 0x1234'. После 'movzx eax, слово ptr [rax]' инструкция, 'eax' будет установлено в' 0x000', но 'rax' будет' 0x00007fff000' 06 дек. 172017-12-06 01:25:12

  0

. Я понимаю вашу идею. Я пытался раньше отслеживать это поведение через 'gdb', но он закончился другим результатом: я установил точку останова на строке 'mov rax, [rbp + username_buffer_input]' и выполнил: 'ir rax':' rax 0x7fffffffe410 140737488348176' 'x/s $ rax':' 0x7fffffffe410: " \ 003 "' Хорошо, это нормально, пока здесь, однако, после шага в 'si' я выполнил' ir eax rax', в результате получив 'eax 0x3 3'' rax 0x3 3'. Поэтому вопрос будет: знаете ли вы вариант компиляции или системный параметр, который мог бы заставить поведение, которое вы описывали ранее? 18 дек. 172017-12-18 13:31:51

  0

больше идей? 26 дек. 172017-12-26 15:50:31