Недавно я работал над вызовами CTF, которые требуют от злоумышленника установки шелл-кода в среде.Если ASLR отключен, можно полагаться только на небольшие различия, например, между средой оболочки и средой эксплуатируемого процесса (например, различия только из-за различий в двоичных именах).Однако GDB (и R2) внесут незначительные изменения в среду, что делает это очень трудным из-за незначительного смещения переменных среды, когда они не отлаживаются.
Например, GDBкажется хотя бы добавить переменные окружения LINES
и COLUMNS
.Однако их можно удалить, вызвав GDB следующим образом:
gdb -ex 'set exec-wrapper env -u LINES -u COLUMNS' -ex 'r < exploit.input' challenge.bin
Обратите внимание, что GDB будет неявно использовать полный путь при отладке двоичного файла, поэтому пользователь может дополнительно уменьшить любые различия, вызывая двоичный файл впохожим образом.
`pwd`/challenge.bin < exploit.input
Однако, здесь все же , похоже, есть некоторые различия.Мне много раз удавалось заставить эксплойт работать во время работы в GDB, но только для его сбоя при запуске без отладчика.Я читал упоминание о каком-то скрипте (иногда называемом setenv.sh
), который (якобы) можно использовать для настройки среды, подобной GDB, но я не смог его найти.
Глядя на окружение оболочки:
LANG=en_US.UTF-8
PROFILEHOME=
DISPLAY=:0
OLDPWD=/home/user
SHELL_SESSION_ID=e7a0e681012e480fb044a034a775bb83
INVOCATION_ID=8ef3be94d09f4e47a0322ddf0d6ed787
COLORTERM=truecolor
MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins
XDG_VTNR=1
XDG_SESSION_ID=c1
USER=user
PWD=/test
HOME=/home/user
JOURNAL_STREAM=9:15350
KONSOLE_DBUS_SESSION=/Sessions/1
KONSOLE_DBUS_WINDOW=/Windows/1
GTK_MODULES=canberra-gtk-module
MAIL=/var/spool/mail/user
WINDOWPATH=1
TERM=xterm-256color
SHELL=/bin/bash
KONSOLE_DBUS_SERVICE=:1.7
KONSOLE_PROFILE_NAME=Profile 1
SHELLCODE=����
XDG_SEAT=seat0
SHLVL=4
COLORFGBG=15;0
LANGUAGE=
WINDOWID=16777222
LOGNAME=user
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
XAUTHORITY=/home/user/.Xauthority
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
_=/usr/bin/env
и сравнивая его с GDG (LINES
и COLUMNS
удалены):
/test/challenge.bin
_=/usr/bin/gdb
LANG=en_US.UTF-8
DISPLAY=:0
PROFILEHOME=
OLDPWD=/home/user
SHELL_SESSION_ID=e7a0e681012e480fb044a034a775bb83
INVOCATION_ID=8ef3be94d09f4e47a0322ddf0d6ed787
COLORTERM=truecolor
MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins
XDG_VTNR=1
XDG_SESSION_ID=c1
USER=user
PWD=/test
HOME=/home/user
JOURNAL_STREAM=9:15350
KONSOLE_DBUS_SESSION=/Sessions/1
KONSOLE_DBUS_WINDOW=/Windows/1
GTK_MODULES=canberra-gtk-module
MAIL=/var/spool/mail/user
WINDOWPATH=1
SHELL=/bin/bash
TERM=xterm-256color
KONSOLE_DBUS_SERVICE=:1.7
KONSOLE_PROFILE_NAME=Profile 1
SHELLCODE=����
COLORFGBG=15;0
SHLVL=4
XDG_SEAT=seat0
LANGUAGE=
WINDOWID=16777222
LOGNAME=user
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
XDG_RUNTIME_DIR=/run/user/1000
XAUTHORITY=/home/user/.Xauthority
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
/test/challenge.bin
Видно, что среда не очень отличается при осмотре.Примечательно, что env GDB, похоже, имеет второй экземпляр имени отлаженного двоичного файла (например, challenge.bin
, в данном случае), а также тот факт, что он устанавливает _
для GDB, а не отлаженный двоичный файл.Смещения, по-видимому, в сторону выключены, даже с учетом этих небольших изменений.
TL; DR
Как могут различия в среде GDBбыть исключенным для случая, когда необходимо априори знать местонахождение вещей в среде с запущенным отладчиком и без него?
В попытке лениться кто-нибудь полностью охарактеризовал среду с GDB с / без или изменения, которые вносит GDB?
А для тех, кто заинтересован, R2 внес изменения в PATH
.Могут быть и другие различия.