Можно ли оставаться внутри оболочки, открытой процессом, использующим execl, прямо перед процессом, называемым _exit?

#linux #assembly #gdb #execl

Вопрос:

Изучая ROP и использование гаджетов, я наткнулся на случай, когда у меня есть надежный гаджет, который работает execl("sh", "-c", "/bin/sh") , но _exit(0x7f) сразу же после этого.

При тестировании этого гаджета я обнаружил, что оболочка действительно открывается и закрывается через долю секунды при _exit вызове.

Гаджет, найденный в libc.so.6:

 LEA        EAX,[ESI   0xfffa8b28]=>DAT_0016bb28             ; "-c"
SUB        ESP,0xc
PUSH       0x0
PUSH       dword ptr [ESP   param_2]
PUSH       EAX=>DAT_0016bb28                                ; "-c"
LEA        EAX,[ESI   0xfffa8b30]=>DAT_0016bb30             ; "sh"
PUSH       EAX=>DAT_0016bb30                                ; "sh"
LEA        EAX,[ESI   0xfffa8b2b]=>DAT_0016bb2b             ; "/bin/sh"
PUSH       EAX=>DAT_0016bb2b                                ; "/bin/sh"
CALL       execl                                            
ADD        ESP,0x14
PUSH       0x7f
CALL       _Exit
 

При использовании в gdb:

 process 239607 is executing new program: /bin/dash
sh: 0: -c requires an argument
[Inferior 1 (process 239607) exited with code 02]
(gdb) r
Starting program: /bin/dash
$
 

При использовании в обычном исполнении без отладчика он просто останавливается.

Мой вопрос в том, является ли это обреченным гаджетом, или есть возможный способ все еще использовать его?

Комментарии:

1. Он _Exit никогда не вызывается, потому что был передан контроль sh , который, в свою очередь, немедленно вышел сам по себе из-за неправильного вызова. Если вы вызываете sh правильно, он должен оставаться открытым. Согласно сообщению об ошибке, он работает /bin/sh -c вместо /bin/sh -c /bin/sh

2. @thatotherguy Хм. Об этом я как-то не подумал. Так что мне просто нужно, чтобы он работал правильно, и я в порядке. Спасибо!

3. Всегда помните: execl заменяет текущий процесс другим. Любой код, следующий за execl вызовом, запускается только в том случае, если вызов каким-либо образом завершается неудачно. Поэтому, если вы можете ввести execl вызов, совершенно не имеет значения, что последует за вызовом.

Ответ №1:

Как упоминал @thatotherguy в своем комментарии, по-видимому, параметр _exit was not called, and the problem was that this gadget had a simple constrain that I couldn't figure out - 2 (который я не контролировал) должен был иметь определенное значение.

Исправлено путем поиска другого гаджета. Спасибо за обучение!