| [ CnUnix ] in KIDS 글 쓴 이(By): HellCat (reentrant.� ) 날 짜 (Date): 1995년07월13일(목) 16시55분52초 KDT 제 목(Title): 로칼 변수 다시. 우선 옵티마이즈가 되서 대부분 경우 로칼 오토클래스가 GCC 에서는 아마 레지스터로 심져 포인터도 들어가기 쉬울꺼에요. 그럴 경우는 일단 다른 함수가 불려 지면 프로그램 스택으로 레지스터들이 푸쉬푸쉬..될텐데.. 그 차례는 어떻게 가정을 할수가 없죠. 가정을 해서 했는데..그게 틀려진다고 해도 전혀 어디에 불평할 곳이 없으니까요. 우선 시작은 함수 자체의 주소 즉.. void foo() 일경우 void *ptr = (void*)foo; 해놓으면 일단 함수로의 엑세스 포인터는 구해지지만.. 거기서 부터믄 천상 콤파일러를 리버스 엔지니어링 기법으로 룰을 찾아내던지..콤파일러 소스코드를 뒤져서 방법을 찾아내야 하는데... 사실..저 궁금한 것은..그 방법보다도 어째서.. C 의 스코핑 룰을 완전히 무시해야 하는 것을 하려고 하시는지...정말 궁금해요.. 사실..C 를 공부할때 이런것은 절대로 하지 말아라 하고 해야 하는 것 같은데.. 어쨋던 시작은 함수자체의 주소인데요. 그리고 시 자체내에서 스택에 access 가 가능한건지.. 인라인 어셈블리를 쓰지 않고서..글쎄요. 사실 프레임포인터 내의 정보는 머 시스템 스택이라고 할수가 없는데. 즉..펑션 포인터 부텀 오프셋으로 잡아내는 것은 스택이라고 할수가 없을테고.. 리턴주소하고 펑션주소등이 어셈블리 종류에 따라서 또 레지스터 들하고 그런것들이 시스템 스택에 푸쉬 해놓고 점프를 할텐디.. 그 스택은 씨에서 엑세스 하는 길이 없는 걸로 아는데.. 인라인 어셈브리 외에는요. 즉 펑션 포인터 자체는 알수 있어도 그것이 푸쉬되고 또 레지스터들이 푸쉬되어 들어간 스택 자체는 엑세스가 없는 걸로 알아요. --- if (t_snddis(KIDS[i].fd, (struct t_call *)NULL) == -1) { t_error("날 죽여라!!"); longjmp ((jmp_buf) HELL, -1); } |