DEFCON 2009 :: Binary L33tness 100, EDB로 풀어보자.

사용자 삽입 이미지
지난 6~8일에 있었던 데프콘 CTF 예선 문제입니다. 위 그림처럼 실행하면 암호를 묻고 틀린다면, 욕을 하는 기분 나쁜 녀석입니다. 기분도 나빠졌으니 까짓꺼 한 번 깨줘야겠죠?

준비 사항

  • 리눅스 계열의 OS.
  • libnet1 패키지
  • Evans Debugger

이 파일은 ELF 포맷으로 되어 있습니다. ELF란 유닉스, 리눅스 등의 실행 파일의 구조인데 ,이에 대해 설명하려면 끝이 없으니 자세한 내용을 알고 싶으시면 아래 참고 문헌을 읽어주세요. 아무튼 이 녀석에 대해 파해칠려면 리눅스가 필요하지요. 그리고 이 녀석을 실행하려면 libnet1 패키지가 설치되어야 합니다.

sudo apt-get install libnet1


전 이 문제를 디버깅툴로 풀려고 합니다. 리눅스에는 EDB라는 윈도우즈의 OllyDbg와 유사한 인터페이스를 갖춘 GUI 디버깅툴이 있습니다. 실제로 EDB 개발자는 OllyDbg를 모델로 하여 개발하였다고 하더군요. 아래 참고 문헌을 참조하여 설치해주세요.

바이너리 파일 속을 볼까?

준비 다 되었으면 이제 본격적으로 시작해볼까요?

리눅스에서는 strings 도구를 사용하여 파일에 포함되어 있는 문자열들을 뽑아낼 수 있습니다. 이것은 실행 파일도 마찬가지지요. 뽑아낸 문자열에는 라이브러리 이름, 함수 이름, 실제로 이용되는 문자열 등등 아주 많은 정보가 포함됩니다. 더 자세한 내용은 man 페이지에서… ^^;

strings defcon17_BL_100


사용자 삽입 이미지
그런데 문자열을 뽑아내었는데도 원하는 정보가 나오지 않습니다. 위 그림처럼 단편적으로 쪼개진 의미없는 문자열만 나오지요. 다만, 이해할 수 있는 문장이 하나 나오는데, 내용인 즉슨 “이 파일은 UPX로 압축되었다”라고 나옵니다. 압축을 풀어야 이 파일을 뜯어볼 수 있다는 얘기지요. 다행히 UPX는 -d 옵션을 이용하여 쉽게 풀 수 있습니다.

upx -d defcon17_BL_100


그러나 계속 찾아오는 시련… 황당하게도 체크섬 오류로 압축을 풀 수 없다고 나옵니다. 여기서 GG 쳐야하는건지… 압축을 못 풀면 내부 정보를 알 수 없는데 어떻게 풀라는 말인지?

하지만 방법이 있더군요. UPX든 뭐든 간에 아무리 실행 파일을 압축했어도 실행되는 당시에는 압축이 풀려 있어야 실행이 되겠지요. 아니면 컴퓨터가 어떻게 알아 먹고 실행하겠어요? 그리고 아마 메모리 어딘가에 압축이 풀린 프로세서가 떠 있을 겁니다. 우리는 그 녀석을 낚아서 회를 치는 겁니다.

그럼 어떻게 낚을까요? 낚시에서는 미끼를 던지는 게 기본이겠죠? 미끼를 한 번 줘 볼까요?

./defcon17_BL_100 &


사용자 삽입 이미지
파일을 실행할 때 뒤에 &(앰퍼센트)를 붙이면 실행 된 이후에 프로세서를 백그라운드로 넘겨서 대기시킵니다. ps 명령어로 백그라운드에 대기중인 녀석을 확인할 수 있지요. 그런 다음에 EDB를 실행하여 프로세서를 불러옵니다.

사용자 삽입 이미지
하지만 프로세서가 불려오지 않을 겁니다. 녀석이 아직 미끼를 안 물었거든요. 미끼를 물게 하기 위해서는 bg 명령어를 씁니다. 백그라운드에 있는 작업을 재실행하라는 명령어지요.

bg


사용자 삽입 이미지
그러면 녀석은 미끼를 덥썩 물어서 위 그림처럼 낚이는 거죠. 우리는 이것을 이용해 회를 치면 되는 겁니다. 우선, EDB에서 “메뉴 -> Plugins -> BinarySearcher -> Binary String Search”를 이용해 처음 시작했을 때 암호를 묻는 문자열을 검색합니다. 아마 그 문자열 근처에 비교할 암호가 있다거나 알고리즘이 있겠지요.

사용자 삽입 이미지
주소를 찾았으면 직접 찾아가봅니다. 위에서 나온 주소를 더블클릭 해도 되고, “메뉴 -> Plugins -> StringSearcher -> String Search”를 이용해도 됩니다.

사용자 삽입 이미지
여기까지 문제없이 따라오셨다면 위 그림처럼 웬지 암호로 보이는 문자열이 나타납니다. 실제로 확인해보죠.

사용자 삽입 이미지
빙고! 녀석을 완벽하게 회를 쳤습니다. 녀석이 겁을 먹었는지 저더러 “니가 내 애비다”라고 말하는군요. 훗! 처음부터 욕을 하지 말던가…

다시 한 번 정리

지금까지 내용을 간략히 정리하면 다음과 같습니다.

  • 어떤 파일(프로그램)인지 알아보기 위한 기초조사 (strings, file, readelf, …)
  • 패킹 여부 확인 & 언패킹 (upx, …)
  • 프로세서를 백그라운드에 대기 (&, ps, bg, …)
  • EDB 등의 툴로 디버깅

정리해보니 너무나 간단하네요. 다만, 어떤 도구를 언제 어떻게 써야 하는지만 알면 되는거죠. 기초적인 ELF가 뭔지, UPX가 뭔지 등은 검색해보면 다 나오구요.

제가 한 방법과 다르게 푸는 방법도 있습니다. 그 방법은 아래 참고 문헌에 링크를 걸어놓겠습니다. 중국의 해커가 자신의 블로그에 올렸네요. 그 방법은 디버깅툴을 쓰지 않고 리눅스의 도구들을 이용합니다. 프로세서를 낚시하는 것은 똑같은데 낚는 방법이 다르지요.

참고 문헌

ELF File Format :: http://kldp.org/node/103483
EDB, Evan’s Debugger :: http://linux-virus.springnote.com/pages/3512025
UPX :: http://en.wikipedia.org/wiki/Upx
Defcon 17 Wargame 競賽解題心得 :: http://timhsu.chroot.org/2009/06/defcon17wargame.html

Similar Posts

  • PADOCON 2010 hand-ray 리버싱 풀이 1st

    이번 파도콘 때 컨퍼런스 발표 외에도 섹션 밖에서 재미있는 이벤트들이 있었습니다. 그 중에서 순천향대학교 Security First 에서 핸드레이 리버싱 문제를 출제했었지요. 문제들이 재미있어서 소개합니다. 문제 다음 프로그램은 어떤 함수호출 규약을 사용하는가?? 0x00401082 에서 401005 함수를 호출합니다. 그리고 0x00404005 에서 실행 흐름이 0x00401020 으로 넘어갑니다. 이 상태에서 어떤 함수 호출 규약이 적용되었는지를 묻는 문제입니다. 따로 풀이를…

  • PADOCON 2010 hand-ray 리버싱 풀이 3rd

    PADOCON 2010 핸드레이 세 번째 문제는 두 번째 문제보다 더 많은 삽질을 요구했습니다. 예선전 문제였던 ddanjin과 유형이 같은데요, 차이라 하면은 핸드레이로 풀어야 한다는 것 뿐이네요… 문제 다음 코드에서 입력코드가 k1n0TheBest 일 때 출력될 값은 무엇인가? 방금 전 얘기했듯이 예선전의 ddanjin과 같은 유형입니다. PADOCON 2010 CTF 예선 문제를 보신 분이라면 대충 눈치 채시겠죠? 문제를 푸는 요령은…

  • DLL injection 은 어떻게 이루어지는가? – SetWindowsHookEx ()

    SetWindowsHookEx () 이번에는 윈도우즈에서 정상적으로 지원하는 후킹 함수를 이용하는 방법을 알아보겠습니다. 윈도우즈는 OS와 프로세스 간에 메시지를 주고받는데요. 키보드를 누른다던지, 마우스를 클릭한다던지, 디버깅에 관한 메시지라던지 그런 것들을요. 그리고 그렇게 주고받는 메시지를 후킹할 수 있는 함수도 제공하고 있습니다. [그림 1] SetWindowsHookEx() 함수의 개요 SetWindowsHookEx() 함수가 그것이죠. [그림 1]처럼 이 함수에 삽입할 DLL의 Handler, 즉 주소와 함수의 주소를…

  • 우분투에서 chown 명령어로 권한 주기

    얼마 전, Download 파티션을 ext3로 새로 포맷했습니다. vfat로 해서 써왔더니 다운로드 받은 파일의 이름이 종종 깨질 때가 있어서 말이죠. 그런데 문제가 생겼습니다. 이전에 했던 방법대로 fstab 파일을 편집했지요. 다만, 마운트는 되어도 제게 권한이 없는게 않겠습니까? 권한이 모조리 root로 가 있어서 읽기도 쓰기도 되지 않아 Download 용으로 사용하려는 제 발목을 붙잡는 겁니다. 이를 두고 이번에도 몇…

  • RET Instruction in Intel Machine

    Intel 머신에서는 함수의 에필로그(Epilogue) 마지막에 RET 명령이 있습니다. 이 명령은 현재의 ESP(스택 포인터)를 참조하여서 함수가 종료된 후 이전의 실행흐름으로 되돌아가는 명령입니다. 그래서 하나의 함수가 실행되면서 중간중간 다른 함수가 실행되어도 흐름이 유지될 수 있는 것이죠. 어떤 문서에 보니까 RET 명령을 다음과 같이 설명하고 있었습니다. 위 코드대로라면, BOF를 이용한 연속적인 함수 호출이나 RTL(Return-to-Libc) 등이 설명되지 않습니다. 덕분에…

  • 리눅스(우분투)에서 부경대학교 무선랜 접속하기

    이 글은 부경대학교 무선랜을 리눅스(Ubuntu 10.04 기준)에서 접속하는 방법에 대하여 작성되었습니다. 무선랜 활용 TIP :: http://www.pknu.ac.kr/files/wirelesslan/wirelesslan_guide.pdf자주하는 질문(FAQ) :: http://www.pknu.ac.kr/files/wirelesslan/wirelesslan_faq.pdf 단계 1 “시스템 -> 기본설정 -> 네트워크 연결” 실행 단계 2 “무선” 탭 선택 -> “추가” 버튼 클릭 단계 3 연결 이름에 “PKNU-WLAN” 입력 -> “무선” 탭에서 SSID 값에 “PKNU-WLAN” 입력 단계 4 “무선 보안” 탭에서…

0 Comments

  1. 리눅스는 많이 써보질 않아서 몰랐는데..;;
    EDB 라는것도 있었군요..;;;
    마치 윈도우의 OllyDBG 를 보는듯하네요;; +_+

  2. 우연히 들어와서 보게 됐는데… 부경대분이시군요~~^^;;;
    하.하.하.. 저도 아직까지는 부경대 컴멀소속(?)인데..
    반갑습니다~~ (__)
    살포시 제 블로그에 링크를 걸어봅니다~ㅋ

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다