Linux GDB 를 이용한 Debug

9
Linux GDB 를 를를를 Debug 2010.12.01 를를를를를 를를를

description

Linux GDB 를 이용한 Debug. 2010.12.01 시스템제어 박정욱. 다음 소스를 실행하면 오른쪽 그림과 같이 마지막에 semantation fault 라는 오류로 프로그램이 끝나게 된다 . Linux gdb 로 이유를 알아 보겠다. #include "HexaView.h" void test(int, int); int main() { int A = 0x12345678; int B = 0xABCDEFBA; printf("[%08X] : main() address\n", main); - PowerPoint PPT Presentation

Transcript of Linux GDB 를 이용한 Debug

Page 1: Linux GDB 를 이용한  Debug

Linux GDB 를 이용한 Debug

2010.12.01시스템제어

박정욱

Page 2: Linux GDB 를 이용한  Debug

#include "HexaView.h"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);

}

다음 소스를 실행하면 오른쪽 그림과 같이 마지막에 semantation fault 라는 오류로 프로그램이 끝나게 된다 . Linux gdb 로 이유를 알아 보겠다 .

Page 3: Linux GDB 를 이용한  Debug

처음 명령 실행시 break point(b) 를 main 으로 설정하고 run(r) 명령으로실행 시킨다 .

실행 시킨 프로그램은 breakpoint main에서 멈추게 된다 .

info frame(i f) 을 명령으로 현재프로그램 메모리의 세부정보를 알 수 있다 . 현재 main 의ebp 는 0xffff9fc,esp 는 0xbffff9c4 이다

Page 4: Linux GDB 를 이용한  Debug

Step(s) 명령으로 printf 명령까지 진행시키면 assembly 명령에 의해서A 는 ebp 의 주소의 +4 의 주소 0xbffff9f4B 는 ebp 의 주소의 +8 의 주소 0xbffff9f8 의주소에 값이 초기화 된다 .

AB ebp

다음 진행하면 인자 A,B 를 가지는Test 함수가 호출 된다 .

Page 5: Linux GDB 를 이용한  Debug

test 함수를 호출하는 명령에서는 함수의 본체로 넘어가는 명령 전에인자 A,B 의 값을 저장하고 ,call 명령에서는 test 함수가 종료 후돌아갈 test return address 를 eip 에저장 후 Jump 명령을 실행한다 .

test Return address

A B

test 의 인자 A,B

test 함수의 ebp 주소는 0xbffff9cc,esp 0xbffff9b4 이다 .eip 에는 test 함수가 종료되고 return address 인 0x8048479 가들어가 있다 .

Page 6: Linux GDB 를 이용한  Debug

test 함수에서는 지역변수 C 가 선언 및초기화 되고 , *p 는 C 의 주소값으로초기화 된다 .변수 C 는 0xbffff9c8, p 는 0xffff9c4 의주소를 가진다 .

다음 명령에서 C 의 값을 가지고 있는p 에 p+2 연산을 해서 p 에 있는 c 의 주소0xbffff9c8 을 0xffff9d0 의 값으로 만든다 .주소 0xffff9d0 는 test return address 의 값이 저장된 주소로서 p 는 return address 를가리키게 되다

P+2 연산으로 변화

c

return address

Page 7: Linux GDB 를 이용한  Debug

다음 명령에서 p 값 즉 return address 에test2 의 주소를 대입한다 .

test 의 주소값은 0x8048484 이다

위의 그림에서 return address 가 test2 의 주소로 바뀐것을 볼 수 있다 .

다음 실행에서 HexaView 함수가호출 되고 실행된다 .

Page 8: Linux GDB 를 이용한  Debug

test 함수의 실행이 끝나고 test 는 main 으로 return 하여야 하지만 의도한대로 test2 로 return 하게 된다 .

test2 의 ebp 는 return address 가 있던0xbffff9d0, esp 는 0xbffff9c8 이다 .하지만 정상적인 return 이 이루어 지지않아return address 를 가지고 있어야 할eip 가 return address 의 값 +4 의 주소에저장된 test 함수의 인자 A 의 값 12345678을 가지게 된다 .

ebp return address

Page 9: Linux GDB 를 이용한  Debug

step(s) 명령을 실행하면 printf 명령이 실행되어Test2 가 출력된 후 test2 함수도 종료 하게 된다 .그리고 return address 12345678 로 이동 하게 된다 .

12345678 이라는 주소로 이동하고 메모리에서 오류를 읽으켜 segmentation fault라는 오류를 출력하고 프로그램이 종료 하게 된다 .