B2R2-org / B2R2

B2R2 is a collection of useful algorithms, functions, and tools for binary analysis.
https://b2r2.org
MIT License
418 stars 62 forks source link

Error in parse EAT #23

Closed cha512 closed 5 years ago

cha512 commented 5 years ago

Describe the bug 특정 파일을 BinHandler로 로딩하는 과정에서 아래와 에러가 발생합니다.

C:\b2r2-dlls>ipy32 b2r2.py
./test/DeviceUxRes.dll
./test/DeviceUxRes.dll
Traceback (most recent call last):
  File "b2r2.py", line 30, in <module>
IndexError: 인덱스가 배열 범위를 벗어났습니다.

To Reproduce

import clr
import os, sys

sys.path.append(os.path.abspath(r'./build_release/'))
clr.AddReferenceToFile(r'B2R2.Core.dll')
clr.AddReferenceToFile(r'B2R2.FrontEnd.Core.dll')
clr.AddReferenceToFile(r'B2R2.FrontEnd.Library.dll')

from B2R2 import *
from B2R2.FrontEnd import *

def search(dirname):
    result = []

    filenames = os.listdir(dirname)
    for filename in filenames:
        full_filename = os.path.join(dirname, filename)
        ext = os.path.splitext(full_filename)[-1]
        if ext == '.exe' or ext == ".dll": 
            result.append(full_filename)
    return result

result = search(r'./test/')
for name in result:
    try:
        print name
        handler = BinHandler.Init(ISA.OfString("i386"),name)
        for s in handler.FileInfo.GetSections():
                print "   %s:%s [%s]"%(hex(s.Address),hex(s.Address+s.Size),s.Name)
    except:
        print name
        raise
        #pass

위 코드를 실행하였을때, 정상적으로 동작한다면 섹션들의 정보가 출력되어야겠지만, 오류가 발생합니다.

(문제가 발생 하는 파일은 여기 에서 다운로드 받을 수 있습니다.)

Additional context

PEHelper의 parseEAT 에서 문제가 발생하는데,

let offset = edt.ExportAddressTableRVA |> getRawOffset headers

이 코드에서 edt.ExportAddressTableRVA가 0을 가르키고, getRawOffset의 아래 부분에서

let sHdr = headers.SectionHeaders.[idx]

-1의 인덱스를 참조하여 오류가 발생합니다.

이 파일은 아래 그림과 같이 Export Directory가 존재하고, Name도 있지만, 나머지 값들이 0인데, 이 경우에는 EAT를 파싱하지 않도록 수정하면 될 것 같습니다.

Environment (please complete the following information):

sangkilc commented 5 years ago

This is great! I can reproduce this bug, and will fix it ASAP 👍

sangkilc commented 5 years ago

Fixed in 8723b41d67acfaf3b3e98312531165e5eef5ef05