태그 보관물: environment-variables

environment-variables

환경 변수의 위치가 왜 그렇게 많은가? 환경 변수의 주소를 근사하려고합니다

Jon Erickson의 Hacking : The Art of Exploitation 책을 읽고, SHELLCODE프로그램을 악용하기 위해 환경 변수의 주소를 근사하려고합니다 .

내가 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

프로그램 이름이 수정되거나 새로운 환경 변수가 추가되면 위치가 약간 다를 수 있지만 위치가 왜 그렇게 많은지 이해합니다.



답변

설명은 ASLR ( Address Space Layout Randomization) 이라는 착취 방지 기능 입니다. 기본적으로 커널은 프로그램 함수 호출 스택의 최상위 주소를 커널이 디스크에서 프로그램의 ELF 파일을로드 할 때마다 약간 다른 ( “랜덤”) 주소에 둡니다. 의 주소 argv와 쉘 코드가 하나있는 환경 변수는 각 프로그램 호출과 함께 변화하는 주소의 끝.

ASLR은 버퍼 오버플로 및 기타 스택 관련 취약점을 악용하기 어렵게 만듭니다. 악용자는 함수 호출 스택에서 변수 및 값의 다양한 주소를 설명하기 위해 코드를 작성하거나 무언가를 수행해야합니다.

다음과 같은 방법으로 ASLR을 비활성화 할 수 있습니다.

echo 0 > /proc/sys/kernel/randomize_va_space

루트 사용자로서. Ubuntu를 명시 적으로 언급 했으므로 위 명령은 다릅니다.

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


답변