관리 메뉴

소나기

디버거 본문

연구/리버싱

디버거

moyoung 2012. 8. 25. 17:40

분석을 할 때에는 디버깅 프로그램을 다양하게 사용하여 분석을 함.

windebger : 윈도우즈 커널 디버깅 프로그램. 윈도우에서 잘 됨


설정 : Filr > simbol file path

설정 집어 넣고..


레지스터 가 무었이냐 ? CPU 가 사용하고 있는 임시저장 형태입니다.


그 밖에 뭐가 있죠? 레지스터, 메모리, HDD  (빠른 순서) CPU입장에서 가까운 순서 .

용량은 반대인 것. 하드의 경우는 가장 늦게 나온 저장장치이다. 메모리가 너무 비쌋기 때문에 저렴한 하드를 끼자. 해서 나온 것이 HDD

레지스터 32bit -> 4byte

32비트에서는 4기가 이상은 사용 불가. 4바이트에서 표현가능한 최고 숫자가 4기가입니다.

4기가 이상이 되면 자신이 표현하 수 있는 단위에서 벗어나 버리기 때문에 0으로 만들어 버립니다.

시스템 공부 :  많은 것 을 공부해야 합니다. 가장 일반적인 것

레지스터의 종류가 굉장히 많습니다.

 깊이 들어가면 꼭 접해야 함

그중에서

General Register :

  1. EAX : Accumulator
  2. EBX : Base
  3. ECX : Counter
  4. EDX : Data

앞뒤문맥을 보고 레지스터의 내용을 파악해야 합니다. 위 대로 암기하면 안됨,

해당 레지스터가 어떤 식으로 사용이 되었는지 봐야 한다.


Pointer Register

  1. EBP (base pointer)
  2. ESP (stack pointer)
  3. EIP (instruction pointer)
  4. EDI (destinntion index)
  5. ESI (source index) 


메모리의 구조?


text : 실행코드, 실행과 읽기전용 (데이타 쓰기 불가)



data :실행에 필요한 글로벌 변수, 힙 할당된 것등 을 넣고



stack : 함수가 사용하게 되는 지역변수들의 공간입니다.




프로세스 하나당 4기가 바이트 씩 할당이 됨

가상메모리 기법



리눅스에서는 상위 1기가를 커널에서 사용 ,3기가를 유저가 사용(이게 메모리)

윈도우에서는 각 2기가씩 나눈다. 커널 2기가, 유저 2기가 (메모리)

바로 이 메모리 영역을 3가지로 나누어 관리 text, data, stack 에 주소를 쓰고 지울 뿐

왜 나누냐?  비슷한 속성을 가진 것 을 묶어 놓은 것입니다.

메모리 마다 속성이 있다


자 그럼 이제 우리가 볼 것은 스택이라는 메모리인데

스택에 데이타를 넣는 명령 : Push, 빼는 명령 : POP 

스택에 저장된 데이타 항목들 중에 먼저 삽입된 것은 나중에 삭제되고, 나중에 삽입된 것이 먼저 삭제된다. 그래서 스택을 후입 선출 리스트(Last- In-First-Out List)라고 부른다. 선입 선출법을 사용하는 와는 상반된 성질을 가진다

  • 스택은 기저(base)로부터 데이타 항목들을 차례로 쌓아올린 모양을 가진다.
  • 삽입과 삭제는 현재 저장된 최상위 항목이 위치한 top 에서만 일어난다.
  • top 위치는 "스택 포인터"라는 지시자가 가리킨다.
  • 스택 포인터는 스택 기저에서 시작하여 항목이 삽입되면 하나 증가하고, 삭제되면 하나 감소한다.
  • 스택에는 한계가 있어서 그 한계를 초과하도록 삽입할 수 없다.


스택포인터의 위치가 움직이면서 스택에 데이타를 넣게 된다.

파일:Data stack.svg


스택 프레임을 구성하는 것을 함수 프롤로그라고 함.


함수는 프롤로그와 에필로그를 가진다.
리눅스 7.2에서 함수의 프롤로그와 에필로그를 보자

(gdb) disas main
Dump of assembler code for function main:
0x8048460 <main>:       push   %ebp
0x8048461 <main+1>:     mov    %esp,%ebp
0x8048463 <main+3>:     sub    $0x8,%esp
0x8048466 <main+6>:     sub    $0xc,%esp
0x8048469 <main+9>:     push   $0x80484e8
0x804846e <main+14>:    call   0x804833c <printf>
0x8048473 <main+19>:    add    $0x10,%esp
0x8048476 <main+22>:    mov    $0x0,%eax
0x804847b <main+27>:    leave
0x804847c <main+28>:    ret

여기서 함수의 프롤로그는 아래와 같고
0x8048460 <main>:       push   %ebp
0x8048461 <main+1>:     mov    %esp,%ebp

에필로그는 아래와 같다.
0x804847b <main+27>:    leave
0x804847c <main+28>:    ret

프롤로그는 이전 함수의 ebp(base point)를 저장하고 현재의 esp를 base point(ebp)로 잡는다.
함수의 모든 역할이 끝이나면 에필로그인 leave와 ret가 호출된다.

leave는
mov ebp, esp
pop ebp
와 같다. 역할은 ebp의 값(주소)을 다시 esp에 저장하고 프롤로그에서 저장하였던 ebp값을 pop하여 ebp에 저장한다. 결과적으로 eip에는 ebp+4 주소값에 있는 값이 들어간다.
ret는 esp를 4 증가 시킨다. 이유는 call 명령어가 esp를 4 감소 시키기 때문이다.

이와 같은 과정을 거치면 함수 호출 이전의 esp, ebp로 되돌아 간다.




프로그램 분석 방법

 


컴파일러 (기계가 알아볼수 있는 언어로 바꾸어주는 번역작업 _ 01010101)

c : 사람이 알아볼 수 있는

java


실행파일 : 바이너리


아스키 코드 범위 내에 있는 코드 값.. 실행파일도 나름대로의 실행파일 구조를 갖고 있다

윈도우 시스템 : PE구조 , 윈도우 API 두개는 반드시 공부 해 두어야 합니다


한번 컴파일 된 파일은 복구 불가능합니다 EXE-> 복구 불가

JAVA는 복구하면 가능함. APK

악성코드 분석 : c코드로 복구가 불가능 하기 때문에

기계어를 어셈블리 언어로 번역하야 합니다,

IDA라고 바이너리를 c코드로 복구하는 툴을 만들었지만 완벽하지는 않음.

소프트웨어가 1천만원이 넘어간다 그래서 헐


디스어셈블리 코드를 보고 직접 분석을 해야 합니다

실제 악성코드나 어셈블리는 어렵다

떨어트려서 분리시켜서 뭉텅뭉텅. 편하게


바이너리 코드를 보고 c언어로 복구하는 훈련을 한다.
















'연구 > 리버싱' 카테고리의 다른 글

리버싱에 필요한 지식  (0) 2013.02.18
유용한 사이트 모음  (0) 2012.08.25
리버싱공부에 도움이 되는 자료 입니다.  (0) 2012.08.25
리버싱 보다는 BOF  (0) 2012.08.25
리버싱 특강 1일차  (0) 2012.08.25
Comments