Я изучаю переполнение буфера и решая некоторые wargames. Была проблема, что вся память стеки выше буфера устанавливается в 0, за исключением того, обратный адрес главного, который будет:Почему значение LD_PRELOAD в стеке
buffer
[0000000...][RET][000000...]
и я могу переписать, что RET. Итак, я нашел несколько советов по решению этой проблемы. Должно было использовать LD_PRELOAD. Некоторые люди говорили, что значение LD_PRELOAD находится где-то в стеке не только в области переменных окружения стека. Поэтому я установил LD_PRELOAD и выполнил поиск и нашел его с помощью gdb.
$ export LD_PRELOAD=/home/coffee/test.so
$ gdb -q abcde
(gdb) b main
Breakpoint 1 at 0x8048476
(gdb) r
Starting program: /home/coffee/abcde
Breakpoint 1, 0x8048476 in main()
(gdb) x/s 0xbffff6df
0xbffff6df: "@èC\[email protected]/home/coffee/test.so"
(gdb) x/s 0xbffffc59
0xbffffc59: "LD_PRELOAD=/home/coffee/test.so"
(gdb) q
The program is running. Exit anyway? (y or n) y
$
Так что есть! Теперь я знаю, что значение LD_PRELOAD находится в стеке ниже буфера, и теперь я могу использовать!
Но мне интересно, почему LD_PRELOAD загружается на этот адрес памяти. Значение также относится к переменной окружения среды стека!
Какова цель этого? Спасибо.
Окружающая среда помещается в стек 'execve (2)' syscall, по спецификациям ABI –
@Basile Starynkevitch Я имею в виду, что LD_PRELOAD помещается на два места. – lbyeoksan
@lbyeoksan Я уверен, что Базиле Старынкевич знает, о чем он говорит. – 2013-04-20 14:35:55