SHELLCODE
Jon Erickson이 쓴 Hacking: The Art of Exploitation이라는 책을 읽고 프로그램을 활용하기 위해 환경 변수의 주소를 추정해 보았습니다 .
위치를 찾기 위해 달릴 때마다 getenv("SHELLCODE");
결과는 완전히 달랐습니다.
내 껍질에서 추출됨:
> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3
프로그램 이름을 바꾸거나 새로운 환경변수를 추가하면 위치가 조금씩 달라지는 것으로 알고 있는데 위치가 왜 이렇게 다른걸까요?
답변1
당신이 설명하는 것은 악용 방지 기능입니다.주소 공간 레이아웃 무작위화(ASLR). 기본적으로 커널이 디스크에서 프로그램의 ELF 파일을 로드할 때마다 커널은 프로그램 함수 호출 스택의 최상위 주소를 약간 다른("임의") 주소에 배치합니다. 쉘코드의 주소와 환경 변수 argv
(쉘코드 중 하나)는 프로그램이 호출될 때마다 다른 주소를 갖게 됩니다.
ASLR은 버퍼 오버플로 및 기타 스택 관련 취약점을 악용하기 어렵게 만듭니다. 공격자는 함수 호출 스택에 있는 변수와 값의 서로 다른 주소를 해석하기 위해 코드를 작성하거나 무언가를 수행해야 합니다.
다음을 수행하여 ASLR을 비활성화할 수 있는 것 같습니다.
echo 0 > /proc/sys/kernel/randomize_va_space
루트 사용자로. Ubuntu를 명시적으로 참조했으므로 위 명령은 다릅니다.
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space