버퍼 오버 플로우를 활성화하기 위해 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을 참조하십시오.
'programing tip' 카테고리의 다른 글
Groovy-객체를 JSON 문자열로 변환 (0) | 2020.11.14 |
---|---|
C0103 메시지를 중지하도록 PyLint에 "상수가 아닌 변수입니다"라고 어떻게 말합니까? (0) | 2020.11.14 |
실제로 파이썬에서 StringIO는 무엇에 사용됩니까? (0) | 2020.11.14 |
Windows에서 cygwin을 사용하여 git gui를 시작할 수 없습니다. (0) | 2020.11.14 |
단위 테스트를 실행하는 동안 디렉터리를 가져 오는 방법 (0) | 2020.11.14 |