rbasefind
1.0.0
@mncoppola의 basefind.py & @rsaxvc의 basefind.cpp를 기반으로 한 무차별 대기 기본 주소 스캐너.
평평한 32 비트 바이너리 파일을 스캔하고 이미지의 기본 주소를 계산하려고 시도합니다. ASCII 영어 문자열을 찾으면 포인터와 문자열의 오프셋으로 해석 된 모든 32 비트 단어의 가장 큰 교차점을 찾습니다.
이것은 일부 팔 (비 thumb) 바이너리에서 잘 작동합니다. 대상 바이너리에서 가능한 한 파일에 대한 정보를 거의 사용하지 않는 것은 매우 간단한 휴리스틱입니다. 따라서 그것은 기적이 작동하지 않을 것입니다.
Scan a flat 32-bit binary and attempt to brute-force the base address via string/pointer comparison. Based on the
excellent basefind.py by mncoppola.
USAGE:
rbasefind [FLAGS] [OPTIONS] <INPUT>
FLAGS:
-b, --bigendian Interpret as big-endian (default is little)
-h, --help Prints help information
-p, --progress Show progress
-V, --version Prints version information
OPTIONS:
-n, --maxmatches <LEN> Maximum matches to display (default is 10)
-m, --minstrlen <LEN> Minimum string search length (default is 10)
-o, --offset <LEN> Scan every N (power of 2) addresses. (default is 0x1000)
-t, --threads <NUM_THREADS> # of threads to spawn. (default is # of cpu cores)
ARGS:
<INPUT> The input binary to scan
time ./rbasefind fw.bin
Located 2355 strings
Located 372822 pointers
Scanning with 8 threads...
0x00002000: 2195
0x00001000: 103
0x00000000: 102
0x00003000: 101
0x00004000: 90
0x45e95000: 74
0x45e93000: 73
0x00006000: 64
0x00005000: 59
0x45ec3000: 58
real 0m40.937s
user 5m20.908s
sys 0m0.035s 0x00002000 은이 바이너리의 올바른 기본 주소였습니다.
큰 바이너리의 경우 기본 스캔이 너무 오래 걸릴 수 있습니다. 최소 문자열 길이를 지정하여 검색 크기를 "정확도"를 희생시키면서 다이얼링 할 수 있습니다. 즉,
time ./target/release/rbasefind fw_all.bin -m 100
Located 7 strings
Located 372822 pointers
Scanning with 8 threads...
0x00002000: 4
0x2ae7b000: 2
0xffe54000: 1
0xfba46000: 1
0xfb9c3000: 1
0xfb80a000: 1
0xfafe6000: 1
0xfafe0000: 1
0xfae3b000: 1
0xfae13000: 1
real 0m0.149s
user 0m0.751s
sys 0m0.012s