YeoPEVA

리버싱 핵심 원리 챕터1,2장 필기 및 정리 본문

#Reversing/Reversing - 정리

리버싱 핵심 원리 챕터1,2장 필기 및 정리

YeoPEVA 2017. 7. 21. 02:01

1단원 – 리버싱 스토리

 

리버스 엔지니어링이란? -> 역공학이라고 하기도 함, 물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을

분석하여 그 원리를 이해, 단점을 보완, 새로운 아이디어를 추가하는 일련의 작업이라고 함.

 

리버스 코드 엔지니어링 -> 소프트웨어 분야의 리버스 엔지니어링 | 용어 통일이 정확하게 안되있음.

그래서 역공학이라 하기도 하고.. RCE,RE, 리버싱 등.. 뭐 그렇게 쓰입니다.

이 책에서는 RCE, RE or 리버싱이라 표현 | 분석, 상세 분석 용어 사용

소프트웨어를 리버싱 관점에서 상세하게 분석한다는 뜻임.

 

분석 방법..?

정적 분석

-> 겉 모습을 관찰하여 분석하는 방법임. [직접적인 실행은 하지 않음.]

파일의 종류, 크기, 헤더정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보

디지털 인증서 등의 다양한 내용을 확인함. | 디스어셈블러 사용 내부 코드와 그 구조 확인 또한

정적 분석에 들어갈 수 있음. [동적 분석에 좋은 자료가 됨]

 

동적 분석

-> 파일을 직접 실행시켜 그 행위를 분석, 디버깅을 통하여 코드 흐름과 메모리 상태 등을 자세히 살펴봄

파일 | 레지스터리 | 네트워크 등을 관찰하면서 프로그램의 행위를 분석, 또한 디버거를 이용해

프로그램 내부 구조와 동작 원리를 분석함.

 

정적 분석 [구조와 동작 원리 예측] -> 예상과 비교하면서 동적 분석 [효과적인 분석이 가능하다.]

 

소스코드, Hex 코드, 어셈블리 코드

리버싱 취급 대상? -> exe 와 같은 실행파일이 대부분 | 소스코드 없이 실행 파일의 바이너리 자체 분석

고로.. 소스코드와 바이너리 코드 사이의 관계를 살펴 보는 것이 리버싱을 이해 할시에 도움이 됨

 

소스 코드 [코드 작성, 빌드 -> 실행파일 등장]

Hex Code [ 실행 파일 – [컴퓨터 이해 가능한 2진수 ..인데 어떻게 이걸 읽어?] -> [Hex 형식 변화]

-> 헥사 에디터 사용하여 hex 형식으로 봄 [아 편하당]

어셈블리 코드 -> Hex code는 편해지긴 하지만, 사람이 봐도 뭔 소리인지 모르는 경우가 있음 [..]

그래서 더 이해가 쉬운 어셈블리 형태로 보기 위해 디버거로 열어서 어셈블리 형태로

보는 것이 가능하다. [Hex code -> 디스어셈블 과정 -> 어셈블리 코드 등장!]

일반적으로 이러한 어셈블리 코드를 분석하는데 ARM 같이 환경에 따라 또 쓰이는 것이 다르고

처음에 보면 이게 뭔 소리인지도 몰랑 으히히히힠키히

 

패치와 크랙

패치 -> 프로그램 파일 or 실행 중인 프로세스 메모리 내용 변경을 패치라고 함.

크랙 -> 패치와 같은 일이지만 비 도덕적, 비합법적인 경우를 말함.

이런 식으로 리버싱은 양날의 칼이 될 수 있음. [피해 입힐지도..] 그러니 주의합시다!

 

준비물 -> 목표,열정,구글 그리고 딴딴한 멘탈

 

목표 -> 리버싱을 왜 배워야 하는지에 대한 대답 [배워서 랜섬웨어 분석 하고 싶어요.]

자신만의 목표를 설정해서 맞춰서 하는게  역시 빠른편이다.

 

열정 -> 목표를 향해 끈기 있게 나아갈 수 있게 해주는 힘! [열정!]

           열정만 가지고 있으면, 아무리 넘어져도 괜찮다! 다시 시도하다보면 전문가가 될 수 있다!

 

구글 -> 뭔 말이 필요한가, 최고의 교수이자, 선생이자, 만물 도서관인 구글이다!

          

방해물? -> 과욕, 조급함

과욕 -> 생소한 개념이 많아, 한번에 다 이해하고자 하면 힘듬, 어느정도에서 만족 필요

조급함 -> 공부할 내용 넘나 많음 [OS 이해, 시스템 프로그래밍, API, 어셈블리어, 함수 호출 구조,

             PE 파일, 언패킹 | 패킹 등 많으니까..] 천천히 해결하자.

 

리버싱의 묘오오미?

-> 고수준 언어 [C,C++,VB ETC]를 리버싱 할 경우 저수준 언어인 어셈블리로 바꾸어 분석함.

고로, 소스코드 공개는 안했지만, 실력 있는 리버서에게는 그냥 내부 구조가 보임. [히읽]

한마디로 소스코드가 일부 사람에게는 그냥 보임 [ㅇㅁㅇ?]

 

묘미를 느껴봅시다!


2단원 


 

F7 – 하나의 OP code 실행 [CALL – 코드 내부]

F8 – 하나의 OP code 실행 [코드 내부 x | 함수 자체 실행]

Ctrl + F2 – 다시 처음부터 디버깅 시작 [디버깅 당하는 프로세스를 종료하고 재실행]

Ctrl + G – 원하는 주소를 찾아감 [코드를 확인할 때 사용 | 실행 x]

F9 – 실행 [BP 있을 경우, BP 그곳에서 실행 정지]

Ctrl + F9 – 함수 코드 내에서 RETN 명령어까지 실행 [함수 탈출시 사용]

F4 – 커서 위치까지 실행 [디버깅 하고 싶은 주소까지 바로 이동]  | BP + F9 라 생각하면 편함

 

; - 코맨트 추가 [주석이라 생각하면 편할 듯]

마우스 메뉴 Search for -> user-defined comment – 사용자가 입력한 코맨트 목록 확인

 

: - 라벨 추가 [label]

마우스 메뉴 Search for -> defined label – 사용자가 입력한 Label 목록 확인

 

F2 – 브레이크 포인트 설정 및 해제

마우스 메뉴 Search for -> All referenced text strings – 코드에서 참조되는 문자열 보기

마우스 메뉴 Search for -> All intermodular calls – 코드에서 호출되는 모든 API 함수 보기

마우스 메뉴 Search for -> All intermodules – 모든 API 함수 보기

Ctrl + E – 데이터 편집

스페이스 바 어셈블리 코드 작성

마우스 메뉴 Copy to executable file – 파일의 복사본 생성

 

 

 

기본 어셈블리 명령어들

 

CALL xxxx– 함수 호출 [xxxx 주소 함수]

JMP xxxx – 점프 [xxxx 주소로]

PUSH xxxx – 스택에 [xxxx 으로 저장]

RETN – 스택에 저장된 복귀 주소로 점프

 

프로세스 data code 패치 -> Edit data Assemble 이용 바람

 

VA [Virtual Address] – 프로세스 가상 메모리

OP code – CPU 명령어 [바이트 code]

PE[Portable Executable] – windows 실행 파일 [EXE,DLL 등등..]