Относительно состояния стека - PullRequest
0 голосов
/ 16 октября 2011

У меня есть программа, для которой я хотел понять состояние стека во время его выполнения.Мой пример программы достаточно прост,

#include <stdio.h>
 int main(){
   setuid(0);
   system("/bin/bash");
   return 1;
 }

Теперь, когда я отлаживаю эту программу с помощью gdb, я получаю адрес функции setuid (), но когда я смотрю на стек, я не могу определить его адрес.

Состояние моего стека после начала выполнения main (),

Ajai@ubuntu:/tmp$ gdb -q mal
Reading symbols from /tmp/mal...done.
(gdb) b 2
Breakpoint 1 at 0x80483fd: file mal.c, line 2.
(gdb) r
Starting program: /tmp/mal 

Breakpoint 1, main () at mal.c:4
4        setuid(0);
(gdb) x/32xw $esp
0xbffff3a0:    0x0015ed35    0x0011ea50    0x0804842b    0x0028bff4
0xbffff3b0:    0x08048420    0x00000000    0xbffff438    0x00145e37
0xbffff3c0:    0x00000001    0xbffff464    0xbffff46c    0x0012e414
0xbffff3d0:    0xffffffff    0x0012cff4    0x08048243    0x00000001
0xbffff3e0:    0xbffff420    0x0011da31    0x0012dad0    0xb7fffb48
0xbffff3f0:    0x00000001    0x0028bff4    0x00000000    0x00000000
0xbffff400:    0xbffff438    0xb68cac87    0x61d0d5f8    0x00000000
0xbffff410:    0x00000000    0x00000000    0x00000001    0x08048340
(gdb) p setuid
$1 = {<text variable, no debug info>} 0x1c8ee0 <setuid>

Неужели я смотрю на стек неправильно?

Я также хотел знать, как будет выглядеть адресВызов функции setuid () и ее параметра, а также вызов функции system () и ее параметра будут сохранены в стеке, когда функция main () начнет выполняться.

Извините, если вопрос такого рода уже задавалсяно я не смог найти.

Ответы [ 2 ]

4 голосов
/ 16 октября 2011

Ваш вопрос чрезвычайно неясен, вероятно, потому что вы не понимаете, как работают и взаимодействуют стек и вызовы.

Каким-то образом вы ожидаете найти адрес setuid в стеке до вызова этой функции. Но этого адреса не будет вообще (ни до вызова, ни во время вызова, ни после его завершения).

Если вы установите точку останова на setuid, запустите эту точку останова и проверьте стек. Затем вы увидите адрес в main (не самого main, а инструкции из main, которая следует за инструкцией CALL, которая в первую очередь привела вас в setuid).

Я предполагаю, что именно так выглядит стек, когда выполнение собирается перейти к функции setuid () (при условии, что у меня есть точка останова при вызове функции setuid)

1. вызов setuid ()

2. адрес возврата, который будет достигнут после вызова функции setuid ()

3.параметры для функции setuid ().

Как я уже говорил, ваши предположения неверны: в стеке нет «вызова setuid» (но 2. и 3. верны).

1 голос
/ 16 октября 2011

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

...