본문 바로가기
스터디/멘토링

[2020 하반기] 10/31 멘토링 4주차 리버싱

by 맑은청이 2020. 10. 30.
728x90
반응형

리버스 엔지니어링 (Reverse Enginerring RE:역공학)

소위 RCE,RE,역공학, 리버싱 등의 용어를 마구 섞어서 사용합니다.

 

분석방법

1) 정적 분석

실행 X 

말 그대로 파일의 겉모습을 관찰하여 분석하는 방법

파일의 종류/ 크기/ 헤더(PE) 정보/ 내부 문자열/ 실행 압축 여부/ 등록 정보 등의 다양한 내용 확인

디스어셈블러(Disassembler)를 이용하여 내부 코드와 구조 확인 

정적 분석을 통해 얻은 정보는 동적 분석에 참고 자료로 활용 

 

2) 동적 분석 

실행 O

행위 분석하고 디버깅을 통하여 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법

파일, 레지스트리(Registr), 네트워크 등을 관찰하며 행위 분석 

디버거(Debugger)을 통해 프로그램 내부 구조와 동작원리 분석 

 

패치와 크랙

둘 다 메모리의 내용을 변경하는 작업을 패치(Patch) 

크랙(Crack)은 패치와 동일하지만 불법적인 행위

 

리버싱의 묘미!

고수준으로 개발된 파일을 리버싱할 때는 저수준 언어(Assembly)로 변환하여 분석

특출난 리버서는 애플리케이션의 소스코드가 공개되지 않더라 하더라도 실행 파일만 보고 프로그램의 내부 구조 파악

 

 


Hello World! 리버싱 해보기 

 

디버깅 목표 : HelloWorld.exe 실행 파일을 디버깅(Debugging)하여 어셈블리 언어로 변환된 main()함수를 찾아보기

이를 통해 기본저기 디버거의 사용법과 어셈블리의 명령어 공부 

차례로  Code ,Register , Dump, Stack Window

여기서 Dump는 우너하는 memory 주소 위치를 Hex/ASCII/ 유니코드 값으로 표시하고 수정도 가능하다. 

 

EP(EntryPoint)

디버거가 멈춘 곳은 EP 코드로 여기서는 HelloWorld.exe의 실행 시작(004011A0) 이다.

Call 과 JMP가 보인다.

 이는 40270C 주소의 함수를 호출, 40104F 주소로 점프 한다는 의미이다. 

-> "40270C 주소의 함수를 호출(CALL) 한 후 40104F 주소로 점프(JMP) 하라"

 

 

잘 보면 Code Window 는 4가지 파트로 이루어져 있다. 

Address, Instruction(IA32 또는 x86 CPU 명령어) ,Disassembled code, comment 이다. 

 

자 다시 디버깅을 해보자.

목표는 main()함수에 MessageBox() 함수 호출을 확인하는것이다. 

그러기 위해 OllyDbg 기본 명령어를 익혀야한다. 

 

Restart [Ctrl + F2] 다시 처음부터 디버깅 시작

Step Into [F7] 하나의 OP code 실행, 함수 안으로 들어감

Step Over [F8] Step Into 와 동일하지만 함수 안으로 들어가지 않고 실행해버림

Execute till Return [Ctrl+F9] 함수 코드 내에서 RETN 명령어까지 실행(함수 탈출 목적) 

 

EP 코드의 4011A0 주소에서 Step Into[F7] 로 40270C 함수로 들어가자. 

 

보면 주석에 빨간 색 글들이 있다. 이는 코드에서 호출되는 API 함수 이름이다. 원래

4027A1 주소에 RETN 명령어. RETN은 함수의 끝에서 사용되어 이 함수가 호출된 원래 주소쪽으로 되돌아간다. 위 경우 리턴 주소가 4011A5이다.

주석에 보면 API 이름을 볼 수 있는데 호출한 적 없는 API 가 많다 이는 프로그램 자체에서 실행시킨, 우리 소스코드에는 없는 Stub code 이다. 컴파일러의 종류와 버전 별로 달라진다. 지금은 신경 쓰지 않아도 된다.

 

40104F 점프문 따라가기

리턴으로 돌아와 JMP를 실행하면 40104F로 이동한다. 여기서 Stub Code 이다.

 

이 코드를 찾으면 MessageBox()로 main 함수라는 걸 알 수 있다.

이제 조금 더 다양한 디버거 명령어를 배워 보자

 

 

베이스캠프 설치하는 방법

늘 EP 에서 시작하는 건 고된 일이다. '중간 봉우리' - '중간 봉우리2' - ' 정상' 이렇게 가야하듯 베이스 캠프를 설치해야한다. 

 

4가지 방법이 있다. 

1) Goto 

 Goto [Ctrl + G] 로 주소로 이동 후 F4 를 통해서 커서 위치까지 이동한다. 

2) BP

브레이크 포인트 설치 단축키는 [F2] 이다.

브레이크 포인트 목록 단축키는 [ALT+B] 이다. 

BP를 설치하고 목록에서 더블 클릭하면 위치로 간다. 

 

3) 주석 [;]

4) 레이블[:]

 

원하는 코드 빨리 찾아내는 4가지 방법이 이다. 

 

앞에서 우리는 MessageBox() 함수를 찾았다. 여기서 계속 디버깅을 하면 메시지 박스가 출력됩니다. 즉 프로그램의 기능이 명확한 경우에 명령어를 실행하면서 원하는 위치를 찾아가는 거다. 코드크기가 클 경우 적절하지 않지만...

베이스캠프에서부터 코드를 실행해보자

 

Search for - All referenced strings 를 통해 Message box 에 호출되는 문자열을 찾아 함수를 찾을 수 있다. 여기선 "Hello World!" 더블 클릭하면 갈 수 있다. 

참고로 4092A0에 주소에 있는 문자열을 확인해봅시다. Ctrl +G를 통해 찾아가자.

덤프 윈도우에서도 찾아보자

 

API 검색 방법 - 호출 코드 BP

Windows 프로그래밍에서 모니터 화면에 뭔가를 출력하려면 Win32 API를 사용하여 OS 에게 화면 출력을 요청해야 한다. 프로그램을 실행 시켰을때 박스가 출력된 거를 분명 user32.MessageBoxW() API를 사용했다는 걸 알 수 있다.

OllyDbg의 사전분석기능 중에는 문자열 뿐만 아니라 사용되는 API 함수를 뽑아내는 기능이 있다. 

API 호출 목록을 보고 싶을 때는 'All intermodular calls' 명령을 사용하면 된다. 역시 더블 클릭을 하면 위치로 갈 수 있다. 

API 검색 방법 - API 코드에 직접 BP

OllyDbg에 모든 실팽 하일에 대해 API 함수 호출 목록을 추출할 수 있는 건 아니다. 실행파일을 압축해버리면 파일 구조가 변경되어 OllyDbg에서 API 호출 목록이 보이지 않는다.(디버깅도 매우 어려워진다.) 이럴때는 프로세스 메모리에 로딩된 라이브러리(DLL 코드) 에 직접 BP를 걸어야한다. 

API함수는 OS에서 제공한 함수고 실제로 API 는 다음과 같이 윈도우 폴더에 dll 이 있는 걸 볼 수 있다.

MessageBoxW() 는 kernel32 에 있다. 

다시 말하지만 어떤 프로그램이 의미 있는 일을 할려면 반드시 OS 에 제공된 API를 사용해서 OS 에 요청을 해야하고 API가 실제 구현된 시스템 DLL 파일들은 우리 프로그램의 프로세스 메모리에 로딩되어야한다. 

 

OllyDbg 에서 확인해보자

View - Memory 메뉴 [Alt+M]

 

USER32 라이브러리가 로딩되어 있는 메모리 영역을 확인할 수 있다. 

OLLYDBG의 또다른 기본 해석은 프로세스 실행을 위해 같이 로딩된 시스템 DLL 파일이 제공하는 모든 API 목록을 보여준다. 'Name in all modules'명령을 사용하면 된다. 

Search for - Names 

sort by - Name

바로 Messagebox를 치면 자연스럽게 찾아진다. 

 

 

시간되면 써니나타스 9번 문제 풀어보기

728x90
반응형