Фундаментальные основы хакерства




Шаг второй. Знакомство с дизассемблером - часть 5


  00406010: E4 40 40 00 00 00 00 00 00 00 00 00 20 12 40 00  ф@@......... .@.

  00406020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

  00406030: 45 6E 74 65 72 20 70 61 73 73 77 6F 72 64 3A 00  Enter password:.

  00406040: 6D 79 47 4F 4F 44 70 61 73 73 77 6F 72 64 0A 00  myGOODpassword..

  ^^^^^^^^^                                                  ^^^^^^^^^^^^^^^

  00406050: 57 72 6F 6E 67 20 70 61 73 73 77 6F 72 64 0A 00  Wrong password..

  00406060: 50 61 73 73 77 6F 72 64 20 4F 4B 0A 00 00 00 00  Password OK.....

Ага, пароль расположен по смещению 0x406040

(левая колонка чисел), стало быть и указатель на него равен 0x406040. Попробуем найти это число в дизассемблированном листинге тривиальным контекстным поиском в любом текстовом редакторе.

Нашли? Вот оно (в тексте выделено жирным шрифтом):

  00401045: 68 40 60 40 00     push        406040h

  0040104A: 8D 55 98           lea         edx,[ebp-68h]

  0040104D: 52                 push        edx

  0040104E: E8 4D 00 00 00     call        004010A0

  00401053: 83 C4 08           add         esp,8

  00401056: 85 C0              test        eax,eax

  00401058: 74 0F              je          00401069

Это один из двух аргументов функции 0х04010A0,

заносимых в стек машинной командой push. Второй аргумент – указатель на локальный буфер, вероятно, содержащий введенный пользователем пароль.

Тут нам придется немного отклониться от темы разговора и подробно рассмотреть передачу параметров. Наиболее распространенны всего два следующие способаы

передачи аргументов функции – через регистры и через стек.

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




Содержание  Назад  Вперед