
LLEF (발음 ɬɛF- "Hlyeff")는 LLDB 플러그인으로, 낮은 수준의 RE 및 VR에 대해 더 많이 사용할 수 있습니다. GEF와 유사하지만 LLDB의 경우.
LLDB의 Python API를 사용하여 추가 상태 출력 및 몇 가지 새로운 명령을 추가하여 보안 연구원이 LLDB를 더 쉽게 사용하여 소프트웨어가 실행될 때 소프트웨어를 분석 할 수 있습니다.
아래 지침은 LLDB에서 기본적으로 LLEF를 설치합니다.
cd <repo>./install.sh~/.lldbinit ) 또는 수동 설치를 선택하십시오.LLDB는 기본적으로 x86 바이너리에 대한 AT & T 분해 구문을 사용합니다. 설치 프로그램은이를 무시할 수있는 옵션을 제공합니다.
lldb-15 < optional binary to debug >LLEF 특정 명령 설정, 저장,로드 및 목록을위한 다양한 명령 :
(lldb) llefsettings --help
list list all settings
save Save settings to config file
reload Reload settings from config file (retain session values)
reset Reload settings from config file (purge session values)
set Set LLEF settings
설정은 다음과 같이 형식화 된 홈 디렉토리에있는 파일 .llef 에 저장됩니다.
[LLEF]
<llefsettings> = <value>
| 환경 | 유형 | 설명 |
|---|---|---|
| color_output | 부울 | 컬러 터미널 출력을 활성화/비활성화합니다 |
| register_coloring | 부울 | 레지스터 색칠을 활성화/비활성화합니다 |
| show_legend | 부울 | 범례 출력을 활성화/비활성화합니다 |
| show_registers | 부울 | 레지스터 출력 활성화/비활성화 |
| show_stack | 부울 | 스택 출력을 활성화/비활성화합니다 |
| show_code | 부울 | 코드 출력 활성화/비활성화 |
| show_threads | 부울 | 스레드 출력 활성화/비활성화 |
| show_trace | 부울 | 추적 출력을 활성화/비활성화합니다 |
| Force_arch | 끈 | 포스 레지스터 디스플레이 아키텍처 (실험) |
| rebase_addresses | 부울 | 주소 리베이스 출력을 활성화/비활성화합니다 |
| rebase_offset | int | Rebase 오프셋 설정 (기본 0x100000) |
| show_all_registers | 부울 | 확장 레지스터 출력을 활성화/비활성화합니다 |
LLEF GUI 색상을 설정할 수 있습니다.
(lldb) llefcolorsettings --help
list list all color settings
save Save settings to config file
reload Reload settings from config file (retain session values)
reset Reload settings from config file (purge session values)
set Set LLEF color settings
지원되는 색상 : 파란색, 녹색, 노란색, 빨간색, 분홍색, 시안, 회색
| 색상 |
|---|
| register_color |
| modified_register_color |
| code_color |
| heap_color |
| stack_color |
| String_color |
| stack_address_color |
| function_name_color |
| 습득 _color |
| HIMPERDED_INSTRUCTION_COLOR |
| line_color |
| rebased_address_color |
| section_header_color |
| HIMPERDED_INDEX_COLOR |
| index_color |
| dereferenced_value_color |
| dereferenced_register_color |
| frame_argument_name_color |
| read_memory_address_color |
다음과 같이 메모리 내용을 봅니다.
(lldb) hexdump type address [--size SIZE] [--reverse]
예를 들어
(lldb) hexdump byte 0x7fffffffecc8 --size 0x38
0x7fffffffecc8 3d 2f 75 73 72 2f 6c 6f 63 61 6c 2f 73 62 69 6e =/usr/local/sbin
0x7fffffffecd8 3a 2f 75 73 72 2f 6c 6f 63 61 6c 2f 62 69 6e 3a :/usr/local/bin:
0x7fffffffece8 2f 75 73 72 2f 73 62 69 6e 3a 2f 75 73 72 2f 62 /usr/sbin:/usr/b
0x7fffffffecf8 69 6e 3a 2f 73 62 69 6e in:/sbin
(lldb) hexdump word 0x7fffffffecc8 --reverse
0x7fffffffece6│+001e: 0x4654
0x7fffffffece4│+001c: 0x4361
0x7fffffffece2│+001a: 0x746f
0x7fffffffece0│+0018: 0x4e23
0x7fffffffecde│+0016: 0x3f73
0x7fffffffecdc│+0014: 0x6968
0x7fffffffecda│+0012: 0x742d
0x7fffffffecd8│+0010: 0x6564
0x7fffffffecd6│+000e: 0x6f63
0x7fffffffecd4│+000c: 0x6564
0x7fffffffecd2│+000a: 0x2d75
0x7fffffffecd0│+0008: 0x6f79
0x7fffffffecce│+0006: 0x2d64
0x7fffffffeccc│+0004: 0x6964
0x7fffffffecca│+0002: 0x2d79
0x7fffffffecc8│+0000: 0x6857
LLEF GUI를 다음과 같이 새로 고치십시오.
(lldb) context
LLEF GUI의 구성 요소를 다음과 같이 새로 고치십시오.
(lldb) context [{registers,stack,code,threads,trace,all} ...]
(lldb) pattern create 10
[+] Generating a pattern of 10 bytes (n=4)
aaaabaaaca
[+] Pattern saved in variable: $8
(lldb) pattern create 100 -n 2
[+] Generating a pattern of 100 bytes (n=2)
aabacadaea
[+] Pattern saved in variable: $9
(lldb) pattern search $rdx
[+] Found in $10 at index 45 (big endian)
(lldb) pattern search $8
[+] Found in $10 at index 0 (little endian)
(lldb) pattern search aaaabaaac
[+] Found in $8 at index 0 (little endian)
(lldb) pattern search 0x61616161626161616361
[+] Found in $8 at index 0 (little endian)
이것은 자동이며 현재 구현 된 모든 정보를 중단 지점에서 인쇄합니다.
rebase_addresses 설정으로 구성 가능 주소 Rebasing 기능은 출력에 제시된 각 코드 주소를 조회하여 관련 바이너리 및 상대 주소를 표시합니다. 이 상대 주소는 rebase_offset 설정하는 데 정의 된 값에 의해 오프셋되어 0x100000 의 GHIDRA 기본 주소로 기본값을 얻습니다. 결과적으로 런타임 주소에서 수학을 수행 할 필요없이 IDE "주소"기능에 쉽게 복사하고 붙여 넣을 수있는 주소 출력이 있습니다.
런타임 주소 후에는 다시 기반 주소가 괄호로 표시됩니다. 
LLDB에는 LLEF가 실행되는 데 필요한 파이썬 모듈이 번들로 제공됩니다. LLEF로 LLDB를 시작하면 ModuleNotFoundError 메시지가 발생하면 Python 경로에 LLDB Python 모듈을 수동으로 추가해야 할 것입니다.
이 작업을 수행하려면 다음을 실행하려면 사이트 패키지 위치를 설정합니다.
python3 -m site --user-site 그런 다음 LLDB Python 모듈 위치를 찾으십시오. 이것은 일반적으로 /usr/lib/llvm-15/lib/python3.10/dist-packages 와 같은 위치에 있지만 Python 버전에 따라 다릅니다.
마지막으로, 위의 LLDB 모듈 경로를 위에서 발견 된 사이트 패키지 위치에서 새 파일 lldb.pth 에 추가하려면 다음을 수정하고 실행하십시오.
echo " /usr/lib/llvm-15/lib/python3.10/dist-packages " > ~ /.local/lib/python3.10/site-packages/lldb.pth 각 중단 점에서 LLEF 출력 렌더링은 일부 플랫폼에서 느리게 관찰되었습니다. 이것의 근본 원인은 기본 GetMemoryRegions LLDB API 호출로 추적되었습니다. 다행히도 이것은 레지스터 값이 코드, 스택 또는 힙 주소를 가리키는 지 식별하는 데 사용됩니다.
레지스터 색칠을 비활성화하고 잠재적으로 LLEF 성능을 크게 향상 시키려면 다음 llefsettings 명령을 사용하여 register_coloring 기능을 비활성화하십시오.
llefsettings set register_coloring False
우리는 분명히 여기 거인의 어깨에 서 있습니다. 우리는 특히 GEF에 대한 Hugsy를 인정하고 싶습니다.이 도구는 큰 영감을 얻습니다! 이 모방을 아첨으로 고려해야합니까?
LLEF에 대해 조금 더 읽으려면 시작 블로그 게시물을 방문 할 수 있습니다.