C 컴파일러 플래그없이 버퍼 오버 플로우를 위해 Ubuntu에서 스택 보호 비활성화


10

쉘 코드를 시도하고 Linux 보호 기능을 비활성화하고 싶습니다.

나는 플래그를 사용하여 컴파일 할 수 있지만 일반적으로 기억할 수없는 이러한 보호를 비활성화하는 다른 방법이 있다는 것을 알고 있습니다. 도와주세요?

답변:


6

스택 보호는 컴파일러에 의해 수행됩니다 (스택에 추가 데이터를 추가하고 호출시 일부를 숨기고 반환시 온 전성을 검사). 다시 컴파일하지 않고는 비활성화 할 수 없습니다. 요점의 일부입니다. 정말로 ...


6
ASLR을 사용하려면 OS가 런타임에이를 수행해야합니다. NX 비트도 시스템 지원이 필요합니다. 런타임에 어떤 부분을 비활성화 할 수 없습니까?
Jeff Ferland

25

폰 브랜드가 가지고있는 것 (올바로 +1)의 확장을 위해 리눅스의 스택 보호에는 두 부분이 있습니다.

카나리아 스택

스택 카나리아는 vonbrand가 참조하는 컴파일러 적용 기능입니다. 다시 컴파일하지 않고는 비활성화 할 수 없습니다.

이것을 스스로 증명하고 작동 방식을 확인하려면 다음 코드를 사용하십시오.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

int mybadfunction(char* a_bad_idea)
{
    char what[100];
    strcpy(what, a_bad_idea);
    printf("You passed %s\n", what);
}

int main(int argc, char** argv)
{
    printf("Tralalalaala\n");
    mybadfunction(argv[1]);
}

이제 gcc -fstack-protector -masm=intel -S test.c출력을 모아서 읽을 수 있도록 gnu로 컴파일 하십시오. 중요한 점은 mybadfunction함수가 종료 되면 다음과 같은 작은 코드가 있다는 것입니다.

    mov edx, DWORD PTR [ebp-12]
    xor edx, DWORD PTR gs:20
    je  .L2
    call    __stack_chk_fail

짐작할 수 있듯이 스택 쿠키를 가져 와서 [ebp-12]at의 값과 비교합니다 gs:20. 일치하지 않습니까? 그런 다음 __stack_chk_failglibc 에서 함수를 호출 하여 프로그램을 바로 종료시킵니다.

익스플로잇 작성과 관련하여이 문제를 해결할 수있는 방법이 있지만 셸 코드 테스트 사례를 작성하는 쉬운 방법은 프로그램을로 컴파일하는 것입니다 -fno-stack-protector.

실행 불가능한 페이지

최신 Linux 시스템에는 다른 고려 사항이 있습니다. 일반적인 쉘 코드 테스트 스텁을 사용하는 경우 :

char buffer[] = {...};

typedef void (* func)(void);

int main(int argc, char** argv)
{
    func f = (func) buffer;
    f();
    return 0;
}

최신 GCC / Linux는 .rodataPE 파일 의 섹션을 실행 권한없이 읽기 전용으로 매핑합니다 . 이 블로그 게시물 의 코드 샘플을 사용 하여이 기능 을 해제 할 수 있습니다 . 기본 아이디어 : mprotect쉘 코드 데이터가있는 페이지에 원하는 권한을 추가하는 데 사용합니다.

비 실행 스택

쉘 코드를 사용하여 기존의 악용 시나리오 (예 : 위의 잘못된 코드)를 테스트하려는 경우 간단한 경우에 스택이 실행 가능한지 확인해야합니다. PE 파일 형식에는 스택이 실행 가능한지 여부를 결정하는 필드가 포함되어 있습니다 . execstack으로 이를 쿼리하고 제어 할 수 있습니다 . 실행 가능한 스택을 활성화하려면 다음을 실행하십시오.

execstack -s /path/to/myprog

이는 재 컴파일없이 임의의 프로그램에서 수행 수 있지만, 스택 카나리아는 컴파일시 구워 지므로 자동으로 비활성화되지 않습니다.

추가 보너스 : aslr :

끄려면 echo 0 > /proc/sys/kernel/randomize_va_space.

귀중한 펭귄을 어떻게 악용하는지 누군가에게 말했습니까?

아니요. 모든 익스플로잇은 스택 카나리아 (거의 사소한 일이 아님)를 해결하고 execstackset 프로그램을 찾 거나 설정 (어쨌든 임의 명령을 실행할 수 있음을 의미) 또는 libc / return으로 돌아 가기와 같은 더 어려운 기술을 사용해야합니다 오리엔테이션 프로그래밍.


0

이 옵션을 사용하여 일부 보호 (스택 스매싱 감지 및 스택 실행 가능)를 비활성화 할 수 있습니다.

--z execstack
-f no-stack-protector

다음 명령으로 Bash를 사용하여 ASLR (주소 공간 레이아웃 무작위 화)을 끌 수도 있습니다.

echo 0 > /proc/sys/kernel/randomize_va_space
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.