[GEF] Pattern 생성과 활용
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