내 질문은 Stack allocation, padding, and alignment과 관련있다. 다음 함수를 고려하십시오 어셈블리 수준에서함수 호출 중 스택 구조
void func(int a,int b)
{
char buffer[5];
}
는 기능은 다음과 같습니다 : 나는 스택에 24 바이트가 할당되는 방법을 알고 싶어요
pushl %ebp
movl %esp, %ebp
subl $24, %esp
. 16 바이트 char 버퍼 [5] 할당 된 이해합니다. 나는 여분의 8 바이트가 왜 쓰이고 어떻게 할당되는지 이해하지 못한다. 위 링크의 맨 위 대답은 퇴근 후 퇴장을 의미합니다. 누군가 그것을 확장 할 수 있습니까?
[bottom] b , a , return address , frame pointer , buffer1 [top]
을하지만 난 간단한 버퍼 오버 플로우를 작성하고 반환 주소를 변경하는 것을 시도하고 있기 때문에이 잘못 될 수 :
나는 스택의 구조는 다음과 같습니다 것을 생각하고있다. 그러나 어떤 이유로 든 반송 주소는 변하지 않습니다. 스택에 다른 것이 있습니까?
푸시 및 해당 팝 작업을 이해합니다. func() 내부에서 func()의 반환 주소를 변경하려고합니다. char 버퍼 [5]를 만든 후 int 포인터를 만듭니다. 포인터를 다음을 수행하여 리턴 주소를 가리 키도록합니다. int * ret = buffer + 28; 프레임 포인터가 버퍼 다음에 오면 (버퍼 크기가 24이고 프레임 포인터가 4) 가정하십시오. 그래서 지금 ret가 반환 주소를 가리켜 야합니까? –
함수에서 반환 주소를 출력하는 예제를 제공하기 위해 편집을 완료했습니다. Visual Studio 2005에서 디버거를 사용하여 메모리 및 어셈블리 해제 창을 살펴 보았습니다. –
고마워요! 스택 맨 위에서 반송 주소를 찾으려고했습니다. 스택의 반환 주소 아래에있는 인수의 주소에서 빼서 동일한 작업을 수행했습니다. 함수 내부에서 지역 변수의 주소로 접근하는 것에 대해 의문점이 있지만, 내가 한 일은 내 문제를 해결해 준다 :-) –