누가 main 을 호출 했 습 니까?
이것 은 함수 프레임 의 응용 중의 하나 다.
실행 가능성
전편 에서 알 수 있 듯 이 프레임 포인터 ebp 로 모든 함수 프레임 을 거 슬러 올 라 갈 수 있다. 그러면 main 함수 프레임 위의 함수 프레임 도 자연히 가능 하 다.프레임 에 있 는 오래된 ebp 의 이전 4 바이트 에 저 장 된 것 은 함수 의 반환 주소 입 니 다. 이 주소 에서 우 리 는 누가 이 함 수 를 호출 했 는 지 판단 할 수 있 습 니 다.
준비 활동
다음은 이번 해 킹 의 주인공 (up. c) 이다.
#include <stdio.h>
int main()
{
int *p;
// ebp p
__asm__("movl %%ebp, %0"
:"=m"(p));
while(p != NULL){
printf("%p
", p[1]);
p = (int*)(p[0]);
}
return 0;
}
우선 gcc 내 연 어 셈 블 리 를 사용 할 수 있 도록 허락 해 주 십시오. 여기 서 간단하게 설명 하 겠 습 니 다.
한 마디 로 하면 이 내 연 어 셈 블 리 는 ebp 레지스터 의 값 을 포인터 p 에 부여 했다.그 다음 에 while 순환 을 설명 합 니 다. 순환 중 에 먼저 p [1] 을 인쇄 하고 p [1] 는 이 프레임 에 저 장 된 반환 주소 입 니 다.그 다음 에 포인터 p 를 p [0] 으로 바 꾸 고 p [0] 는 오래된 ebp (이전 프레임 의 프레임 포인터) 입 니 다.이렇게 하면 프로그램 은 호출 순서의 역순 에 따라 각 반환 주 소 를 출력 할 것 이다.
왜 종료 조건 은 p = = NULL 입 니까?이것 은 gcc 가 우리 의 해 킹 을 지원 하기 위해 특별히 프로그램 을 실행 하기 시 작 했 을 때 ebp 를 제 거 했 기 때문에 어떤 함 수 를 처음 실 행 했 을 때 스 택 을 누 른 오래된 ebp 는 NULL 입 니 다.
행동 을 개시 하 다
저 희 는 정적 링크 방식 으로 up. c (정적 링크 의 실행 가능 한 파일 에는 모든 사용자 상태 에서 실 행 된 코드 가 포함 되 어 있 습 니 다) 를 컴 파일 한 다음 에 실행 합 니 다.
[lqy@localhost temp]$ gcc -static -o up up.c
[lqy@localhost temp]$ ./up
0x8048464
0x80481e1
[lqy@localhost temp]$
분석 결과
up 은 두 개의 지향 코드 구역 의 주 소 를 인쇄 했 습 니 다. 그 다음 에 그들 이 어느 두 함수 에 속 하 는 지 보 겠 습 니 다.
nm up | sort > up.txt
그리고 두 주소 가 각각 __libc_start_main
,start 중:...
08048140 T _init
080481c0 T _start
080481f0 t __do_global_dtors_aux
08048260 t frame_dummy
080482bc T main
08048300 T __libc_start_main
080484d0 T __libc_check_standard_fds
...
실제 프로그램 은 바로start 가 실행 하기 시 작 했 고 up 의 어 셈 블 리 결과 에서 볼 수 있 습 니 다start 의 첫 번 째 명령 xor% ebp,% ebp 는 그 전설의 ebp 를 제거 하 는 명령 입 니 다.그럼 main 함 수 를 호출 하기 전에 프로그램 은 무슨 일 을 했 습 니까?예 를 들 어 더미 의 초기 화, C + + 프로그램 이 라면 전체 대상 의 구조 도 main 전에 완 성 된 것 입 니 다. (main 에서 전체 대상 을 사용 할 수 없 을 때 아직 구성 되 지 않 았 습 니 다!) 전체 대상 의 분석 도 main 이 실 행 된 후에 야 실 행 됩 니 다.
main 이 네 마음속 에 있 는 지위 가 바닥 으로 떨 어 졌 지?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Docker를 사용한 React 및 .NET Core 6.0 샘플 프로젝트 - 1부이 기사에서는 Entity Framework Core Code First 접근 방식을 사용하는 ASP.NET Core 6.0 WEP API의 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업에 대해 설명합니다. 웹 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.