왜 이 [Broken Pipe] 오류가 발생합니까?

왜 이 [Broken Pipe] 오류가 발생합니까?

우분투 18.04를 사용하고 있습니다. 버퍼 오버플로 공격을 시도하고 있습니다.

내가 작성하고 공격하려고 시도한 C 프로그램은 다음과 같습니다.

// test.c
#include <stdio.h>

void f();

int main(int argc, char *argv[])
{
    printf("argc : %d\n", argc);
    for(int i = 0; i < argc; i++)
    {
        printf("argv[%d] : %s\n", i, argv[i]);
    }
    printf("End of program\n");
    return 0;
}

void f()
{
    printf("You got to the hidden function!\n");
}

...다음으로 컴파일됩니다.

gcc test.c -o test

내 Python3 주입 스크립트는 다음과 같습니다.

# inject.py
push = "A" * 1000
print(push)

inject.py나는 의 출력을 다음으로 파이프하는 3가지 방법을 시도했습니다 test.

# attempt 1
$ ./test <(python3 inject.py)
argc : 2
argv[0] : ./test
argv[1] : /dev/fd/63
End of program
$ Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
^C

^ 여기서는 실제로 내 입력 없이 두 번째로 진행되었으며 정지된 후 $종료해야 했습니다 .ctrl+C

# attempt 2
$ python3 inject.py | ./test
argc : 1
argv[0] : ./test
End of program
Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
# attempt 3
$ ./test <(python3 -c "print(\"A\"*1000)")
argc : 2
argv[0] : ./test
argv[1] : /dev/fd/63
End of program
$ Exception ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe
^C

^ 이는 시도 1과 유사합니다.

나는 내가 하고 있는 일이 YouTube에서 본 많은 버퍼 오버플로와 비슷하다고 생각합니다. 오류가 날 것으로 예상했는데 SegFault결과적으로 Broken pipe오류였습니다.

내가 뭘 잘못했나요? 왜 s Broken pipe대신에 받는 걸까요 SegFault?

설명: 제가 요구하는 것은 "버퍼 오버플로 공격을 수행하는 방법"이 아니라 "왜 오류가 발생하며 Broken pipe어떻게 해결합니까?"입니다. 이것은 *nix 명령줄 문제이므로 이 커뮤니티의 범위 내에 있다고 생각합니다.

답변1

Python 프로그램에서 데이터 출력을 읽지 않기 때문에 Python 프로그램에서 "깨진 파이프" 오류가 발생합니다. C 프로그램은 표준 입력 스트림을 완전히 무시하고 종료 시 스트림이 닫히므로 testPython 프로그램은 듣지 않는 파이프에 쓰려고 합니다.

bash()에서 프로세스 대체를 사용하면 파이프도 사용되므로 <(...)동일한 문제가 발생합니다. 이 예에서 데이터는 표준 입력을 통해서가 아니라 명령에 대한 첫 번째 명령줄 인수에 표시된 파일에서 도착합니다. 이 파일은 절대 열지 마세요.

이 문제를 해결하려면 C 프로그램이 표준 입력의 모든 입력이나 명령의 첫 번째 인수가 나타내는 경로 이름을 사용하는지 확인하십시오.

현재 코드는 버퍼 오버플로, 분할 오류 또는 C 코드의 기타 오류를 발생시키지 않습니다.

나는 당신이 어떻게든 C 코드에서 버퍼 오버플로를 일으키기를 원한다고 가정합니다. 예를 들어 Python 코드의 데이터를 너무 작은 버퍼로 읽어서 이를 수행할 수 있습니다.

yes그런데 Python 코드는 Python일 필요는 없습니다. 유틸리티(아마도 head -n 1000에서와 같이 파이프 또는 유사 ) 와 같이 많은 데이터를 생성하는 간단한 셸 명령일 수 있습니다 yes A | head -n 1000.

관련 정보