문제

C ++에서 "위험한"프로그램을 작성하여 한 스택 프레임에서 다른 스택 프레임으로 앞뒤로 점프했습니다. 목표는 가장 낮은 수준의 통화 스택에서 발신자로 점프하고, 무언가를 한 다음, 매번 모든 통화를 건너 뛰는 것을 다시 뛰어 넘는 것입니다.

스택베이스 주소를 수동으로 변경 하여이 작업을 수행합니다 (설정 %ebp) 및 라벨 주소로 점프합니다. 그것은 스택 손상없이 GCC와 ICC와 함께 완전히 작동합니다. 이 날은 멋진 날이었습니다.

이제 나는 같은 프로그램을 취하고 C에서 다시 작성하고 있으며 작동하지 않습니다. 특히 GCC v4.0.1 (Mac OS)에서는 작동하지 않습니다. 새 스택 프레임으로 점프하면 (스택베이스 포인터가 올바르게 설정된 상태) 다음 지침이 실행되며 fprintf. 여기에 나열된 마지막 지침은 충돌, Dereferencing null :

lea    0x18b8(%ebx), %eax
mov    (%eax), %eax
mov    (%eax), %eax

디버깅을했는데 설정하여 %ebx 스택 프레임을 전환 할 때 수동으로 등록합니다 (처음에 함수를 떠나기 전에 관찰 한 값을 사용하여) 버그를 수정합니다. 이 레지스터는 GCC의 "Position Independent Code"를 다루고 있음을 읽었습니다.

위치 독립 코드 란 무엇입니까? 위치 독립 코드는 어떻게 작동합니까? 이 레지스터는 무엇을 가리키는가?

도움이 되었습니까?

해결책

PIC는로드 될 때 동적으로 재배치되는 코드입니다. 비 PIC 인 코드에는 점프 및 호출 주소가 링크 시간에 설정되어 있습니다. PIC에는 그러한 값이 존재하는 모든 장소를 .dll과 매우 유사하게 참조하는 테이블이 있습니다.

이미지가로드되면 로더는 해당 값을 동적으로 업데이트합니다. 다른 체계는 "기본"을 정의하는 데이터 값을 참조하고 대상 주소는 기본에서 계산을 수행하여 결정됩니다. 베이스는 일반적으로 로더에 의해 다시 설정됩니다.

마지막으로, 다른 체계는 알려진 상대적 오프셋을 호출하는 다양한 트램폴린을 사용합니다. 상대 오프셋에는 로더가 업데이트하는 코드 및/또는 데이터가 포함되어 있습니다.

다른 체계가 선택된 이유는 여러 가지가 있습니다. 일부는 달리면 빠르지 만로드가 느리게 진행됩니다. 일부는 빠르게로드되지만 런타임 성능이 적습니다.

다른 팁

EBX 글로벌 오프셋 테이블을 가리 킵니다. 보다 i386의 PIC에 대한 참조. 링크는 어떤 그림이 어떻게되는지 설명합니다 EBX 사용.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top