12
함함 함함 함함 함함함 2010.11.28 함함함함함 함함함

함수 호출 구조 보고서

  • Upload
    maura

  • View
    60

  • Download
    3

Embed Size (px)

DESCRIPTION

함수 호출 구조 보고서. 2010.11.28 시스템제어 박정욱. 다음의 소스를 이용해 메모리의 stack 영역에 함수의 호출 구조에 대해서 조사해 보겠다. void test(int, int); int main() { int A = 0x12345678; int B = 0xABCDEFBA; printf("[%08X] : main() address\n", main); test(A, B); return 0; } void test2() { printf("test2\n"); } - PowerPoint PPT Presentation

Citation preview

Page 1: 함수 호출 구조 보고서

함수 호출 구조 보고서

2010.11.28시스템제어

박정욱

Page 2: 함수 호출 구조 보고서

void test(int, int);int main(){

int A = 0x12345678;int B = 0xABCDEFBA;printf("[%08X] : main() address\n", main);test(A, B);return 0;

}void test2(){

printf("test2\n");}void test(int a, int b){

int C= 0x11223344;int *p= &C;p = p+2;*p = (int)test2;PrintHexaNAscii(&p, 150);

}

다음의 소스를 이용해 메모리의 stack 영역에 함수의 호출 구조에 대해서 조사해 보겠다 .

Page 3: 함수 호출 구조 보고서

Stack 에서 main 함수의 영역은 EBP(0012FF80)에서ESP(0012FF2C) 까지 이다 .

프로그램 이 시작되면 main 함수가 되고 assembly 에서main 함수의 지역 변수가 들어갈 영역을 할당한다 .

Page 4: 함수 호출 구조 보고서

ebp-4 에 (0012FF7C) 변수 A 를 선언 , 값을 초기화 하고

ebp-8 에 (0012FF78) 변수 B 를 선언 , 값을 초기화 한다 .

변수 A, B 를 선언하고 하고 A, B 의 값을 초기화 한다 .

A B

Page 5: 함수 호출 구조 보고서

call 명령은 (1)PUSH eip 명령으로 A5(004012A5) 를 test return address(00FF1220) 에 초기화 후 , (2)JUMP test 명령으로 test 함수의 주소 (00401330) 로 점프 한다 ..

main 함수 내에서 test 함수가 호출되면 인자 B, A 의 순서대로 Stack 에 저장 후 Call 명령으로 함수 본체로 점프 한다 .

AB

Page 6: 함수 호출 구조 보고서

test 함수의 몸체로 넘어오게 되면 초기 main 함수의 stack 영역을 할당할 때와 같이 test 함수도 stack 영역을 할당 받는다 .

return address 004012A5 다음 주소에 EBP 가 초기화 된다 .

Page 7: 함수 호출 구조 보고서

test 의 지역 변수 c 가 ebp-4(0012FF18) 에 선언되고 11223344 로 초기화 된다 . 지역변수 *P 는 ebp-8(0012FF14) 에 선언되고변수 c 의 주소로 초기화 된다 .

c *P

Page 8: 함수 호출 구조 보고서

C 의 주소를 가지고 있던 P 에 +2 의 연산을 해 8 을 증가 시켜 test return adderss 의 주소를 보게 만들었다 .그 후 *P 가 가리키는 test return address 의 주소를test2 함수의 주소로 초기화 시킨다 .

P 의 값을 test return address 를가리키게 만든다 .

test return address 의 값을 test2 의주소로 초기화 시킨다 .

Page 9: 함수 호출 구조 보고서

다음 PrintHexaView 함수가 호출되고 PrintHexaView 의 몸체로 가서프로그램을 실행 후 다시 test 함수로 return 한다 .

test 함수 종료 시 ebp 의 값을 test함수의 초기 ebp 의 주소 0012FF1C 로 옮긴 후 pop 명령으로 return address가 있는 주소로 이동하고 리턴하게 된다 .

변환 전 test return address

변환 후 test return address

이때 test return address 을 임의적으로test2 의 주소로 바꿔놓아 test2 의 함수로점프 하게 된다 .

Page 10: 함수 호출 구조 보고서

Test2 함수 역시 초기화 작업을 거친다 .

test2 함수 내부에 printf 함수를 호출하게 되면 004222A0 번의주소에 test2 문자열을 초기화 시키고 printf 함수호출을 통해test2 가 초기화 되어있는 주소를 출력 한다 .

Page 11: 함수 호출 구조 보고서

test 함수의 종료 시 esp 는 test2 함수의 ebp(0012FF20) 의 주소로가고 , Pop 명령으로 통해 값을 ebp 에 복사 후 0012FF24 주소로 가서 return 한다 .

주소 0012FF24 에 초기화 되어있는 값으로 return 하게 되고 ,return 하는 주소에는 실행 불가능한 명령이 있어메모리 오류로 프로그램이 종료 되게 된다 .

Page 12: 함수 호출 구조 보고서

Test 의 인자 B,A

Test return addressTest: ebp

Test: *pTest C

Main: ebpMain: AMain: B

Main: esp