이전에 버퍼오버플로우를 공부할때 몇 번 사용해 봤었는데 그 이후로는 쓸일이 별로 없을 줄 았았지만 이렇게 필요해질 순간이 와버렸다. 윈도우에서 만들어진 소스코드를 리눅스로 옮기는 도중 컴파일은 됐으나 ‘세그먼테이션 폴트’가 발생하여 어디가 문제인지 찾아야 했다.

필자는 리눅스로 옮겨진 소스코드를 컴파일하고 어떤 과정을 거쳐서 디버깅을 하는지 보여주도록 할 것이다.


먼저 gdb가 깔려있지 않은 경우 다음과 같이 설치해 주도록 하자.

1
sudo apt-get install gdb


우선 작성된 source.cpp가 있다고 가정하자. gdb를 이용하여 디버깅을 할 수 있도록 컴파일할때 -g 옵션을 주어야 한다.

이후 gdb를 이용히여 만들어진 싱행파일을 열어보면 된다. 그냥 아래와같이 입력하면 된다.

1
gdb a.out

gdb를 처음 실행하면 gdb와 관련된 부연설명과 함께 켜지게 되는데, -q옵션을 사용하면 깔끔하게 켜진다. 참고.


이후 실행되면

1
2
Reading symbols from a.out...done.
(gdb)

위와같은 화면을 볼 수 있는데 r을 입력하면 프로그램이 바로 실행되며 오류가 발생하는 포인트를 찾을 수 있다. 만일 시작인자(arg)가 있는 프로그램이라면

1
(gdb) r 123 "MyARGV"

위와같이 전달해 줄 수 있다.


gdb상에서 소스코드를 보려면 l을 입력한다. 그냥 l만 입력하면 메인소스 주변의 코드를 보여주며 l NUM와같이 입력하면 NUM 숫자 주변의 코드를 보여준다. 또한 b를 이용해서 브레이크 포인트를 설정해 줄 수 있다. 이것은 좀 더 상세하게 디버깅 하는데 큰 도움이 된다.

WRITTEN BY

배진오

하고싶은 건 다 하면서 사는게 목표
im@baejino.com

comments powered by Disqus