스택의 시작 주소 얻어오는 방법
글쓴이: emptysky / 작성시간: 일, 2004/05/16 - 3:43오후
unsigned long get_ESP(void) { __asm__("movl %ESP, %EAX"); //EAX에 리턴할값이 오는걸 ESP로 대신. } int main() { printf("ESP : 0x %x \n", get_ESP()); return(0); }
이런식으로 하면 모든 프로세스의 스택시작주소(물론가상주소)를 가져올수 있는다는데 실제 돌려보니 값이 항상 변합니다.
모든 프로세스의 스택의 시작주소는 항상 같아야 하지않나요?
아니면 위의 코드가 잘못된것인가요?
답변 미리감사할께요~
Forums:
실행시 환경변수, 실행 파일의 이름, 실행하는 파일의 인자가 스택에 들어
실행시 환경변수, 실행 파일의 이름, 실행하는 파일의 인자가 스택에 들어가게 됩니다. 그래서 모든 프로세스의 스택 실행 주소가 달라지게 되죠.
esp 는 스택탑이잖아요. 시작주소는 베이스..0xc0000000
esp 는 스택탑이잖아요. 시작주소는 베이스..
0xc0000000 아래로 거꾸로 스택이 차곡차곡 쌓이는데요. esp 는 그 맨아래지점.. 그러니 코카스님 말씀대로, 환경변수나 여러 실행중인 프로그램정보들이 들어가면.. 길이도 다를테고, 하니까 esp 는 매번 바뀌는거죠.
힘내세요.
음..
그렇다면 위의 프로그램을 컴파일한후 그것을 여러번 실행한다면
그값은 항상 같아야 하지 않나요?
위의 프로그램은 여러번 실행시키면 매개변수도 없고 환경변수도 같은테니 ESP 포인터 값이 실행시마다 같아야 하지 않을까요?
『 아픔은.. 아픔을 달래줄 약이 무엇인지 알면서도 쓰지 못할 때 비로소 그 아픔의 깊이를 알수가 있음이다. 』
『 for return...』
사용하시는 리눅스 배포판이 어떻게 되시나요? 레드햇 기본 설정을
사용하시는 리눅스 배포판이 어떻게 되시나요?
레드햇 기본 설정을 쓰신다면 커널의 랜덤스택으로 인해 값이 변합니다.
그렇다면..
음...
랜덤 스택주소의 사용의 원리가 궁금하네요 ^^
그말은 레댓커널에서는 오버플로우와 같은공격에 조금더 안전하단 말씀인거 같은데...
조금 더 안전한데 이미 그에대한 파해법도 나왔습니다. :)
조금 더 안전한데 이미 그에대한 파해법도 나왔습니다. :)
[quote="cocas"]조금 더 안전한데 이미 그에대한 파해법도 나왔
죄송합니다만,
위의 랜덤 스택에 대한 자료나 파해법에 대한 자료는
어디서 찾아볼 수 있는지요?
바쁘시다면 구글에서 찾을 수 있게 keyword 정도의 팁 만이라도
부탁 드립니다 :)
랜덤 스택에 대한 자료는 아직 저도 본 기억이 없습니다. 그냥 해보니 그
랜덤 스택에 대한 자료는 아직 저도 본 기억이 없습니다. 그냥 해보니 그렇더라.. 하는거죠. 새로 나올 phrack에 실리지 않을까도 싶은데 잘 모르겠네요.
파해법에 대한것은 khdp에 가셔서 mutacker님이 올리신 자료를 보면 알 수 있습니다.
jmp esp를 가리키는 주소만 찾으면면 쉘코드가 위치한 곳의 주소를 쉽게 추적할 수 있습니다. 윈도계열 exploit에서 특히 좋죠.
저는 FC2 인데 기본 설치커널인 2.4 에서는 랜덤스택이 적용되는데
저는 FC2 인데 기본 설치커널인 2.4 에서는 랜덤스택이 적용되는데
2.6.9 커널에서는 적용이 안됩니다.
설치옵션중 어느것을 다시 설정해줘야 하나요???
전 메뉴를 다 봐도 random stack 비슷한 말은 안보이네요
check stack overflow 이런 항목은 선택되어 있는데...
공유메모리 실행권한 버그는 패치된거 같네요.
덧,
다시 찾아보니 2.6.9에서 exec_shield 패치를 다시해서 컴파일해야 하는군요
댓글 달기