- 기계학습 기반의 스트립된(stripped) 리눅스 바이너리 분석 기술
- 스트립 바이너리 제작에 사용된 컴파일러 탐지 기술
- 스트립된 바이너리에서 함수 위치 탐지 기술
- 스트립된 리눅스 바이너리 제작에 사용된 컴파일러 정보 추출 기술 연구
- 스트립된 리눅스 바이너리에서 함수 정보 추출 기술연구
- 함수 위치정보(시작, 종료) 추출 machine learning 연구
- 함수 Basic block 정보 추출 기술 연구
- 1. (USENIX)Recognizing functions in binaries with neural networks_augsut 2015
- 2. Recognizing Functions in Binaries with Neural Networks 요약본
- 3. BinComp: A stratified approach to compiler provenance Attribution
- 4. Byteweight: Learning to Recongnize Functions in Binary Code
- 5. Extracting Compiler Provenance from Program Binaries
- 6. Neural Reverse Engineering of Stripped Binaryies
가. 스트립된 바이너리에는 디버그 심볼이 포함되어 있지 않기 때문에 분석이 쉽지 않음 나. 일반 바이너리와 스트립된 바이너리의 차이
-
스트립된 바이너리는 일반 바이너리와 달리 디버깅 정보가 들어간 디버그 심볼 정보가 제거된 형태로, 디스어셈블이나 역공학(reverse engineering)을 어렵게 함.
-
일반 바이너리는 디버그 심볼 정보가 있기 때문에, 바로 모든 정보 조회가 가능함.
-
스트립된 바이너리는 디버그 심볼 정보가 없어, 정보를 조회하는 데에 어려움을 겪음.
-
스트립된 바이너리에서 사용된 컴파일러 종류와 버전 파악의 어려움
-
스트립된 바이너리 내에 존재하는 함수 위치 파악의 어려움
- 바이너리에는 함수에 포함되지 않는 부분도 존재함
- 한 함수의 내용이 연속적이지 않을 수 있음
- 호출되지 않는 함수가 존재할 수도 있음
- 인라인되어 제거되는 함수도 있을 수 있음
- 컴파일러 종류와 최적화 옵션에 따라 다르게 바이너리가 나옴, 특정 컴파일러나 최적화에 따라 함수 검출이 어려움
- 1차 : header파일을 포함한 모든 바이너리를 추출 - Accuracy : 12%
- 2차 : 함수타입의 바이너리 98%이상을 .text섹션에서 추출 - Accuracy : 60~78 %
- 3차 : 함수타입이외 모든 .text섹션의 바이너리를 추출 - Accuracy : 96 % 이상
- 각 유틸리티패키지에 대해서, 각 gcc컴파일러버전별로 실행파일(ELF포멧형식) Symbol Table을 통한 함수시작 바이너리와 나머지 부분에 0과 1로 라벨링
- 이 후에 바이너리과 라벨링 맵핑에 대한 Annotation파일을 구성
- HEX 바이너리에 대해서 One-Hot Encoding을 통해서 벡터화
- 1차 : One-to-One RNN / BIRANN Model 구현
- 2차 : Many-to-Many BIRNN Model구현
####기존 불균형데이터 전처리 솔루션을 보완한, 시퀀스별 데이터 재구성기법
- 오버샘플링과 Under Sampling방식은 Minor/Major 클래스 바이너리별로 무작위성이 Context이 사라져, RNN학습을 못함
- Weight balancing을 적용 결과, 학습데이터가 너무 극한 불균형데이터여서, 효과가 어려움
◆ 기존 Imbalanced 솔루션
▲ Over Sampling, Under Sampling 방식
- Under Sampling : 높은 비중을 차지하는 클래스의 값들을 임의로 제거하는 방법
- Over Sampling : 소수 클래스의 값들을 복제하여, 그 수를 늘리는 방법
▲ Weight balancing 방식
- 모델을 훈련하는 동안 소수 클래스와 다수 클래스에, 클래스의 비율에 대해 가중치를 달리 두는 방법
STEP |
---|
1차 : input을 1개의단위로 One-Hot 인코딩만 진행 |
2차 : input을 n개의 Window형식으로 전행 |
3차 : mnay-2-many를 위한 n개씩 input을 위한 전처리 진행 |
4차 : n-byte 기법 활용 |
5차 : 컴파일러 옵션 버전을 알 수없는 상황으로, 모든 옵션을 통합하여, n-byte를 적용하여 데이터를 Concat시킴 |
- GCC컴파일러별 옵션별로 Input Sequence길이 최적점을 찾기위해서 통계적으로 실시
- Hidden Layer의 너비와 깊이를 변경하면서 시도
- binutils + coreutils 학습 k-fold검증 :98 ~ 99%
- binutils + coreutils 학습 k-fold검증 통합 데이터 : 98%
다운로드 링크 https://drive.google.com/drive/folders/1Ryfnt_CM2J8cL2yU2hB_xtr-P97viC9N?usp=sharing