что это за адрес в gdb asm?

(gdb) print $ebp+4
$3 = (void *) 0xbffff74c
(gdb) x/x 0xbffff74c
0xbffff74c: 0x08049116
(gdb) x/x 0x08049116
0x8049116 <__libc_start_main+390>:  0xe8240489

тут пролог функции. что такое 0xbffff74c? я думал стек начинается с адреса вида 0x080448000 и по нему бегает регистр ESP, а тут смущает 0xbffff74c.


Ответы (1 шт):

Автор решения: Супрематический Крестьянин

Данный ответ для 32 разрядного приложения.

0xbffff74c - это адрес значения адреса возврата в стеке.
Адрес, по которому будет взято значение адреса возврата и присвоено регистру EIP в конце функции командой RET.

Для лучшего понимания - в момент вызова функции, адрес следующей инструкции кладётся в стек, затем происходит переход к вызываемой функции. Начало функции стандартно именуют прологом, в котором сохраняют значение регистра EBP (кладут на стек), после регистру EBP присваивается значение верха стека из регистра ESP, таким образом EBP указывает на своё прошлое значение (адрес в стеке), которое хранится в стеке. И так как стек растёт вниз, то есть адреса растут вниз (от большего к меньшему), мы можем обратится к элементам лежащим за регистром EBP прибавляя к нему число кратное 4 (кратное 4, т.к. речь идёт о 32-разрядном процессе). Но мы также помним, что за прошлым значением регистра EBP на стеке лежал адрес возврата (адрес следующей инструкции, после вызова функции/процедуры). Следовательно, чтобы обратиться к адресу возврата, нужно прибавить к значению регистра EBP 4. Но делать этого не приходится, редко функции потребуется обращаться к адресу возврата таким образом, он нужен лишь для инструкции RET. Инструкция RET берёт последнее значение лежащее на стеке и присваивает его регистру EIP, однако перед её использованием необходимо подготовить стек (удалить выделенные на стеке локальные переменные функции, восстановить использованные регистры в функции, в том числе регистр EBP).

На самом деле, инструкцию RET можно заменить парой других инструкций:

pop eax
jmp eax

Однако это неэффективно и теряется значение регистра, в данном случае регистра EAX.

→ Ссылка