Debugger/GDB

[GEF] Pattern 생성과 활용

우와해커 2020. 1. 4. 07:09

GEF에서는  리턴 명령어가 존재하는 오프셋을 검색할 수 있도록 패턴 기능을 제공한다.

 

- pattern create [크기]

- pattern search [패턴]

 

하지만 꼭 개념을 정리해야 되는 것이 있다.

 

패턴서치는 리틀엔디안 검색과 빅엔디안 검색 둘다 출력하는데, 바이트오더로 인해 그 결과는 차이가 있다.

 

pattern search를 해보면 혼동이 올 수 있는데,

시스템 고유 방식이 아닌 내가 검색한 엔디안 방식에 따른 오프셋을 참조하면된다.

 

예를 들어,

 

Program received signal SIGSEGV, Segmentation fault. 
0x61616174 in ?? () 
[ Legend: Modified register | Code | Heap | Stack | String ] 
------------------------------------------------------------------------ registers ---- 
$lr  : 0x00010548 -> <getpath+112> sub sp,  r11,  #8 
$pc  : 0x61616174 ("taaa"?)

 

context에 보이는 문자 그대로 빅엔디안 방식으로 검색어를 입력하였다면 아래를 참고해야 하고

gef> pattern search taaa
[+] Searching 'taaa'

[+] Found at offset 73 (little-endian search) likely
[+] Found at offset 76 (big-endian search) 

 

리틀엔디안 방식으로 검색했다면 위에를 참고하면 되겠다.

gef>pattern search aaat
[+] Searching 'aaat' 

[+] Found at offset 76 (little-endian search) likely 
[+] Found at offset 73 (big-endian search) 

 

* 참고로 다음과 같이 레지스터 변수를 활용하면 리틀엔디안 방식으로 입력되므로 위에를 참고해야 한다.

gef> pattern search $pc
[+] Searching '$pc'
[+] Found at offset 76 (little-endian search) likely
[+] Found at offset 73 (big-endian search)

 


 

+개념정리 ARM에서의  Thumb mode

ARM 바이너리를 GEF로 디버깅하다보면 code섹션을 보고 해당 명령어가 Thumb모드인지 아닌지 구분 할 수 있다.

 

 

- ARM모드인 경우

0xbefff258|+0x0018: 0x00000001
0xbefff25c|+0x001c: 0x00010560 -> <main+0> push {r11,  lr}
--------------------------------------------------------------------- code:arm:ARM ----
[!] Cannot disassemble from $PC
[!] Cannot access memory at address 0x61616174
-------------------------------------------------------------------------- threads ----
[#0] Id 1, Name: "stack6", stopped, reason: SIGSEGV

 

- Thumb모드인 경우

0xbefff258|+0x0018: 0x00000001 
0xbefff25c|+0x001c: 0x00010560 -> <main+0> push {r11,  lr} 
--------------------------------------------------------------------- code:arm:ARM:thumb ---- 
[!] Cannot disassemble from $PC 
[!] Cannot access memory at address 0x61616174 
-------------------------------------------------------------------------- threads ---- 
[#0] Id 1, Name: "stack6", stopped, reason: SIGSEGV 

 

Thumb모드에서 PC의 값은 1이 감소된다.

따라서, 패턴의 오프셋을 정확히 검색하기 위해서는 실제 PC의 주소인 PC+1로 검색해야 한다.

 

레지스터 사용시

pattern search $pc+1

 

직접 Address주소를 입력할 경우에도 +1

pattteren search [0x주소]+1