programing tip

버퍼 오버 플로우를 활성화하기 위해 gcc 컴파일러 최적화를 끄는 방법

itbloger 2020. 11. 14. 09:57
반응형

버퍼 오버 플로우를 활성화하기 위해 gcc 컴파일러 최적화를 끄는 방법


나는 그것이 작동하기 위해 컴파일러 최적화 보호를 비활성화 해야하는 숙제 문제해결 하고 있습니다. 우분투 리눅스에서 gcc 4.4.1을 사용하고 있지만 어떤 플래그가 올바른지 알 수 없습니다. 아키텍처에 따라 다르다는 것을 알고 있습니다. 내 컴퓨터는 32 비트 Intel 프로세서로 실행됩니다.

감사.


그것은 좋은 문제입니다. 이 문제를 해결하려면 ASLR을 비활성화해야합니다. 그렇지 않으면 g () 주소를 예측할 수 없습니다.

ASLR 비활성화 :

sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space'

카나리아 비활성화 :

gcc overflow.c -o overflow -fno-stack-protector

카나리아와 ASLR이 비활성화 된 후에는 재미와 이익을 위해 스택 스매싱에 설명 된 것과 같은 직접적인 공격이어야합니다.

다음은 우분투에서 사용되는 보안 기능 목록입니다. https://wiki.ubuntu.com/Security/Features NX 비트에 대해 걱정할 필요가 없습니다. g () 주소는 항상 실행 가능한 메모리 영역에 있습니다. TEXT 메모리 세그먼트 내에 있기 때문입니다. NX 비트는 스택 또는 힙에서 쉘 코드를 실행하려는 경우에만 작동하며이 할당에는 필요하지 않습니다.

이제 가서 그 EIP를 제거하십시오 !


Urm, 지금까지의 모든 대답은 Rook의 대답이 정확하지 않습니다.

입력 :

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

뒤에 :

gcc -fno-stack-protector -z execstack -o bug bug.c

ASLR, SSP / Propolice 및 Ubuntu의 NoneXec을 비활성화합니다 (9.10에 배치되었으며 해결하기가 매우 간단하며 페이지를 실행 파일 및 jmp로 매핑 하는 mprotect (2) 기술 참조 ) 약간 도움이되지만 이러한 "보안 기능"은 다음과 같습니다. 아니오는 오류가 없다는 것을 의미합니다. `-z execstack '플래그가 없으면 페이지에 실행 불가능한 스택 표시가 있습니다.


최신 배포판 (2016 년 기준)에서는 PIE가 기본적으로 활성화되어 있으므로 컴파일 할 때 명시 적으로 비활성화해야합니다.

다음은 일반적으로 버퍼 오버플로 연습으로 로컬에서 플레이 할 때 도움이 될 수있는 약간의 명령 요약입니다.

카나리아 비활성화 :

gcc vuln.c -o vuln_disable_canary -fno-stack-protector

DEP 비활성화 :

gcc vuln.c -o vuln_disable_dep -z execstack

PIE 비활성화 :

gcc vuln.c -o vuln_disable_pie -no-pie

위에 나열된 모든 보호 메커니즘을 비활성화합니다 (경고 : 로컬 테스트에만 해당).

gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie

32 비트 컴퓨터의 경우 -m32매개 변수도 추가해야합니다 .


-fno-stack-protector깃발을 사용해보십시오 .


나는 그것이 오래된 스레드라는 것을 알고 있지만 버퍼 오버플로를 수행하기 위해 ASLR을 비활성화 할 필요가 없음을 지적하고 싶습니다! ASLR이 Enabled (kernel_randomize_va_space = 2) 인 경우에도 컴파일 된 실행 파일이 PIE가 아니면 적용되지 않으므로 u가 -fPIC -pie 플래그로 파일을 컴파일하지 않으면 ASLR이 적용되지 않습니다.

-fno-stack-protector로 카나리아를 비활성화하는 것만으로 충분하다고 생각합니다. ASLR이 작동하는지 확인하려면 (위치 독립적 인 코드를 설정해야 함) 다음을 사용하십시오. hardening-check executable_name


전체 페이지를 인용하지는 않지만 최적화에 대한 전체 매뉴얼은 http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options에서 볼 수 있습니다.

그것의 소리에서 최소한 -O0, 기본값 및 다음 을 원합니다 .

-fmudflap -fmudflapth -fmudflapir

이를 지원하는 프런트 엔드 (C 및 C ++)의 경우 모든 위험한 포인터 / 배열 역 참조 작업, 일부 표준 라이브러리 문자열 / 힙 함수 및 범위 / 유효성 테스트가있는 기타 관련 구성을 계측합니다. 이렇게 계측 된 모듈은 버퍼 오버플로, 유효하지 않은 힙 사용 및 기타 클래스의 C / C ++ 프로그래밍 오류에 영향을받지 않아야합니다. 인스 트루먼 테이션은 별도의 런타임 라이브러리 (libmudflap)에 의존하며, 링크 타임에 -fmudflap이 제공되면 프로그램에 링크됩니다. 계측 된 프로그램의 런타임 동작은 MUDFLAP_OPTIONS 환경 변수에 의해 제어됩니다. 옵션은 env MUDFLAP_OPTIONS = -help a.out을 참조하십시오.

참고 URL : https://stackoverflow.com/questions/2340259/how-to-turn-off-gcc-compiler-optimization-to-enable-buffer-overflow

반응형