답변:
폰 브랜드가 가지고있는 것 (올바로 +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
이는 재 컴파일없이 임의의 프로그램에서 수행 할 수 있지만, 스택 카나리아는 컴파일시 구워 지므로 자동으로 비활성화되지 않습니다.
끄려면 echo 0 > /proc/sys/kernel/randomize_va_space.
아니요. 모든 익스플로잇은 스택 카나리아 (거의 사소한 일이 아님)를 해결하고 execstackset 프로그램을 찾 거나 설정 (어쨌든 임의 명령을 실행할 수 있음을 의미) 또는 libc / return으로 돌아 가기와 같은 더 어려운 기술을 사용해야합니다 오리엔테이션 프로그래밍.