반응형

시작하기 전 .. 

 C코드는 컴파일 된다는 사실을 인지하고 있어야한다. 코드는 컴파일돼 실행 가는한 바이너리 파일이 될 때 까지는 아무것도 할 수 없다. C소스코드 자체가 프로그램이라 생각하는 것은  가장 일반적인 오해다.

그리고 어셈블러에는 AT&T 방식과 intel방식이 있는데 여기서 사용한 것은 intel 방식을 사용하고 있으니 숙지하고 내용을 보기 바란다.


objdump나 gdb에대한 자세한 사용방법과 분석방법에대해서는 차차 진행할 것이니 이번 포스팅에서는 열어보고 어떤 내용이 있는지에 대해서만 짚어보고 넘어가도록 하자



다음과 같은 소스 코드를 바이너리 파일로 한번 열어보자 (odjdump 를 사용하여 main()함수를 기계어로 살펴볼 것이다)

<다음과 같은 명령어를 사용한다. 참고로 위의 소스코드를 컴파일 했다고 가정하고 진행한다>

objudmp 사용하기 

objdump -D a.out | grep -A 20 main.:

제일 왼쪽부터 

메모리 주소, 기계어 , 어셈블러가 되시겠다 . 위에도 언급 했듯이 이번 포스팅에서는 어떤내용을 보여주는지에 대해서만 보고넘어가도록 한다.


cf)

 각기 주소를 갖고 있는 집들의 열처럼 메모리도 각기 메모리 주소를 가진 바이트들의 열로 생각할 수 있다. 각 메모리 바이트에 주소로 접근할 수 있다.

~> 컴파일된 프로그램의 기계어 명령을 찾으려면 CPU가 메모리에 접근한다. 


프로세서는 레지스터라는 자신만의 특별한 변수 세트를 갖고있다. 대부분의 명령은 데이터를 읽거나 쓰기 위해 레지스터를 사용한다. 그래서 프로세서의 레지스터를 이해하는 것은 명령을 이해하는데 중요하다(이전에 포스팅한 글 참조하시길...)


gdb 사용하기 

명령)gdb -q a.out -> disas main

위와같은 명령을 사용하면 다음과 같은 어셈블리어들이 쭈루루룩 뜨게 된다. 위의 코드를 분석하는 것은 다음 포스팅에서 진행하도록 하고, 추가적인 명령어들을 말하고 이번 포스팅을 끝내도록 하겠다.(추가적으로 써놓은 명령어들을 한번씩은 꼭 사용해보길 바란다, 다음 포스팅에서 도움이 될지도..?)

break (함수) 또는 주소  : 해당 함수 또는 주소에 break를 건다~ > b 만쓰고 해도된다

run : 브레이크를 건 부분 직전까지 프로그램을 실핸한다 ~> r만써도됨 

continue : 브레이크 다음 진행

info register (추가 옵션 eip, esp 등등 ) : 브레이크 걸려진 상황에서 브레이크 건 직전부분 까지 프로그램을 수행하였을 때의 레지스터들의 상태들을 보여준다.



반응형
,