Перейти к содержанию
  • записи
    83
  • комментария
    74
  • просмотра
    5294

Определение signed и unsigned модификаторов переменных в дизассемблере

Авторизация  
partoftheworlD

134 просмотра

Знание модификатора переменной на этапе реверса поможет найти проблемы в коде или новый функционал для читов. 

Для примера, если программист не указал модификатор переменной, то компилятор решит использоваться signed по стандарту, это может привести к проблемам, например к целочисленному переполнению, если в коде, не будет соответствующей проверки. Для начала посмотрим на таблицу, чтобы понять в чем разница.

 

image.thumb.png.121ca38a9bc3979e7c329fbd77747f53.png

 

Как вы видите, разница в диапазонах. А теперь посмотрим на примере одного и того же кода на c++, различие в инструкциях signed и unsigned модификаторов.

 

Signed                                |  Unsigned
push   rbp                            |  push   rbp
mov    rbp,rsp                        |  mov    rbp,rsp
mov    DWORD PTR [rbp-0x4],edi        |  mov    DWORD PTR [rbp-0x4],edi
cmp    DWORD PTR [rbp-0x4],0x62       |  cmp    DWORD PTR [rbp-0x4],0x62
jg     4004cc <test_signed(int)+0x1a> |  ja     4004c9 <test_signed(unsigned int)+0x17>
mov    eax,DWORD PTR [rbp-0x4]        |  mov    eax,DWORD PTR [rbp-0x4]
lea    edx,[rax+0x32]                 |  add    eax,0x19
mov    eax,DWORD PTR [rbp-0x4]        |  add    eax,eax
add    eax,edx                        |  jmp    4004c9 <test_signed(unsigned int)+0x17>
jmp    4004cc <test_signed(int)+0x1a> |  pop    rbp
pop    rbp                            |  ret
ret                                   |  

Первое это конечно же условные прыжки:

jg, jge, jl, jle = прыжки основанные на signed сравнении (Они проверяют SF флаг)
ja, jae, jb, jbe = прыжки основанные на unsigned сравнении (Они проверяют CF флаг)

Второе инструкции( на примере умножения и деления)

 

imul + idiv = signed
 mul + div  = unsigned

Это примеры для самых основных команд, которые встречаются чаще всего, хотите больше? Добро пожаловать в документацию .

 

На практике это дает возможность, делать отрицательное/огромное значение, там где не должно их быть. И в случае невнимательности программистов, что-то пойдет не так, но будет весело.

  • Плюс 3
Авторизация  


0 Комментариев


Рекомендуемые комментарии

Комментариев нет

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.