Melkor라는 이 Fuzzer는 Linux 시스템에서 EFL 파일에 대한 Fuzzing 을 위한 툴이고, 간단한 사용법에 성능도 괜찮은 편이라 공유드리네요.
Melkor 설치하기(Install Melkor)
Melkor는 github를 통해 배포되고 있습니다. git 명령으로 일단 clone을 생성합니다.# git clone https://github.com/IOActive/Melkor_ELF_Fuzzer.git
다운로드 되면 Clone 디렉토리로 접근합니다.
# cd Melkor_ELF_Fuzzer/
# ll
합계 228
drwxr-xr-x 8 root root 4096 11월 24 18:07 .git
-rw-r--r-- 1 root root 1165 11월 24 18:07 AUTHOR.txt
-rw-r--r-- 1 root root 1334 11월 24 18:07 BUGS.txt
-rw-r--r-- 1 root root 35147 11월 24 18:07 LICENSE.txt
-rw-r--r-- 1 root root 2072 11월 24 18:07 Makefile
-rw-r--r-- 1 root root 7472 11월 24 18:07 README.txt
-rw-r--r-- 1 root root 822 11월 24 18:07 TODO.txt
drwxr-xr-x 2 root root 4096 11월 24 18:07 docs
-rwxr-xr-x 1 root root 136264 11월 24 18:28 melkor
drwxr-xr-x 2 root root 4096 11월 24 18:28 src
drwxr-xr-x 2 root root 4096 11월 24 18:28 templates
-rwxr-xr-x 1 root root 2635 11월 24 18:07 test_fuzzed.sh
-rw-r--r-- 1 root root 294 11월 24 18:07 win_test_fuzzed.bat
별도의 설정 과정은 필요없고, 바로 Make를 통해 빌드해주시면 됩니다.
# make
# make install
이렇게 간단하게 설치가 완료되었습니다.
명령 디렉토리 하단에 melkor으로 실행파일이 넘어갔기 때문에 bashrc의 alias나 별도의 명령 등록 없이 명령행에서 사용 가능합니다.
Melkor를 이용한 Fuzzing
일단 Usage를 보면 아래와 같습니다.|
| M e l k o R v1.0 - An ELF File Format Fuzzer
| by nitr0us
|
'. ;' '; .'
;l, x, lc ;c'
,x; k; ol :o.
dk. ;0. :0. ,k:
.0k dO.,;0: .Ok
.0O. cO: c dO. cOx
.O0ocOo l .kk;xOd
.OO00O; . ;O00Ox
.cxkkkx:xkolkkkxo.
'kkkkkkxxxxxx'
.xxxxxxxxxxxxx.
.;;:xxxxxxxxxxxxo;;;.
..:dxxdo.ddddd:..
ddl:. .ldd:
ldd. .ddl
.cdlc. .ldc.
:o. .o:
; ;
___ ___ ____ __ __ __ ___ ____
||\\//|| || || || // // \\ || \\
<< || \/ || ||== || ||<< (( )) ||_// >>
|| || ||___ ||__| || \\ \\_// || \\
Usage: melkor <ELF metadata to fuzz> <ELF file template> [-n num -l likelihood -q]
<ELF metadata to fuzz>:
-a Autodetect (fuzz according to e_type except -H [the header])
-H ELF header
-S Section Header Table
-P Program Header Table
-D Dynamic section
-s Symbols Table(s)
-R Relocations Table(s)
-N Notes section
-Z Strings Tables
-A All of the above (except -a [Autodetect])
-B All of the above (except -a [Autodetect] and -H [ELF Header])
-n Number of new fuzzed ELF files (orcs) to create (default: 5000)
-l Likelihood (given in % from 1-100) of the execution of each fuzzing rule (default: 10%)
-q Quiet mode (doesn't print to STDOUT every executed fuzzing rule)
Usage: melkor <ELF metadata to fuzz> <ELF file template> [-n num -l likelihood -q]
인자값으로 ELF 파일, Template 등이 들어갑니다.
기본으로 자동으로 분석하는 -a(autodetect)부터, 각각 ELF 헤더 설정이던, Symbols Table 설정이던 옵션을 주고
대상 타겟을 인자값으로 넘겨주면 분석을 시작합니다.
테스트를 위해 간단하게 BOF 취약 코드를 작성하였습니다.
#include <stdio.h>
#include <string.h>
void main(int argc, char *argv[])
{
char buffer[256];
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
}
# melkor -a test
..-.--..
,','.-`.-.`.
:.',;' `.\.
||//----,-.--\| <<--- test
\`:|/-----`-'--||'/
\\|: <x> <X>|:'
`|| " \ |! _________________________________
|!| ;| / I'll be corrupted 5000 times ! \
!||:. -- /|! \_________________________________/
/||!||:.___.|!||\
/|!|||!| |!||!\\:.
,'//!||!||!`._.||!||,:\\\
: :: |!|||!| |!||! |!::
| |! !||!|||`---!|!|| ||!|
[+] Automatic mode
[+] ELF type detected: ET_EXEC
[+] Selecting the metadata to fuzz
[+] Detailed log for this session: 'orcs_test/Report_test.txt'
[+] The Likelihood of execution of each rule is: Aprox. 10 % (rand() % 10 < 1)
[+] Press any key to start the fuzzing process...
=================================================================================
[+] Malformed ELF 'orc_0001':
[+] Fuzzing the relocations section .rela.dyn with 1 SHT_RELA entries
[+] Fuzzing the relocations section .rela.plt with 6 SHT_RELA entries
[+] Fuzzing the Symbol Table .dynsym with 7 entries
[+] Fuzzing the Symbol Table .symtab with 68 entries
. SHT[28] SYM[0] rule [01] executed
. SHT[28] SYM[3] rule [06] executed
. SHT[28] SYM[3] rule [15] executed
. SHT[28] SYM[7] rule [04] executed
. SHT[28] SYM[9] rule [15] executed
. SHT[28] SYM[18] rule [04] executed
. SHT[28] SYM[21] rule [06] executed
. SHT[28] SYM[22] rule [06] executed
. SHT[28] SYM[22] rule [15] executed
. SHT[28] SYM[23] rule [03] executed
. SHT[28] SYM[25] rule [04] executed
. SHT[28] SYM[25] rule [05] executed
. SHT[28] SYM[25] rule [06] executed
. SHT[28] SYM[31] rule [04] executed
. SHT[28] SYM[32] rule [03] executed
. SHT[28] SYM[42] rule [10] executed
. SHT[28] SYM[42] rule [15] executed
. SHT[28] SYM[48] rule [05] executed
. SHT[28] SYM[49] rule [15] executed
. SHT[28] SYM[55] rule [15] executed
. SHT[28] SYM[57] rule [13] executed
. SHT[28] SYM[64] rule [04] executed
. SHT[28] SYM[66] rule [10] executed
[+] Fuzzing the Dynamic section .dynamic with 29 entries
[+] Fuzzing the Note section .note.ABI-tag with 32 bytes
. SHT[2] NOTE[0] rule [03] executed
[+] Fuzzing the Note section .note.gnu.build-id with 36 bytes
[+] Fuzzing the String Table .dynstr with 100 bytes
[+] Fuzzing the String Table .shstrtab with 264 bytes
[+] Fuzzing the String Table .strtab with 632 bytes
HAHWULSecurity engineer, Gopher and H4cker! |
위에 취약한 코드에 대해 퍼징을 통해 분석을 한 것 같은데, 혹시 취약한 코드에 대한 내용은 어디서 확인할 수 있나요?? Melkor을 이용한 퍼징에 관심이 있어 댓글을 달아요~~
ReplyDelete퍼징 완료하게 되면 리포트 디렉토리랑 데이터 만들어줍니다.
Delete(default가 5000인데, 어느정도 데이터 조절이 필요합니다)
[+] Fuzzing process finished
[+] Orcs (malformed ELFs) saved in 'orcs_test/'
[+] Detailed fuzzing report: 'orcs_test/Report_test.txt'
끝나면 하위에 orcs 디렉토리가 생기고 아래 보시면 결과 데이터 나옵니다.
- html: 간략한 설명?
- orcs000x 파일들, 실제 테스팅 벡터가 들어간 elf 파일(실행시키면 보통 seg fault..)
이고 나온 orcs 데이터 기준으로 재 분석을 하긴해야합니다....
[ Exec files.. ]
/orcs_test# ls
orc_0001 orc_0019 orc_0037 orc_0055 orc_0073 orc_0091 orc_0109 orc_0127 orc_0145 orc_0163 orc_0181 orc_0199 orc_0217 orc_0235 orc_0253 orc_0271 orc_0289 orc_0307 orc_0325 orc_0343 orc_0361 orc_0379 orc_0397 orc_0415 orc_0433 orc_0451 orc_0469
orc_0002 orc_0020 orc_0038 orc_0056 orc_0074 orc_0092 orc_0110 orc_0128 orc_0146 orc_0164 orc_0182 orc_0200 orc_0218 orc_0236 orc_0254 orc_0272 orc_0290 orc_0308 orc_0326 orc_0344 orc_0362 orc_0380 orc_0398 orc_0416 orc_0434 orc_0452 orc_0470
orc_0003 orc_0021 orc_0039 orc_0057 orc_0075 orc_0093 orc_0111 orc_0129 orc_0147 orc_0165 orc_0183 orc_0201 orc_0219 orc_0237 orc_0255 orc_0273 orc_0291 orc_0309 orc_0327 orc_0345 orc_0363 orc_0381 orc_0399 orc_0417 orc_0435 orc_0453 orc_0471
orc_0004 orc_0022 orc_0040 orc_0058 orc_0076 orc_0094 orc_0112 orc_0130 orc_0148 orc_0166 orc_0184 orc_0202 orc_0220 orc_0238 orc_0256 orc_0274 orc_0292 orc_0310 orc_0328 orc_0346 orc_0364 orc_0382 orc_0400 orc_0418 orc_0436 orc_0454 orc_0472
orc_0005 orc_0023 orc_0041 orc_0059 orc_0077 orc_
[ HTML 파일 ]
[+] Fuzzing the String Table .shstrtab with 254 bytes
[+] Fuzzing the Section Header Table with 29 entries
(SHT[0]->sh_addralign = 0x0000000000000fff) | SHT[0] rule [05] executed
(SHT[3]->sh_flags = 0x0000000000000000) | SHT[3] rule [10] executed
(SHT[3]->sh_flags = 0x000000000ff00000) | SHT[3] rule [32] executed
(SHT[5]->sh_flags = 0x0000000000000402) | SHT[5] rule [10] executed