이번 게시물에서는 git에 있는 busybox를 복사해서 취약점이 있는 버전과 패치된 버전을 각각 컴파일 해보겠습니다.
구글에 git busybox를 검색해서 busybox를 다운로드 하겠습니다. 저는 리눅스에 git clone으로 다운로드 하겠습니다.
busybox라는 폴더가 만들어집니다. 폴더 안으로 들어가면 실행파일은 아직 없습니다.
구글에 busybox cve를 검색해서 cvedetail.com으로 들어간 후 Vulnerability를 클릭하면 busybox에서 나온 취약점이 CVE 형태로 출력됩니다. 가장 최근에 발견된 CVE-2021-28831 취약점을 빌드하겠습니다.
해당 취약점으로 들어가서 레퍼런스에 git을 클릭하면 위와 같은 페이지에 접근할 수 있습니다. commit이 패치된 버전이고 parent가 패치 전 취약점이 있는 버전입니다.
git checkout 명령어로 해당 버전으로 이동할 수 있습니다.
컴파일 전에 컴파일 설정을 미리 할 수 있습니다. make menuconfig명령어를 입력하면 위와 같은 화면이 출력됩니다.
Setting의 빌드 옵션에서 만약 크로스 컴파일이 필요한 경우 Cross comliper prefix에 arm-linux-gnueabi- 를 입력하고 CFLAGS에 -g 옵션을 준다. 필자의 리눅스는 인텔을 사용하는데 필요한 바이너리는 ARM이라서 크로스 컴파일을 진행하는 것입니다. 일반적인 경우에는 설정할 필요가 없습니다. 마지막으로 make를 입력하면 컴파일 빌드가 시작됩니다.
컴파일이 완료되면 busybox와 busybox_unstripped라는 리눅스용 elf 실행파일이 생성됩니다. 저는 IDA로 분석을 할 것이므로 unstripped를 사용하겠습니다. busybox는 함수이름이 난독화되어 있어서 분석하기 힘들지만 unstripped는 난독화 되어 있지 않습니다. 해당 파일을 다른 곳으로 옮겨준 뒤 다음 취약한 버전으로 이동합니다.
이전과 같은 방법으로 컴파일을 해줍니다.
취약 버전은 V, 패치 버전은 P로 이름을 바꿉니다. IDA P를 올리고 File의 Script file을 클릭해 diaphora.py를 실행합니다. diaphora는 구글에 검색해서 다운 받을 수 있습니다.
P.sqlite 생성됬다면 V를 IDA에 올리고 diaphora를 실행하여 위 그림과 같이 두번째 칸 diff aganist에 이전에 생성한 P.sqlite를 추가합니다. 그리고 OK를 누릅니다.
5분 정도 기다리면 분석이 끝나고 매치율이 출력됩니다.
이전에 버전을 확인한 페이지 아래를 보면 초록색 부분은 추가된 부분이고 빨간색 부분은 제거된 부분이다. 여기서 수정된 함수는 huft_free임을 알 수 있다.
IDA로 돌아가서 huft_free 함수에 마우스 우클릭을 하고 diff assembly를 클릭하면 추가된 부분은 초록색으로 바이너리 형태로 표시되고 빨간색 부분은 바이너리 형태로 출력된다. 수정된 주소를 이용해 시그니처를 제작하여 자동 취약점 분석에 이용할 수 있는 연구가 진행되고 있다.
'잡동사니' 카테고리의 다른 글
[PostgreSQL 실습] (0) | 2021.10.09 |
---|---|
하드디스크, RAM, ROM, SSD 개념 (0) | 2021.10.05 |
[운영체제 개념] (0) | 2021.10.01 |
심플한 원격 데스크톱 (0) | 2021.09.29 |
외부에서 접속 가능한 나만의 서버 만들기 (0) | 2021.09.29 |
댓글