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
프로그램 이름이 수정되거나 새로운 환경 변수가 추가되면 위치가 약간 다를 수 있지만 위치가 왜 그렇게 많은지 이해합니다.
"프로그램 이름이 수정되거나 새로운 환경 변수가 추가되면 위치가 약간 다를 수 있지만 위치가 왜 그렇게 다른가?" 가능한 모든 구현 중 가장 간단한 것은 사실이지만 반드시 필요한 것은 아닙니다.
—
dmckee --- ex-moderator 고양이 4
getenv
매뉴얼은 변수의 값을 포함하는 문자열에 대한 포인터를 반환 말한다. 다른 모든 것은 지정되어 있지 않으므로 커널 및 / 또는 컴파일러는 포인터 약속이 유지되는 한 원하는 위치에 값을 유지할 수 있습니다. 나는 이것에 대한 정확한 대답이 무거운 마법사 일 수 있으며 다양한 메모리 매핑 구현 세부 사항과 달의 위상에 달려 있다고 생각합니다 . (나는 당신에게 정확한 답을 줄만큼 마법사가 아닙니다.)