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

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

쉘 코드를 사용해 보고 싶고 Linux 보호를 비활성화하고 싶습니다.

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

답변1

vonbrand(오른쪽, +1)가 말한 내용을 확장하면 Linux의 스택 보호는 두 부분으로 나뉩니다.

스택 카나리아

스택 카나리아는 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.cgnu 항목으로 compile()을 실행하면 출력을 행복하게 조립하고 읽을 수 있습니다. 중요한 점은 함수를 종료할 때 다음 mybadfunction과 같은 작은 코드 조각이 있다는 것입니다.

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

추측할 수 있듯이 이는 에서 스택 쿠키를 가져 [ebp-12]와서 의 값과 비교하는 것입니다 gs:20. 불일치? 그런 다음 glibc에서 함수를 호출하여 __stack_chk_fail프로그램을 종료합니다.

Exploit을 작성하여 이 문제를 해결하는 방법은 다양하지만 쉘코드 테스트 케이스를 구축하는 가장 쉬운 방법은 -fno-stack-protector.

실행할 수 없는 페이지

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

char buffer[] = {...};

typedef void (* func)(void);

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

.rodata최신 GCC/Linux는 실행 권한 없이 PE 파일의 읽기 전용 부분을 매핑합니다 . 이 기능을 꺼야 합니다. 다음 코드 예제를 사용하면 됩니다.이 블로그 게시물. 기본 개념: mprotect쉘코드 데이터가 있는 페이지에 원하는 권한을 추가할 수 있습니다.

실행 불가능한 스택

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

execstack -s /path/to/myprog

이것할 수 있는재컴파일 없이 모든 프로그램에서 이 작업을 수행할 수 있지만 스택 카나리아는 컴파일 타임에 내장되므로 자동으로 비활성화되지 않습니다.

보너스: aslr:

이 기능을 끄려면 echo 0 > /proc/sys/kernel/randomize_va_space.

방금 내 소중한 펭귄 사용법을 누군가에게 알려줬나요?

아니요. 모든 익스플로잇은 스택 카나리아(매우 중요)를 피해 execstack이를 설정하는 세트가 있는 프로그램을 찾거나(이미 임의의 명령을 실행할 수 있음을 의미) libc /return 지향 프로그래밍 반환과 같은 더 어려운 기술을 사용해야 합니다.

답변2

스택 보호는 컴파일러에 의해 수행됩니다(스택에 일부 추가 데이터를 추가하고 호출 시 일부 데이터를 저장하고 반환 시 무결성을 확인함). 다시 컴파일하지 않고는 비활성화할 수 없습니다. 그게 요점의 일부입니다. 정말...

답변3

이러한 옵션을 사용하여 특정 보호(스택 스매싱 감지 및 스택 실행 가능 만들기)를 비활성화할 수 있습니다.

--z execstack
-f no-stack-protector

다음 명령을 사용하여 Bash를 사용하여 ASLR(Address Space Layout Randomization)을 끌 수도 있습니다.

echo 0 > /proc/sys/kernel/randomize_va_space

관련 정보