Что происходит, когда вы нажимаете адрес памяти в сборке? - PullRequest
0 голосов
/ 19 апреля 2011

Я пытаюсь перепроектировать разобранный бинарный файл.Я не понимаю, что он делает, когда он делает вызов, такой как:

push $ 0x804a254

Что делает его еще более запутанным, так это то, что этот адрес не является адресом инструкции илиэто в таблице символов.Что он делает?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2011

Это один из 3 случаев: это либо константа (будь то хеш, число, битовые флаги или типизированный адрес), адрес переменной или буфера (включая строковые литералы), который статически размещается в любой области илиоперанд, проанализированный неправильно (из-за шифрования / джанкинга).Его истинное значение относительно его использования (будь то аргумент вызова или косвенный метод установки mem / reg).

1 голос
/ 19 апреля 2011

Эта инструкция просто помещает 32-битную константу (0x804a254) в стек.

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

Перед началом любого обратного инжиниринга я бы рекомендовал прочитать эту книгу ( Секреты обратного инжиниринга )а затем руководство по набору инструкций X86 ( Intel или AMD ).Я предполагаю, что вы Reverse Engineering для x86 CPU.

1 голос
/ 19 апреля 2011

Значение, которое вы видите, отсутствует ни в таблице, ни в инструкции, потому что это локальная переменная.(Локальные переменные не поддерживают любое имя, связанное с таблицей символов, поскольку они являются «живыми», пока вы находитесь в определенном методе). Адрес эквивалентен чему-то вроде

void somefunc()
{
  int t; //t may have address 0x804a254 since this is a local variable.
}

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

...