Учебное пособие по разрушению стека 64-битного Linux: часть 1 использует заголовок Получить суть адреса переменной среды, чтобы получить адрес переменной среды. Обязательное условие — сначала отключить ASLR через echo 0 > /proc/sys/kernel/randomize_va_space
.
Содержание сути таково:
/*
* I'm not the author of this code, and I'm not sure who is.
* There are several variants floating around on the Internet,
* but this is the one I use.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *ptr;
if(argc < 3) {
printf("Usage: %s <environment variable> <target program name>\n", argv[0]);
exit(0);
}
ptr = getenv(argv[1]); /* get env var location */
ptr += (strlen(argv[0]) - strlen(argv[2]))*2; /* adjust for program name */
printf("%s will be at %p\n", argv[1], ptr);
}
Почему *2
используется для настройки имени программы?
Я предполагаю, что имя программы сохраняется дважды над стеком.
Следующая диаграмма из https://lwn.net/Articles/631631/ содержит более подробную информацию:
------------------------------------------------------------- 0x7fff6c845000
0x7fff6c844ff8: 0x0000000000000000
_ 4fec: './stackdump\0' <------+
env / 4fe2: 'ENVVAR2=2\0' | <----+
\_ 4fd8: 'ENVVAR1=1\0' | <---+ |
/ 4fd4: 'two\0' | | | <----+
args | 4fd0: 'one\0' | | | <---+ |
\_ 4fcb: 'zero\0' | | | <--+ | |
3020: random gap padded to 16B boundary | | | | | |
На этой диаграмме ./stackdump
используется для выполнения программы. Итак, я вижу, что имя программы ./stackdump
сохраняется один раз над строками среды. И если ./stackdump
запускается из оболочки Bash, Bashell сохранит его в строках окружения с ключом _
:
_
(Подчеркивание.) При запуске оболочки задайте абсолютный путь, используемый для вызова оболочки или выполняемого сценария оболочки, переданного в среде или списке аргументов. Впоследствии расширяется до последнего аргумента предыдущей команды после расширения. Также установите полное имя пути, используемое для вызова каждой команды, выполняемой и помещаемой в среду, экспортированную в эту команду. При проверке почты этот параметр содержит имя почтового файла.
Строки среды находятся над стеком. Таким образом, имя программы еще раз сохраняется над стеком.