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
'Debugger > GDB' 카테고리의 다른 글
[GDB] 라이브러리 함수 분기에 대하여... (0) | 2020.01.05 |
---|---|
[GEF] gef missing (python3 에러) (0) | 2020.01.05 |
[GDB] GDB의 인자값으로 파이썬 출력 값을 사용하기 (0) | 2019.12.29 |
[GCC] 컴파일시 보호기법 해재 플래그 (0) | 2019.12.28 |
[GDB] 사용자 input으로 hex값 입력 값하기 (0) | 2019.12.28 |