함수 호출 구조 보고서

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

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

Transcript of 함수 호출 구조 보고서

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