본문 바로가기
해킹 맛보기

엔지니어링 스터디1

by paysmile 2016. 10. 11.


리버스 엔지니어링

우리말로 역공학이라는 의미다. 공학이 과학적 원리, 지식, 도구를 활용해 새로운 제품, 도구를 만드는 것이라면, 리버스 엔지니어링은 만들어진 제품, 도구를 분해해서 분석하거나 재조합하는 것이다. 줄여서 '리버싱'이라고도 사용.


리버싱 사용 사례
-컴퓨터 원리와 구조 이해
-프로그램 유지보수(실무에서 사용 중에 발견되는 버그를 리버싱으로 쉽게 찾는 경우가 많음)
-개발에 활용(컴팩이 리버싱을 사용해 IBM의 바이오소스를 분석해 똑같은 기능을 가진 바이오소스 개발해냄)
-보안 점검 및 취약점( 소스코드가 없는 프로그램의 버그를 정확히 알기 위해서는 리버싱 필요)
-악성코드 분석

기초 지식

1.중앙연산처리장치
  =>CPU는 외부로부터 명령어를 입력받아 해석하고 연산해서 실행하는 역할을 함
-CPU내부에서 임시 기억 장치인 레지스터 사용&주기억 장치인 메모리 사용
-주기억 장치에 해당하는 메모리>RAM(휘발성 메모리)=>컴퓨터는 저장된 정보를 계속 유지하는 비휘발성 메모리인 하드디스크를 사용
*레지스터는 속도가 가장 빠르지만 용량은 제일 적고, 하드디스크는 속도가 가장 느리지만 제일 많은 용량 가짐.

2.레지스터
 
-범용 레지스터(32비트)

>다양한 목적으로 사용

*EAX: 함수의 리턴값을 저장하거나 산술 연산에 사용

*EBX: 특정 주소를 지정하기 위해 사용

*ECX: 반복적인 명령어 수행 시 횟수 저장에 사용

*EDX: 큰 수의 곱셈, 나눗셈 등의 연산시 EAX 레지스터와 함께 사용

*ESI: 문자열 복사, 비교 시 소스 문자열 주소 저장에사용

*EDI: 문자열 복사, 비교시 목적지 문자열 주소 저장에 사용

*ESP: 명령어 수행 시 스택의 위치 저장에 사용

*EBP: 함수 인자, 스택 변수에 접근하기 위해 사용


-세그먼트 레지스터

>메모리에 저장되어 있는 특정 세그먼트를 가리킴

*CS레지스터는 코드 세그먼트를, SS레지스터는 스택 세그먼트를, DS,ES,FS,GS는 데이터 세그먼트를 가리킴.

*EFLAGS레지스터(프로그램의 현재 상태, 분기문의 조건등을 검사하는 데 사용되는 플래그들을 모아놓은 레지스터)

*EIP 레지스터(CPU가 다음에 수행해야 할 명령어를 담은 메모리의 주소를 저장)

3.메모리 구조

-프로그램이 실행되면 각각의 세그먼트 단위로 묶어 메모리에 저장

1) 코드 세그먼트

-컴퓨터가 수생할 수 있는 명령어들이 저장되어 있는 메모리

>일반적인 프로그램에서 코드 세그먼트에 저장되어 있는 내용은 변경 x

>패킹, 가상머신 등이 적용된 프로그램에서 코드 세그먼트의 내용은 변경

*패킹:데이터를 팩(pack)하는 조작

*가상머신: 컴퓨팅 환경을 소프트웨어로 구현한 것, 즉 컴퓨터 를 에뮬레이션 하는 소프트웨어

2)스택 세그먼트

-현재 수행되고 있는 프로그램의 지역 변수와 함수 호출 인자를 저장하는 메모리 영역.

*스택의 현재 위치는 ESP레지스터가 가리키고 있으며, LIFO 구조를 가진다.



3) 데이터 세그먼트
-전역 변수와 힙을 저장하는 메모리 영억.
*힙: 큰 크기의 데이터를 담고자 동적으로 할당하는 메모리 공간, 힙은 자신이 필요한 만큼 메모리를 할당해 쓸 수 있지만, 할당할 수 있는 메모리에 한계가 있기 때문에 쓰지 않는 메모리는 직접 해제해야한다는 단점

4. 어셈블리어 VS. C언어

-어셈블리어
 기계어 코드를 사람이 인식할 수 있도록 1:1로 대응시키는 컴퓨터의 로우 레벨언어
*프로세서에 따라 기계어가 달라지며 이에 따라 어셈블리어도 변함
-C언어
  프로세서가 다르더라도 같은 소스 코드를 해당 프로세서에 컴파일해 사용할 수 있는 하이 레벨 언어

5. 컴파일, 디컴파일

바이너리 데이터로 이뤄진 실행 파일을 만들기 위해서는 컴파일 과정을 거쳐야함
-리버싱은 컴파일 과정의 역순인 디컴파일 과정을 수행해야함

-컴파일 과정
1) 소스코드 작성을 통해 실행 파일을 만듬
2)컴파일러에 의해 입력파일을 어셈블리 파일로 만드는 컴파일을 실행
3)어셈블리 파일은 다시 어셈블러에 의해 오브젝트 파일 생성
4)오브젝트 파일은 마지막으로 링커에 의해 각종 라이브러리 함수와 연결되어 최종 실행 파일이 완성

*올리디버거는 어셈블러의 반대 과정을 수행하는 디스어셈블러를 내장하고 있어 실행 파일의 기계어 코드를 어셈블리어로 표현해줌-> 사용자가 어셈블리어를  C언어로!!

6.바이트 오더

>컴퓨터에서 데이터가 바이트 단위로 메모리에 저장되는 순서

1) 빅 인디안 방식

큰 단위의 바이트가 앞에 옴

2)리틀 인디안 방식

작은 단위의 바이트가 앞에 옴


7. 디버깅

>컴퓨터 프로그램의 버그를 찾아서 제거하는 일련의 과정

올리디버거로 분석할 코드에 브레이크 포인트를 설정해 프로그램 실행을 중지 -> 레지스터, 메모리에 저장된 값을 살펴보며 재실행하거나, 코드를 단계적으로 실행하는 과정으로 디버깅 실행

올리디버거 영역


'해킹 맛보기' 카테고리의 다른 글

메모리 오염 공격  (0) 2016.12.26
명령어 삽입공격&레이스 컨디션  (0) 2016.11.22
웹 해킹  (0) 2016.11.01
리버싱 스터디3  (0) 2016.10.11
리버싱 스터디2  (0) 2016.10.11