예전부터 간간히 사용하던 Linux Base Fuzzer에 대한 이야기입니다.
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

댓글 2개:

  1. 위에 취약한 코드에 대해 퍼징을 통해 분석을 한 것 같은데, 혹시 취약한 코드에 대한 내용은 어디서 확인할 수 있나요?? Melkor을 이용한 퍼징에 관심이 있어 댓글을 달아요~~

    답글삭제
    답글
    1. 퍼징 완료하게 되면 리포트 디렉토리랑 데이터 만들어줍니다.
      (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

      삭제