본문 바로가기

Reverse engineering/올리디버그사용법

올리디버그를 시작하기전에 개념을 정립해보자 꼭!

이 글은 아담님에 블로그에서 퍼온것으로써 아주 쉽게 풀어주셨습니다
조금만 생각해보면 아주 쉽게 이해될수있으며 꼭 알고 가야할것입니다.



전문 지식을 통한 게시물이 아닌 작성자가 임의로 작성한 글입니다.

모자른 부분이나 잘못된 부분을 지적해 주시면 감사하겠습니다.

 

저번에는 음.. 일괄적으로 패치라고 하겠다.

패치의 종류와 뜻을 알아봤으므로

이번에는 자주 쓰이는 용어와 뜻을 알아보자~

 

Packing

패킹(packing)

 [명사][하다형 타동사]
1. 짐을 꾸림. 포장(包裝).
2. 화물이 상하지 않도록 포장 속에 채워 넣는 물건.
3. 파이프의 이음매나 용기의 접합면 따위에 내용물이 새지 않도록 끼우는 재료.

 

사전에 나온 뜻이다.

다시 다음 IT사전을 찾아 보았다.

 

패킹[packing] 

설명
①몇 개의 작은 필드를 하나의 큰 필드로 결합하는 것.
②기억 장소를 절약하기 위해서 2개 이상의 정보 단위를 하나의 물리적 단위로 결합하는 것.
③데이터나 공백을 부호화하는 방법을 바꿈으로써 정보를 저장하는 데 필요한 기억 공간을 줄이는 절차.

 

여기서 3번의 뜻과 가장 흡사하다고 보면 된다.

무슨 뜻일까?

예를 들어보자.

 

EX>커다란 유리컵에 가득 스폰지볼이 들어있다.

  이를 위에서 아래로 꾸욱 누르면 어떻게 될까?

 

스폰지볼의 부피는 줄어들고 질량은 그대로가 된다.

왜? 질량이야 어차피 스폰지볼의 갯수등은 똑같지만 누름으로써 윗부분에

공간이 생기기 때문이다. 결국 이말은 밀도가 커진다는 말과 똑같다.

커다란 유리컵 전체를 다 차지하던 부피가 꾸욱 누르자(pressing)

부피가 줄어들었다.

 

여기서의 pressing이 바로 패킹에 해당된다.

불필요한 공백공간등을 줄이고 코드를 암호화시켜서,, 한마디로 짜부시켜서

공간을 최대한 줄이는 것이다.

결국 기능상으로는 패킹과 압축이 동일하다고 볼 수도 있다.

그렇다면 차이점은 무엇일까?

 

zip, alz, rar등의 압축방식은 파일이나 폴더등을 압축하고

사용시에는 압축을 해제한뒤에 사용한다.

결국 실행시에는 원래의 부피대로 실행된다.

 

그러나 패킹은 압축이 된 체로 실행된다.

한마디로 630kb짜리의 파일이 압축되어 400kb가 되었다고 쳤을때,

전자의 압축방식은 다시 630kb로 압축을 풀어서 실행시키지만

패킹은 400kb를 그대로 실행시킨다는 뜻이다.

물론 실행시키는 것이니만큼 폴더나 대단위패킹은 불가능하다.

 

지금까지의 뜻은 패킹을 하는 1번째 목적이었다.

그럼 두번째 목적은?

 

바로 코드의 암호화이다.

스폰지공을 압축하면 원래의 동그란 구형태를 알아볼 수 없다.

코드도 마찬가지다. 압축을 했으니 코드끼리 섞인다고 생각하면 쉽다.

이 코드를 봐서는 원래의 코드를 찾기 힘들다.

 

그럼 이제 패킹을 어떻게 하느냐를 알아볼까?

패킹을 해주는 프로그램을 이용하면 된다.

가장 많이 쓰이는 패킹프로그램은 UPX이다.

그외에도 네오라이트, PEspin등등 여러가지가 있다.

 

이제 마지막. 암호화된 코드를 다시 복호화할 수 없을까?

당연히 있다. 방법은 두가지가 있다.

첫번째 방법은 언패킹 프로그램을 사용하는 방법과, MUP(Manual UnPacking)

이다. MUP는 설명하자면 기므로 패스

 

Dump

덤프[dump]

 

설명
프로그램의 디버깅이나 데이터의 검사를 위해 기억 장치나 파일 내용의 전체 또는 일부를 행 인쇄기에 출력하는 것. 자기 코어의 내용을 추출하는 코어 덤프, 자기 테이프의 내용을 추출하는 테이프 덤프 등이 있다.

 

다음 IT사전에서 발췌한 것이다.

저 말 그대로다.

우리가 사용할 디버그 프로그램에서 디버깅한 프로그램을 인쇄시키는 것이다.

여기서 인쇄란, 프린터를 이용한 인쇄가 아니라 디스어셈블러등의 프로그램으로

볼 수 있도록 인쇄하는 것이다.

 

Conditional, Unconditional Jump

컨디셔널, 언컨디셔널 점프, 즉 분기(分基)라는 것은

앞서 용어설명1에서 말한바 있듯이 가장 많이 보게될 어셈구문 점프, 콜, 무브, 푸쉬중에서

점프에 해당한다.

어느 한 지점을 기점으로하여 양갈래로 나뉘는 분기는 어셈의 특성상 위에서 아래로 내려가는

한 방향밖에 없기 때문에 분기도 한줄에 표시한다.

예를 들어보자.

   1

   2

┌3<:~ 분기(if yes = 6)

│4

│5

└6

   7

   8

   9

   0

1부터 0까지 가는게 위의 숫자들의 목적이다.

그런데 3번에서 만약 답이 예일 경우 6으로 간다고 했다.

그럼 아니라면?

그냥 무시하고 4, 5, 6, 7... 이런 식으로 간다.

 

이렇게 어셈은 분기를 한줄에 만들고 있다.

보통은 분기점위에 비교문(cmp)가 있다.

예를 들자면,, 비교해서 같으면 6으로 다르면 그냥 아래로

이런식이다.

 

지금은 잘 이해가 안가더라도 하다보면 알게될 것이다.

 

NOP

무연산 명령어(No operation)

무동작 명령어. 어떤 조작이나 연산을 지시하는 것이 아니라, 컴퓨터로 하여금 다음에 실행해야 할 명령으로 진행할 것을 표시하는 명령어이다.

 

한마디로 아무것도 하지 않는 행위이다.

물론 아무런 곳에나 쓰는게 아니다.

'''':....:'''':....:'''':....:'''':....:'''':....:'''':....:'''':....:'''':....:'''':....:'''':....:

위의 문자처럼 코드가 진행된다고 생각해보자.

아래로 치우친것은 NOP이고 위로 올라가져 있는 것은 어떤 행위, 연산을 한다고 봤을때.

행위, 연산을 하는 부분을 NOP했다고 생각해보자.

'''':....:'''':....:'''':....:'''':....:....:....:'''':....:'''':....:'''':....:'''':....:'''':....:

             (       )

괄호 윗부분을 보면 정상적으로 위로 가야 할 코드가 끊겼다.

흐르는 물결처럼 가는 코드가 저렇게 끊기면 제대로 된 실행이 되겠는가.

물론 에러가 난다.

그러므로 아무리 무연산명령어라도 아무 곳에나 쓰는게 아니다.

 

Algorithm

알고리즘은 고등학교 이과생이 수학시간에 처음 접하게 된다.

알고리즘이 무엇인가?


이게 알고리즘이다. 약간 깨진듯 하지만 보는데는 무방할듯 하다.

자 이제 해석해보자.

1. 시작!!

2. a에 1을 대입한다, n에 1을 대입한다.(보통 n은 횟수)

3. a에 원래 a에 2배를 한뒤 5를 더한다.(2×1+5 = 7) 그러므로 이 행위 뒤에는 a가 1에서 7로 바뀐다.

4. n에 1을 더한다.(이로인해 n은 1에서 2로 바뀐다. - 횟수)

5. 이때의 행위로 봤을때 n은 4인가? 맞다면 내려가고 아니라면 다시 올라간다.

6. 아니니 올라와서 다시 3,4번을 반복한다. (이때 a는 7에서 19, n은 2에서 3)

7. 이렇게 n이 4가 될때까지 하고나서 a를 인쇄하면 끝나는 알고리즘이다.

인쇄되는 값은 43이다.

 

그런데 이 알고리즘은 5번에서 봤을때 n은 4인가? 하고 비교를 한다.

그럼 바보가 아니어서야 두가지 경우가 나온다는걸 알 수 있다.

어셈에서는 이 두가지 경우를 한줄에 표현한다.

과연 어떻게 표현할까?

이런식으로 표현된다.

저것을 각종 명령어로 바꾼게 어셈블리어가 되는 것이다.

좀더 설명하면 코드를 써야되므로 코드가 직접적으로 나오는 강좌는

크랙등을 보면서 하겠다.