2. <목차>
1. 리버스 엔지니어링 1
가. 정적분석
1) 바이너리분석
2) 문자열, 모듈, 이벤트 분석
나. 동적분석
1) 모니터링을통한 프로그램 행위분석
2) 디스어셈블링, 디버깅을 통한 실시간분석
2. Safer 리버싱 실습 2
가. 프로그램 실행을 통해 실행 흐름 파악 및 목표 수립 3
나. 기본적인 분석 3
1) 패킹여부, 컴파일러 파악
2) Safer의 자원사용 모니터링
다. 디버깅 5
1) 사용되는 모듈, API, 문자열 분석
2) 파일, 문자열 처리부분 BreakPoint 설정 6
3) 비밀번호 해시화 과정 디버깅 7
4) 해시값 비교 루틴 분석 8
5) 어셈블리어를 변경하고 실행파일로 생성 9
6) 변경된 실행파일로 로그인, 복호화 시도 10
3. 실습을 통한 결론 11
가. 리버싱은 방대한 학문
나. 안티디버깅 VS 디버깅 끈임없는 경쟁
4. 참고자료 12
3. - 1 -
1. 리버스 엔지니어링
리버스 엔지니어링은 역공학이며 말그대로 개발(소스코드)->결과물(EXE,DLL등)의 과정
을 반대로 하는것이며 결과물을 분석하여 구조,원리 등을 파악하는 것이다. 이로부터 파
생된 공격중에는 DLL injection, API hooking 등과 게임 및 프로그램 메모리조작, 키젠
크랙 등등이있다
,
가. 정적분석
정적분석은 파일을 실행하지않고 확장자, 시그니처 같은 겉모습을 분석하는 것이다
종류로는 아래의 2가지 방법이있다
1) 바이너리분석
컴파일러 확인, 패커 여부를 파악한 후에 어떤 언어로 코딩되어 있는지 확인하는 것으로서
PEID, exeinfope 같은 툴들이 있다
2) 문자열, 모듈, 이벤트 분석
어떤 API를 사용하는지, 파일 실행에 있어 어떤 모듈을 로딩하는지, 문자열은 어떤것들이
있는지 분석하는 것이며 Dependency Walker 툴을 사용한다
나. 동적분석
파일을 직접실행시키면서 프로그램의 행위를 분석하고 디버깅, 디스어셈블을 통해 메모리
와 코드흐름의 상태들을 분석하는 것이다
1) 모니터링을통한 프로그램 행위분석
프로그램의 파일, 레지스트리, 네트워크 자원을 어떻게 쓰는지 분석하는 것으로
ProcessMoniter, TCPView 같은 툴을 사용한다
2) 디스어셈블링, 디버깅을 통한 실시간분석
기계어를 어셈블리어로 바꾸어 분석하는 것으로 메모리, 레지스터 등 직접적인 접근과 분
석이 가능하다 툴로는 OllyDbg, Windbg, IDA Pro 등이있다
2. Safer 리버싱 실습
Safer는 필자가 팀원들과 만들었던 프로그램이다. 간단한 문서암호화 프로그램이며 이를
리버싱해볼 것이다
4. - 2 -
(그림 가-1)실행파일 위치폴더
폴더를 보면 실행파일2개와 DLL한개 스크립트파일2개와 아이콘파일이 존재하는
걸 알 수 있다 스크립트 파일 두 개는 프로그램 삭제를 위한 파일이란것도 텍스
트 에디터로 열어보면 알 수 있다
(그림 가-2) 실행화면
가. 프로그램 실행을 통해 실행 흐름 파악 및 목표 수립
5. - 3 -
실행해보면 드래그앤드랍으로 암호화할 문서를 선택하고 아래의 리스트뷰로 저잘할 위치를
정하며 가운데의 암,복 호화 버튼들로 문서를 암호화하는걸 알 수 있다 회원가입을 하지않
으면 암호화를 할 수 없는 화면이고 우리는 임시로 만든 ID:kit2013 PW:kit2013의 계정으
로 암호화한 문서를 복호화할 것이다
나. 기본적인 분석
이제 본격적으로 분석을 해볼 것이다 먼저 패킹이 되어있는지 안되어있느지 확인할 필요가
있다 패킹은 일종의 소스코드 난독화라고 볼수있으며 리버스엔지이너링을 막기위해 존재한
다 패킹종류는 UPX패킹등 다양하며 OllyDbg에는 이러한 패킹을 무력화 시키는 언패킹 플
로그인이 존재한다 이번 실습에 패킹과언패킹은 포함 되지 않으니 언급은 이정도만 하고
넘어가겠다
1) 패킹여부, 컴파일러 파악
(그림 나-1) PE구조 분석
위의 그림을 통해 우리는 Saper라는 실행파일은 윈도우 GUI프로그램이며 컴파일은
Visual C++ 2010 버전으로 했고 패킹또한 되어있지 않은 실행 파일이란걸 알았다
Exeinfo 라는 툴은 이렇게 실행파일의 PE 구조를 읽어와 정보를 표시해준다
2) Safer의 자원사용 모니터링
이번엔 모니터링을 통해 Saper.exe가 어떤파일을 만들고 레지스트리를 조작하는지 알아볼
것이다 회원가입하는과정을 모니터링할것이며 툴은 ProcessMonitor를 사용한다 와이어샤
크처럼 왠만한 모든 이벤트를 캡처가능하고 강력한 필터링도 지원되어 매우 유용하다
프로세스이름이 Saper.exe인것과 실행파일이 존재한 폴더안에 모든 이벤트를 캡처하도록
필터를 적용할 것이다 또한 파일을 새로 생성할 경우는 표시를 다르게해주었다
6. - 4 -
(그림 나-2) 생성되는 파일들 보기
위의 그림을 보면 프로그램이 IW, log.txt, temp 파일들을 생성하고 읽는걸 볼 수 있다 오
른쪽에는 Win32API 오픈모드도 나와있는 모습이다
(그림 나-3) 계정 확인 파일
존재하지 않는 아이디로 로그인시도시 그림처럼 IW파일읽는걸 보아 IW파일에 계정정보가
있을 것이다
(그림 나-4) kit2013 kit2013 으로 회원가입후 로그인한모습
7. - 5 -
(그림 나-6) 원본
(그림 나-7) 암호화된 문자열
(그림 나-4)를통해 temp파일도 계정과 관계있다는걸 알았으며 회원가입후 IW파일을 열어
보니 kit2013 4B01DB11E5C5EF2BF5674C774D3FEE5776F6705A 라는 문자열이 존재한
걸로 보아 왼쪽은 아이디 오른쪽은 비밀번호 해시값임을 알 수 있다
다음 그림3개는 암호화시에 캡처본과 원본텍스트파일, 암호화된 텍스트파일이다
(그림 나-5) 암호화할때의 캡처본
다. 디버깅
모니터링을 통해 계정정보가 IW파일에 저장되어있다는걸 알았고 kit2013이라는 아이디와
그에 해당하는 비밀번호의 해시값을 획득했다 Saper의 암호화 복호화는 ID마다 평문,암호
문이 다르기 때문에 암호문을 복호화 하려면 kit2013 ID의 비밀번호도 획득해야한다 하지
만 디버깅을 통해 우리는 사용자 인증을 우회 할 것이다
1) 사용되는 모듈, API, 문자열 분석
원래 정적분석단계에서 Dependency Walker 툴을 이용하여 분석하지만 OllyDbg도 이기
능을 지원하기에 그냥 OllyDbg툴로 분석하겟다
8. - 6 -
(그림 다-1) 문자열
(그림 다-2) API,모듈
문자열 사진을 보면 CreateFile API함수의 인자들과 파일명인 temp 시간얻어올 서식문자
열 등이보이고 모듈과 API에서는 문자열 비교함수인 strcmp, GUI로 문자열을 출력해주는
TextOutW등 API와 관련 DLL이 보이는걸 확인 할 수 있다
2) 파일, 문자열 처리부분 BreakPoint 설정
앞서 과정에 참조되는 문자열, API들중에 비밀번호와 파일관련 부분에 중단점을 만들어 디
버깅하여 내부 동작 흐름을 관찰한다 (그림 다-3 참조)
9. - 7 -
(그림 다-3) 중단점 설정
3) 비밀번호 해시화 과정 디버깅
IW파일을 보면 해시값은 40글자란걸 알 수 있다 그걸 단서로 디버깅한결과 문자열크기를
세팅하는 부분과 입력한 비밀번호가 해시값이 되는 과정을 찾을 수 있다
(그림 다-4) 문자열가공하기전의 세팅
위의그림안의 빨간색으로 표시된 박스들을 보면 해시값의 크기인 40이 세팅되는걸 볼 수
있고 아래의 메모리덤프를 통해 입력된 아이디는 kit2013 비밀번호는 123 이란걸 알 수
있다 또 size=15는 아이디의 길이제한이라는걸 유추할 수 있다
10. - 8 -
(그림 다-6-1) 스택에 점점 쌓이는 해시값
(그림 다-5) 해시값 40글자 될 때까지의 과정
위의 그림안에 중단점설정된부분에서 크기를 비교하여 계속 문자열이 생성되는걸 알 수 있
다 20까지인걸보아 한번에 2글자씩 20번 돈다는 걸 알 수 있고 아래의 그림 2개를 통해
스택에 점점 쌓이는 해시값을 볼 수 있다
(그림 다-6-2) 같은 스택주소에서 점점 늘어나는 해시값
4) 해시값 비교 루틴 분석
우리는 IW파일에 계정정보가 저장되어있고 이를 통해 사용자 인증이 이루어진다는걸 알고
있다 그럼이제 만들어진 해시값을 기존 해시값과 비교하는 루틴을 찾으면 된다 그결과 아
래의 그림속의 어셈블리 코드들이 보인다
(그림 다-7) 해시값 비교 분기문
11. - 9 -
위의 그림을 보면 JZ,JNZ,JE 를통해 분기가 나누어 진다는걸알 수 있다 점프되는 각각 점
조건점프문이 이동하는 주소를 살펴보고 그에 해당하는 메시지박스의 Caption을 살펴보면
로그인성공에 해당되는 부분이 보인다 (그림 다-8 참조)
(그림 다-8) 로그인성공 될시의 메시지박스
5) 어셈블리어를 변경하고 실행파일로 생성
분기문을 찾았으니 이제 어셈블리어를 변경하면 된다 (그림 다-7)의 조건점프문들을 JMP
로 바꾸고 위치를 (그림 다-8)의 성공일시의 처리되는 루틴의 시작주소로 변경한다. 아래
그림의 빨간색으로 된 글자들이 변경된 어셈블리어 이다
(그림 다-9) 어셈블리어 변경
12. - 10 -
변경한후 디버깅하면 로그인이 성공한다 하지만 바뀐 코드는 저장되지않고 OllyDbg 실행
될 때 마다 바꾸어 주어야 한다 그래서 아에 바뀐코드를 포함한 Saper.exe 파일을 새로
생성해준다 파일명은 Saper_cracked.exe 이다 (그림 다-10 참조)
(그림 다-10) 실행파일로 만들기
6) 변경된 실행파일로 로그인, 복호화 시도
이제 기존 Saper.exe가 위치해있던 폴더에 새로만든 Saper_cracked.exe를 이동시키고
실행하여 ID는 kit2013 비밀번호는 123을 입력해본다 아래의 그림처럼 성공적으로 로그인
이 완료된 모습을 볼 수 있다
(그림 다-11) 틀린비밀번호로 로그인 성공
13. - 11 -
복호화또한 아래의 그림을 통해 성공적으로 수행되는 것을 볼 수 있다 물론 Saper는 비밀
번호를 암호화, 복호화시에 사용 하지 않기에 가능한 것 이지만 만약 아이디도 인증 우회
를 한다면 암호화, 복호화가 정상적으로 작동하지 않는다. 어짜피 프로그램에 보안관련
결함인 IW파일에 계정정보를 통해 아이디는 획득이 가능하다
(그림 다-12) 암호화된 파일 복호화 성공
3. 실습을 통한 결론
무엇보다 깨달은건 필자가 만들었던 Saper프로그램은 보면 볼수록 보안도 기능도 미흡했
던 프로그램이란걸 알았다 또한 디버거를 사용해 디버깅을 처음해보았는데 어셈블리어만
읽을 줄알고 기본적인 툴 사용법만 익히면 프로그램의 내부 흐름이 훤히 보이고 이미 컴파
일된 결과물인데도 불구하고 변경이 가능하다는 것이 적잖이 놀랍다. 실습을 통해 어떠한
프로그래밍 언어든 코딩했을 때 메모리와 레지스터의 동작 흐름을 아는 프로그래머라면 그
언어의 선두자라 봐도 무방하다고 생각이 든다
가. 리버싱은 방대한 학문
실습내용은 낮은 수준의 리버싱에 불과하다 본격적으로 리버싱을 할려면 패킹, API후킹,
Win32 API, DLL인젝션, 메모리 보안 등을 알아야한다 또한 필자는 조건문을 변환 시켜
인증 우회를 했지만 그 외에도 다양한 기법들이 존재한다 또한 멀티스레드 프로그램일시
더욱 리버싱 과정이 복잡할 것이다
나. 안티디버깅 VS 디버깅 끈임없는 경쟁
개발자는 디버깅을 막으려 하고 해커들은 디버깅을 통해 리버싱을 하려한다 그에따라 수많
은 방어, 우회, 공격, 차단 기법들이 있다 기초적인 TLS callback 함수를 통한 디버깅 감
지 그리고 이 방어 기법을 우회하는 API후킹을 이용한 스텔스 프로세스 같이 끈임없이 생
기는 방어, 공격기법들을 보면 과연 승자는 누구일지 궁금하다