환경 변수의 위치가 왜 그렇게 많은가?


9

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

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


getenv매뉴얼은 변수의 값을 포함하는 문자열에 대한 포인터를 반환 말한다. 다른 모든 것은 지정되어 있지 않으므로 커널 및 / 또는 컴파일러는 포인터 약속이 유지되는 한 원하는 위치에 값을 유지할 수 있습니다. 나는 이것에 대한 정확한 대답이 무거운 마법사 일 수 있으며 다양한 메모리 매핑 구현 세부 사항과 달의 위상에 달려 있다고 생각합니다 . (나는 당신에게 정확한 답을 줄만큼 마법사가 아닙니다.)
Anko

"프로그램 이름이 수정되거나 새로운 환경 변수가 추가되면 위치가 약간 다를 수 있지만 위치가 왜 그렇게 다른가?" 가능한 모든 구현 중 가장 간단한 것은 사실이지만 반드시 필요한 것은 아닙니다.
dmckee --- ex-moderator 고양이 4

답변:


13

설명은 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

그렇습니다. 나는 책 저자가 아직 ASLR을 갖지 않은 Ubuntu 10.04를 사용한다는 것을 알았습니다.
Janman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.