누가 main 을 호출 했 습 니까?

누가 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 내 연 어 셈 블 리 를 사용 할 수 있 도록 허락 해 주 십시오. 여기 서 간단하게 설명 하 겠 습 니 다.
  • "= m" (p) 는 메모리 변수 p 를 출력 동작 수로 표시 합 니 다
  • % 0 은 첫 번 째 조작 수 를 대표 합 니 다. 바로 p 입 니 다
  • 조작 수 와 구별 하기 위해 레지스터 는% 를 더 해 야 합 니 다.% ebp 는 ebp 레지스터
  • 를 표시 합 니 다.   한 마디 로 하면 이 내 연 어 셈 블 리 는 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
  • nm up 은 각 전역 함수 의 주 소 를 표시 할 수 있 습 니 다
  • | sort > up. txt 파 이 프 를 통 해 nm up 의 출력 을 sort 의 입력 으로 하고 sort 정렬 후 출력 을 up. txt 파일 로 재 설정 합 니 다 (출력 은 1910 줄 이 므 로 o (9583, □, 9584) o
  •    그리고 두 주소 가 각각 __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 이 네 마음속 에 있 는 지위 가 바닥 으로 떨 어 졌 지?

    좋은 웹페이지 즐겨찾기