Вернуться к поисковым указателям libc
Для класса в области безопасности программного обеспечения мне нужно сделать простой возврат к libc-атаке. Мне удалось создать perl script, который завершает атаку с учетом правильных указателей на system(), exit() и строку /bin/sh. Я нашел эти указатели, используя gdb "p system" и т.д. Теперь я хочу сделать эксплойт немного более "динамическим", написав программу c, которая находит во время выполнения adres систем() и exit(). Как мне это сделать? Я попробовал "& system", но это, похоже, совсем не дает мне правильный адрес.
Изменить:
Система не поддерживает ASLR.
Ответы
Ответ 1
Вы можете легко найти адреса, используя binutils
- objdump
или readelf
, но только адреса символов, которые фактически использует двоичный файл. Неиспользуемые символы не связаны с библиотекой libc.
Скажите, что вы хотите взломать команду ls
:
objdump -d `which ls` | less
вы найдете этот раздел:
0000000000402910 <[email protected]>:
402910: ff 25 da 89 21 00 jmpq *0x2189da(%rip) # 61b2f0 <_fini+0x208704>
402916: 68 5e 00 00 00 pushq $0x5e
40291b: e9 00 fa ff ff jmpq 402320 <_init+0x10>
Итак, теперь у вас есть адрес: 0x402910
- это адрес перехода функции exit()
(тот, который вы получили бы, если бы вы попытались printf("%x\n", exit);
.
Что касается system
, ls
не использует этот символ, поэтому вы не можете получить к нему доступ таким образом, поскольку он не связан.
Ответ 2
ASCII Armoring включен по умолчанию на некоторых популярных дистрибутивах Linux. Он обычно сопоставляет адреса важных библиотек с диапазоном памяти, содержащим NULL-байт. Вы можете больше узнать о том, как обойти ASCII Armoring здесь.
Ответ 3
Если я не ошибаюсь, вы пытаетесь написать программу на C, которая будет запускать и использовать уязвимую программу пользовательского пространства? В этом случае, если вы написаны на C, используется execve(), то это запустит уязвимый процесс с собственным пространством процесса. Это будет включать загрузку libc заново. Подумайте об этом так:
pwner
`-[libc]
`-./vuln
`-[libc]
В этом случае вашей динамической программе "pwner" нужно будет использовать что-то вроде syscall ptrace() для прослеживания уязвимой программы и получения указателей на libc. Это эффективно то, что делает GDB, когда он отлаживает двоичный файл. Ваша программа должна использовать спецификацию ELF, чтобы найти адрес E_ENTRY. Отсюда используйте ptrace(). Сначала с PTRACE_TRACEME, а затем PTRACE_PEEKTEXT.
Ответ 4
Я думаю, что &system
будет разрешено во время компиляции. Вы пробовали dlopen()
и dlsym()
? Просто предложения, я не знаю, будут ли они работать.
Edit
Ни один из них не будет работать вне контекста целевого процесса, если какой-то рандомизация размещения в адресном пространстве находится в место.