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

More Related Content

What's hot

MvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうMvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうShun Hikita
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
Swift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCSwift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCTomohiro Kumagai
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来についてshinjiigarashi
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門Shohei Arai
 
14회 jco 컨퍼런스 조대협의 소프트웨어 개발 배포용
14회 jco 컨퍼런스 조대협의 소프트웨어 개발 배포용14회 jco 컨퍼런스 조대협의 소프트웨어 개발 배포용
14회 jco 컨퍼런스 조대협의 소프트웨어 개발 배포용Terry Cho
 
最強オブジェクト指向言語 JavaScript 再入門!
最強オブジェクト指向言語 JavaScript 再入門!最強オブジェクト指向言語 JavaScript 再入門!
最強オブジェクト指向言語 JavaScript 再入門!Yuji Nojima
 
ΑΕΠΠ κεφ2 μέρος Α Βασικές Εννοιες Αλγορίθμων
ΑΕΠΠ κεφ2 μέρος Α Βασικές Εννοιες ΑλγορίθμωνΑΕΠΠ κεφ2 μέρος Α Βασικές Εννοιες Αλγορίθμων
ΑΕΠΠ κεφ2 μέρος Α Βασικές Εννοιες Αλγορίθμωνevoyiatz
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Takuya Ueda
 
알파고 해부하기 3부
알파고 해부하기 3부알파고 해부하기 3부
알파고 해부하기 3부Donghun Lee
 
リーダブルコード
リーダブルコードリーダブルコード
リーダブルコードKeita Otsuka
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューMoriharu Ohzu
 
左と右の話
左と右の話左と右の話
左と右の話Cryolite
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로Dongmin Shin
 
Quick Search algorithm and strstr
Quick Search algorithm and strstrQuick Search algorithm and strstr
Quick Search algorithm and strstrMITSUNARI Shigeo
 

What's hot (20)

MvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かうMvcのFatモデルに立ち向かう
MvcのFatモデルに立ち向かう
 
楕円曲線と暗号
楕円曲線と暗号楕円曲線と暗号
楕円曲線と暗号
 
暗認本読書会6
暗認本読書会6暗認本読書会6
暗認本読書会6
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
Swift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDCSwift で JavaScript 始めませんか? #iOSDC
Swift で JavaScript 始めませんか? #iOSDC
 
暗認本読書会4
暗認本読書会4暗認本読書会4
暗認本読書会4
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
 
14회 jco 컨퍼런스 조대협의 소프트웨어 개발 배포용
14회 jco 컨퍼런스 조대협의 소프트웨어 개발 배포용14회 jco 컨퍼런스 조대협의 소프트웨어 개발 배포용
14회 jco 컨퍼런스 조대협의 소프트웨어 개발 배포용
 
最強オブジェクト指向言語 JavaScript 再入門!
最強オブジェクト指向言語 JavaScript 再入門!最強オブジェクト指向言語 JavaScript 再入門!
最強オブジェクト指向言語 JavaScript 再入門!
 
ΑΕΠΠ κεφ2 μέρος Α Βασικές Εννοιες Αλγορίθμων
ΑΕΠΠ κεφ2 μέρος Α Βασικές Εννοιες ΑλγορίθμωνΑΕΠΠ κεφ2 μέρος Α Βασικές Εννοιες Αλγορίθμων
ΑΕΠΠ κεφ2 μέρος Α Βασικές Εννοιες Αλγορίθμων
 
Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析Goでかんたんソースコードの静的解析
Goでかんたんソースコードの静的解析
 
알파고 해부하기 3부
알파고 해부하기 3부알파고 해부하기 3부
알파고 해부하기 3부
 
リーダブルコード
リーダブルコードリーダブルコード
リーダブルコード
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
 
左と右の話
左と右の話左と右の話
左と右の話
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로
 
Quick Search algorithm and strstr
Quick Search algorithm and strstrQuick Search algorithm and strstr
Quick Search algorithm and strstr
 

Similar to 리버싱 실습 보고서

빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)YEONG-CHEON YOU
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법성훈 김
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법복연 이
 
Bug sense 분석
Bug sense 분석Bug sense 분석
Bug sense 분석logdog
 
(Ficon2016) #2 침해사고 대응, 이렇다고 전해라
(Ficon2016) #2 침해사고 대응, 이렇다고 전해라(Ficon2016) #2 침해사고 대응, 이렇다고 전해라
(Ficon2016) #2 침해사고 대응, 이렇다고 전해라INSIGHT FORENSIC
 
보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법Youngjun Chang
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃Kwangyoun Jung
 
안드로이드 기반 SNS 어플리케이션의 코드 변조를 통한 취약점 분석 및 보안 기법 연구
안드로이드 기반 SNS 어플리케이션의 코드 변조를 통한 취약점 분석 및 보안 기법 연구안드로이드 기반 SNS 어플리케이션의 코드 변조를 통한 취약점 분석 및 보안 기법 연구
안드로이드 기반 SNS 어플리케이션의 코드 변조를 통한 취약점 분석 및 보안 기법 연구Sangho LEE
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리Seungyong Lee
 
으리리버싱시즌3
으리리버싱시즌3으리리버싱시즌3
으리리버싱시즌3형석 김
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드중선 곽
 
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2성일 한
 
보안 위협 형태와 악성코드 분석 기법
보안 위협 형태와 악성코드 분석 기법보안 위협 형태와 악성코드 분석 기법
보안 위협 형태와 악성코드 분석 기법Youngjun Chang
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)Jinwook On
 
Du room system_portfolio
Du room system_portfolioDu room system_portfolio
Du room system_portfolio진영 최
 
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기Jaeseung Ha
 
Hackerschool FTZ 문제 풀이
Hackerschool FTZ 문제 풀이Hackerschool FTZ 문제 풀이
Hackerschool FTZ 문제 풀이re4lfl0w
 
1.0데이터 주도적 설계의_마법
1.0데이터 주도적 설계의_마법1.0데이터 주도적 설계의_마법
1.0데이터 주도적 설계의_마법Taeung Ra
 

Similar to 리버싱 실습 보고서 (20)

빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
Light Tutorial Django
Light Tutorial DjangoLight Tutorial Django
Light Tutorial Django
 
김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법김성훈 - 뛰어난 디버거가 되는 방법
김성훈 - 뛰어난 디버거가 되는 방법
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
Bug sense 분석
Bug sense 분석Bug sense 분석
Bug sense 분석
 
(Ficon2016) #2 침해사고 대응, 이렇다고 전해라
(Ficon2016) #2 침해사고 대응, 이렇다고 전해라(Ficon2016) #2 침해사고 대응, 이렇다고 전해라
(Ficon2016) #2 침해사고 대응, 이렇다고 전해라
 
보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법보안 위협과 악성코드 분석 기법
보안 위협과 악성코드 분석 기법
 
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
QnA blog using Django - ORM, 회원가입, 로그인/로그아웃
 
Pe+file+format
Pe+file+formatPe+file+format
Pe+file+format
 
안드로이드 기반 SNS 어플리케이션의 코드 변조를 통한 취약점 분석 및 보안 기법 연구
안드로이드 기반 SNS 어플리케이션의 코드 변조를 통한 취약점 분석 및 보안 기법 연구안드로이드 기반 SNS 어플리케이션의 코드 변조를 통한 취약점 분석 및 보안 기법 연구
안드로이드 기반 SNS 어플리케이션의 코드 변조를 통한 취약점 분석 및 보안 기법 연구
 
리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리리눅스 커널 기초 태스크관리
리눅스 커널 기초 태스크관리
 
으리리버싱시즌3
으리리버싱시즌3으리리버싱시즌3
으리리버싱시즌3
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2Laravel 로 배우는 서버사이드 #2
Laravel 로 배우는 서버사이드 #2
 
보안 위협 형태와 악성코드 분석 기법
보안 위협 형태와 악성코드 분석 기법보안 위협 형태와 악성코드 분석 기법
보안 위협 형태와 악성코드 분석 기법
 
OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)OpenJigWare(V02.00.04)
OpenJigWare(V02.00.04)
 
Du room system_portfolio
Du room system_portfolioDu room system_portfolio
Du room system_portfolio
 
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
 
Hackerschool FTZ 문제 풀이
Hackerschool FTZ 문제 풀이Hackerschool FTZ 문제 풀이
Hackerschool FTZ 문제 풀이
 
1.0데이터 주도적 설계의_마법
1.0데이터 주도적 설계의_마법1.0데이터 주도적 설계의_마법
1.0데이터 주도적 설계의_마법
 

More from Dong-Jin Park

Unionweb프로젝트
Unionweb프로젝트Unionweb프로젝트
Unionweb프로젝트Dong-Jin Park
 
윈도우 커널모드에서의 스레드동기화
윈도우 커널모드에서의 스레드동기화 윈도우 커널모드에서의 스레드동기화
윈도우 커널모드에서의 스레드동기화 Dong-Jin Park
 
윈도우 메모리맵파일
윈도우 메모리맵파일 윈도우 메모리맵파일
윈도우 메모리맵파일 Dong-Jin Park
 
2014 윈도우 메모리구조
2014 윈도우 메모리구조2014 윈도우 메모리구조
2014 윈도우 메모리구조Dong-Jin Park
 
취약점 점검도구 실습 보고서
취약점 점검도구 실습 보고서 취약점 점검도구 실습 보고서
취약점 점검도구 실습 보고서 Dong-Jin Park
 
개인정보보호를 위한 기업
개인정보보호를 위한 기업 개인정보보호를 위한 기업
개인정보보호를 위한 기업 Dong-Jin Park
 
엔터프라이즈 금융 보안 조사 보고서
엔터프라이즈 금융 보안 조사 보고서엔터프라이즈 금융 보안 조사 보고서
엔터프라이즈 금융 보안 조사 보고서Dong-Jin Park
 
파일 암호화 복호화 프로그램 프로젝트
파일 암호화 복호화 프로그램 프로젝트파일 암호화 복호화 프로그램 프로젝트
파일 암호화 복호화 프로그램 프로젝트Dong-Jin Park
 
네트워크 공격 실습 보고서
네트워크 공격 실습 보고서네트워크 공격 실습 보고서
네트워크 공격 실습 보고서Dong-Jin Park
 
솔라리스 OS 로그 분석
솔라리스 OS 로그 분석솔라리스 OS 로그 분석
솔라리스 OS 로그 분석Dong-Jin Park
 

More from Dong-Jin Park (13)

Unionweb프로젝트
Unionweb프로젝트Unionweb프로젝트
Unionweb프로젝트
 
윈도우 커널모드에서의 스레드동기화
윈도우 커널모드에서의 스레드동기화 윈도우 커널모드에서의 스레드동기화
윈도우 커널모드에서의 스레드동기화
 
윈도우 메모리맵파일
윈도우 메모리맵파일 윈도우 메모리맵파일
윈도우 메모리맵파일
 
2014 윈도우 메모리구조
2014 윈도우 메모리구조2014 윈도우 메모리구조
2014 윈도우 메모리구조
 
취약점 점검도구 실습 보고서
취약점 점검도구 실습 보고서 취약점 점검도구 실습 보고서
취약점 점검도구 실습 보고서
 
개인정보보호를 위한 기업
개인정보보호를 위한 기업 개인정보보호를 위한 기업
개인정보보호를 위한 기업
 
엔터프라이즈 금융 보안 조사 보고서
엔터프라이즈 금융 보안 조사 보고서엔터프라이즈 금융 보안 조사 보고서
엔터프라이즈 금융 보안 조사 보고서
 
파일 암호화 복호화 프로그램 프로젝트
파일 암호화 복호화 프로그램 프로젝트파일 암호화 복호화 프로그램 프로젝트
파일 암호화 복호화 프로그램 프로젝트
 
네트워크 공격 실습 보고서
네트워크 공격 실습 보고서네트워크 공격 실습 보고서
네트워크 공격 실습 보고서
 
보안 Vs 성능
보안 Vs 성능보안 Vs 성능
보안 Vs 성능
 
솔라리스 OS 로그 분석
솔라리스 OS 로그 분석솔라리스 OS 로그 분석
솔라리스 OS 로그 분석
 
DB 설계 과제
DB 설계 과제DB 설계 과제
DB 설계 과제
 
Ddos조사
Ddos조사Ddos조사
Ddos조사
 

리버싱 실습 보고서

  • 1. REPORT (중간과제 –리버싱 실습 보고서) 과제점수 : (기한내 제출 : / 내용충실도 : / 내용 논술력 : ) 학 과 : 컴보2A 학 번 : 2013011073 과목명 : 운영체제보안 담당교수 : 박경수교수님 제출자 : 박동진 제출일자 : 2014/04/30
  • 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후킹을 이용한 스텔스 프로세스 같이 끈임없이 생 기는 방어, 공격기법들을 보면 과연 승자는 누구일지 궁금하다
  • 14. - 12 - 4. 참고자료 1. OllyDbg 2.01 버전 압축파일에 포함되어있는 help.pdf 2. 네이버블로그1 3. 필자의 구글문서 4. 네이버블로그2