반응형

gdb 컴파일러 사용시 gdb에서 소스코드를 볼 수 있는 추가 디버그 정보를 포함시키려면 -g 플래그를 사용한다 (이를 사용하면 list 명령을 이용해 소스코드를 gdb 안에서 볼 수 있다)

ex. gcc -g firstprog.c

<disas main>


1.break의 설정,instruction pointer 관찰 해보기

이제 본격적으로 실습에 들어가보도록 하겠다.

main()의 시작점에 중지점(break) 를 설정하고 프로그램을 실행 시킨다. 이 중지점은 디버거가 해당 지점에 가면 프로그램 실행을 중지하도록 한다. 중지점이 main()함수 시작점에 설정됐으므로 프로그램은 main()의 어떤 명령도 실행하기 전에 중지점에 다다르고 멈춘다. 그리고 EIP(instruction pointer)의 값이 출력된다.

여기서 EIP가 main() 함수의 역어셈블 명령을 가리키는 메모리 주소를 갖고 있음을 주시해서 보자. 이메모리 주소 전에 기울임 꼴로 표기된 명령들은 함수의 '프롤로그'라 불리고, main()함수의 나머지 전역 변수를 위한 메모리를 할당하려고 컴파일러가 생성한 것이다.

~>스택프레임을 만든다 라고 이해하면된다.


2.GDB의 조사명령

또한, GDB 는 examine을 줄인 명령 x를 사용해 메모리를 조사하는 방법을 제공한다

형식 : x/조사명령

형식은 다음과 같다

o:8진법으로 보여준다(octal)

x: 16진법으로 보여준다(hexa)

u: 부호헙는 표준 10진법으로 보여준다(unsigned decimal)

t : 2진법으로 보여준다(아마도.. twin(?)정확하지않음)

좀더 이해하기 쉽게 밑에다가 예제를 첨부한다.

참고로 x/u $eip 과 같은 것도 사용할 수가 있는데, 여기서 '$eip'는 그 순간에 EIP가 갖고있는 값을 의미한다

메모리 단일 유닛의 기본 크기는 워드(word)라 불리는 4바이트이다. 


3.print 명령

print 명령은 간단한 계산을 할 때 사용될 수 있고, 결과는 디버거의 임시 변수에 저장된다.print명령은  'print 주소 연산 주소' 와 같은 형식등 여러가지 방법으로 사용해볼 수 있다.어려운 주제는 아니므로 각자 한번씩 실습해보자



반응형
,