Различия в макете среды с и без GDB - PullRequest
0 голосов
/ 03 июня 2018

Недавно я работал над вызовами 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.Могут быть и другие различия.

1 Ответ

0 голосов
/ 03 июня 2018

Как можно устранить различия в среде GDB

Один из способов - запустить двоичный файл за пределами GDB (нужно, чтобы двоичный файл ожидал подключения GDB, как описано здесь ), и присоедините к нему GDB "извне".

Обновление:

рассматриваемый двоичный файл является частью задачи, и источникне предоставляется

Вы можете исправить _start с помощью jmp _start (поэтому двоичный файл никогда не будет проходить после первой инструкции).После подключения замените jmp на исходную инструкцию и начните отладку.

Обновление 2:

Вы знакомы с лучшим процессом?

Чтобы найти смещение заданной функции в файле ELF, вам необходимо два значения: смещение функции внутри сечения и смещение сечения в файле.

Например,:

$ readelf -Ws a.out | grep  ' _start'
58: 00000000004003b0    43 FUNC    GLOBAL DEFAULT   11 _start

Это говорит о том, что _start связан в 0x4003b0 в разделе 11.

Что это за раздел, каков его начальный адрес и где вфайл запускается?

$ readelf -WS a.out | grep '\[11\]'
  [11] .text             PROGBITS        00000000004003b0 0003b0 000151 00  AX  0   0 16

Теперь мы видим, что _start находится в самом начале .text (это обычно имеет место), и что .text начинается со смещения 0x3b0 вфайл.КЭД.

Еще лучший способ - использовать GDB для выполнения исправления (GDB будет выполнять поиск всех смещений).Предположим, я хочу переписать первую инструкцию _start с помощью инструкции 0xCC:

$ gdb --write -q ./a.out
Reading symbols from ./a.out...done.

Сначала давайте рассмотрим исходные инструкции:

(gdb) x/4i _start
   0x4003b0 <_start>:   xor    %ebp,%ebp
   0x4003b2 <_start+2>: mov    %rdx,%r9
   0x4003b5 <_start+5>: pop    %rsi
   0x4003b6 <_start+6>: mov    %rsp,%rdx

Теперь давайте исправим первую:

(gdb) set *(char*)0x4003b0 = 0xCC
(gdb) x/4i _start
   0x4003b0 <_start>:   int3   
   0x4003b1 <_start+1>: in     (%dx),%eax
   0x4003b2 <_start+2>: mov    %rdx,%r9
   0x4003b5 <_start+5>: pop    %rsi
(gdb) quit
Segmentation fault (core dumped)   <<-- this is a GDB bug. I should fix it some day.

$ objdump -d a.out
...
Disassembly of section .text:

00000000004003b0 <_start>:
  4003b0:       cc                      int3   <<-- success!
  4003b1:       ed                      in     (%dx),%eax
  4003b2:       49 89 d1                mov    %rdx,%r9
  ...

Вуаля!

...