Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

US0

[GDB 익히기] gdb 에서의 examine명령 알아보자!!!(+ 리틀엔디언) 본문

OS/Linux

[GDB 익히기] gdb 에서의 examine명령 알아보자!!!(+ 리틀엔디언)

us0 2018. 11. 9. 02:28

gdb에서 examine을 활용한 조사 명령 내리기!! 



조사 명령은 다양한 방법으로 메모리 주소를 보는 데 사용된다.

이 명령에는 조사할 메모리의 위치와 메모리를 어떻게 보여줄 에 대한 두개의 인자가 필요하다!!! 

(몇 진법으로, 몇개의 바이트를 나타낼것인가!!)


ps.이것은 현미경을들고 프로그램을 들여다 보는것과 같은 역할을 하는 것!!!이라고 생각해두면 편하다.


두개인자란??  첫번 째  -  진법     두번 째 - 바이트



 보통  표현 형식은 한 글자의 축약 형을 사용한다. 

 추가적으로 옵션으로 문자 앞에 숫자로 얼마나 많은 아이템을 조사할 것인지 쓸 수 있다.





examine사용방법!!!! 


(gdb) <<< 이건 명령어를 칠수 있게 해주는 CLI라고 생각하면 된다!!!

여기서


(gdb) x/ ??? <<< 이렇게 해주면 된다!!!  " ???" 이공간은 이제 앞으로 설명할것!!!! 

즉, 저기 (gdb)에서의 x/ <<< 요곳이 바로 examine의 줄임말 인것이다!! 즉 examine 명령내릴 준비가 됐다는 것!!!


기본 사용 방법!!


 (gdb) x/[숫자][첫번째 옵션] [두번째 옵션] ('[]'대괄호는 생략능 이라는  뜻 ㅎㅎ)





첫번째 옵션!!! (진수 표기!!)



진법을 결정하는 옵션


  o  :  8진법으로 보여준다

  x  :  16진법으로 보여준다.

  u  :  부호가 없는 표준 10진법으로 보여준다.

  t  :  2진법으로 보여준다.        //얘는 왜 t인지....??



이것의 예시!!


ps.  'i  r  eip' 는 info register eip 의 약자이다. eip레지스터의 정보를 보는것!!!  

(지금 eip레지스터는 8048479의 주소를 가르키고 있다.)



각각 8진수 , 16진수, 10진수, 2진수로 똑같은 0x8048479 값을 나타내고 있다.




//*********************************************잠깐 알고가기!!!!!! *****************************************************


여러개를 보고싶으면 어떡하나요?? 그럼 아래처럼 해보자1!!



이와 같이 옵션 앞에  숫자를 보여주면 지금은 x/ __x 이기때문에 숫자만큼 16진수로 줄줄이 나오게 된다!!


//*****************************************************************************************************************************






두번째 옵션!!!!!  (바이트 결정!!!)


한번에  32byte씩 보기 싫어요 8바이트씩 볼래용 이런상황이 있을수도 있다!! 

그래서 만들어진게 바로 두번째 인자!!!!


두번째 인자는 일단 어떻게 쓰는지 부터 알아보자 두번째인자는 x/[숫자][첫번째 옵션] [두번째 옵션] 이렇게 된다 

( '[]' 대괄호는 생략가능 그래서 첫번째 인자값 예시들때 생략 가능 했던 것!!!   //   첫번째도 생략가능하긴한데.. 왠만함 써주자^^ default는 16진수 )


바이트를 나타내는 두번째 옵션은!!!


b  :  단일 바이트

h  :  2바이트 하프워드

w  :  4바이트 워드

g  :  8바이트 워드


이렇게가 있다. 한번 예제도 봐보자!!!



출력 결과를 보면 두번째 인자 값에 따라 한번에 출력되는 값이 변경 되는것을 알수있다!!





잠시 생각해보는시간!!!!!!!!!


x/[숫자][첫번째 옵션] [두번째 옵션]

숫자:  몇개 출력할건가??

첫번째 옵션: 몇 진수로 나타낼것인가?

두번째 옵션 : 몇 바이트씩 출력할 것인가? (숫자는 두번째 옵션에 종속된다고 볼수 있음!!!!)

  

읭??? 근데 x/8xb   $eip     0x83    0xec    0x24    0x65    0xa1    0x14    0x00    0x00       인데

  x/8xh    $eip는     0xec83    0x6524    0x14a1    0x0000    0x8900    0xf445 .... 이고

  x/8xw   $eip    0x6524ec83    0x000014a1    0xf4458900 ... 이렇게 나온다


이상한점이 뭘까??? 바로바로!!! 자꾸 순서가 바뀐다!!!!! 처음엔 0x83이 앞으로  나왔다가 계속 뒤로 쭉쭉 밀려난다!!! 

이게바로 little endian이다. 


Big-endian과 little-endian가 있는데 이둘의차이는 

Big-endian은 1 2 3 4 5 이렇게 있으면 실제로도 1 2 3 4 5 이렇게 저장하지만 (네트워크에서 주로 사용)

Little-endian은 1 2 3 4 5 가 들어오면 5 4 3 2 1 반대로 저장한다.  (x86 프로세서가 대표적!!)





        Big-endian과 Little endian은 다음에 또 설명!! ㅎ,ㅎ

        일단은 프로세서(CPU)에 따라 저장하는 순서가 다르고 저런 종류가 있구나~ 하고 생각 하자!!





명령어 보기!!!

근데 진수로 볼때도 중요할때가 있지만 해당하는 주소의 명령을 보고싶을 때가 있을것이다!!

그럴땐 instruction(명령) 의 줄임인 i옵션을 붙여주면 된다 ㅎ.ㅎ


실행예시 : (gdb)  x/ (명령어 개수)



(gdb) x/3i $eip를 보면 3개 출력하는데 주소값이 4바이트 씩 높아진다.


그이유는 바로바로!! 운영체제가 32bit이기 때문에 4바이트씩 명령을 처리 하기 때문에 한명령어 당 4바이트를 차지한다!!! 



ASCII or 문자열 확인하기!!!!


문자 확인하기!!!!

x/[숫자]cb (주소 값)<< 이것은 바이트단위로 해당 주소값에 있는 값을  ASCII코드로 확인 출력할 때 쓴다.

물론 숫자는 그 주소값부터 몇개의 바이트를 확인 할 것인가 라는 표시이다.


문자열 확인하기!!!

x/s (주소 값) :  주소값부터 널(\n) 문자가 올 때 까지 의 문자열을 출력하는 것~~



examine활용법은 여기서 잠시 마무리~~~