US0
[GDB 익히기] gdb 에서의 examine명령 알아보자!!!(+ 리틀엔디언) 본문
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/ (명령어 개수) i
(gdb) x/3i $eip를 보면 3개 출력하는데 주소값이 4바이트 씩 높아진다.
그이유는 바로바로!! 운영체제가 32bit이기 때문에 4바이트씩 명령을 처리 하기 때문에 한명령어 당 4바이트를 차지한다!!!
ASCII or 문자열 확인하기!!!!
문자 확인하기!!!!
x/[숫자]cb (주소 값)<< 이것은 바이트단위로 해당 주소값에 있는 값을 ASCII코드로 확인 출력할 때 쓴다.
물론 숫자는 그 주소값부터 몇개의 바이트를 확인 할 것인가 라는 표시이다.
문자열 확인하기!!!
x/s (주소 값) : 주소값부터 널(\n) 문자가 올 때 까지 의 문자열을 출력하는 것~~
examine활용법은 여기서 잠시 마무리~~~