Вернуться к поисковым указателям 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

Ни один из них не будет работать вне контекста целевого процесса, если какой-то рандомизация размещения в адресном пространстве находится в место.