바이너리 디핑 플러그인, bindiff를 사용한 펌웨어 패치 분석
- 임베디드
- 2020. 2. 21. 23:19
저번 포스팅에서 상당한 삽질을 통해 bindiff라는 바이너리 디핑 툴을 설치하고 간단히 사용법을 알아보았는데 삽질만 하고 끝내면 아쉬우므로 이번엔 실제로 사용해보려 한다.
실제 제조사 웹페이지에 공지사항으로 올라온 '한국 인터넷 진흥원(KISA)의 보안 규격 적용'을 기반으로 패치전의 구버전 펌웨어와 패치후의 펌웨어를 다운받아서 디핑을 이용해 어떤 패치가 이루어졌는지 대략적으로 살펴보기로 했다(패치전 펌웨어: V1.2.4 / 패치후 펌웨어: V1.2.9).
관련포스팅
bof (strcpy)
아무래도 2년전 펌웨어이다보니, strcpy함수 관련 bof가 있었을 것이라 생각하고 로그인과 관련된 문자열 부근에 있는 strcpy 함수 호출 부분을 찾아보았다.
그리고 디핑 결과로 나온 Matched Function을 전부 복사해서 패치 후의 함수 위치를 찾았다.
찾아보니, strncpy로 패치된 것을 볼 수 있었다. 하지만 일단 이 부분은 사용자 입력값이 들어가는 부분은 아닌 것 같기 때문에 입력값과 관련 한 다른 부분을 찾아보았다. 애초에 qemu에 올리거나 실제로 기기를 사서 확인하기 전까지는 정적분석으로는 (적어도 나는) 완전히 확신하기는 힘든 것 같다.
아래 strcpy의 src, v2가 사용자 입력값에서 온 변수들인지를 확인해야 하는데 일단 각각 해당 함수 인자 첫번째와 두번째이다.
위 함수가 아래 맨 아래 호출되고 있는 sub_158040인데 첫번째 인자인 v7은 dest 버퍼를 기준으로 ': '앞에 있는 문자열이 잘려서 들어가게 된다.
dest 버퍼가 초기화된 후 채워지는 sub_34578은 상당히 복잡해서 정확히 분석하기는 힘들었지만 일단 위 함수를 호출하는 함수에 GET/PUT/POST 방법에 따라 해당 문자열이 Method: 로 들어가는 것으로 보아 웹 요청과 관련한 것은 확실한 것 같다.
또한, sub_27A68의 첫번째 인자로 들어가는 값이 다시 위 함수의 첫번째 인자인데 확인을 해보면 아래와 같이 웹요청과 관련한 함수들을 각각 구성하고 있다.
커맨드인젝션 (system, popen)
이번엔 커맨드 인젝션과 관련해 system이나 popen 함수 주변을 살펴봤다. 설령 펌웨어가 없더라도 모든 파라미터에 ';[command]'를 날려보는 방식으로 커맨드 인젝션을 확인하기도 한다. popen에 들어가는 명령은 거의다 정적으로 박혀있는 변수값을 쓰거나 변수를 사용하지 않았는데 system함수 중에 다음과 같이 두번째 인자값을 받아서 sprintf로 명령어를 구성 후 시스템 함수를 사용하는 것을 볼 수 있었는데 이 부분은 패치된 부분은 아닌 것으로 확인됐다.
추가적으로 system 함수를 살펴보던 중, 아래와 같이 txt 파일을 삭제하는 부분이 추가됐는데 추출한 펌웨어에 해당 파일이 없어서 개인적으로 궁금한데 왜 삭제했는지는 모르겠다.
웹요청 인증
또한 웹요청을 처리하는 함수에서 아예 인증 부분이 없다가 새롭게 인증이 추가된 부분도 확인됐다.
정적분석만으로는 좀 한계가 있고 기기를 사기에는 재정상태가 힘들기... 때문에 다음 포스팅에서는 펌웨어를 qemu에 올리는 방법에 대해 다뤄보려고 한다(2~3일 삽질 예상).
'임베디드' 카테고리의 다른 글
UART 해킹, 래빗(rabbit) 사용해서 쉘 획득하기 (2) | 2020.03.03 |
---|---|
binwalk -e 에러, 'sasquatch -p 1 -le -d '%%squashfs-root%%' (0) | 2020.03.01 |
QEMU, 펌웨어를 이용한 가상 공유기 환경 구축 (MIPS) (4) | 2020.02.24 |
펌웨어 분석을 위한 binwalk, fmk 사용법 (0) | 2020.02.18 |