리버싱

2일차. 올리디버거 설정

컴공 2013. 4. 9. 12:54
반응형

올리디버거에서 어셈블리어 창에 옆의 opcode 부분에 "[" 모양으로 이어진 부분은 하나의 함수를 의미한다.
그리고 어셈블리어 부분 옆에 나타난 부분은 주석(;이나 더블클릭)을 남기거나 call, function 등의 호출 함수가 나타난다.

# C++ 릴리즈 모드(release mode)

project의 settings에 들어가면 다음과 같이 모드를 설정할 수 있다.
release모드에서 출판시 설정값을 수정할 수 있다.



# 덧셈 리버싱하기.
[소스]
int n1 = 12
int n2 = 13
int n3 = n1 + n2;

# ollydbg 리버싱하기
F2로 브레이크 포인트를 설정한 후 F9번으로 breakpoint까지 진행시킨다. (kernel32를 건너 뛰기 위함)
F8을 누르면 한줄씩 진행할 수 있다.



# 초기 메모리 세팅
프로그램이 진행되면, 변수 생성을 위해 공간을 할당한다.
EBP(실행할 위치) -> 이전 ESP가 있던 자리로
ESP(메모리 현재위치) -> 확보한 메모리 주소가 있는 자리로

PUSH EBP  // EBP를 stack에 삽입한다.
MOV EBP, ESP  // EBP를 ESP가 있던 stack pointer로 이동시킨다.
SUB ESP, 0C   // 12bit의 공간을 확보한다. int * 3개와 동일한 공간


다음과 같이하면 STACK 위치의 메모리 주소부분에서 EBP를 기준으로 표기된 것을 볼 수 있다.



오른쪽에 보이는 것과 같이 EBP가 stack으로 push되면 EBP를 ESP가 있는 장소로 옮긴다.
(위쪽에 원래 있던 내용이 있다. 그 이유는 윈도우는 위에서부터 아래로 메모리 내용이 추가되기 떄문이다.)
SUB로 메모리 공간을 확보한다. (0c 이므로 총 12bit의 공간을 확보했다)


mov dword PTR SS: [EBP-C].0C
DWORD (4byte) 크기의 스택저장공간(stack segment)에 0c(12를 삽입한다)

mov dword PTR SS: [EBP-C].0D
DWORD (4byte) 크기의 스택저장공간(stack segment)에 0c(13를 삽입한다)

MOV EAX, DWORD PTR SS:[EBP-C]
EBP-C에 있는 값을 EAX에 복사한다.

ADD EAX,  DWORD PTR SS:[EBP-4]
EBP-4에 있는 값을 EAX에 더한다.

mov dword PTR SS: [EBP-8].EAX
EBP-8의 위치에 EAX를 복사한다. // 결과적으로 25라는 값을 얻었다.

# 더하기 리버싱을 응용한 나머지 리버싱



보이는 바와 같이 나누기, 곱하기는 초기 주어진 값보다 연산으로 얻어진 값이 저장될 공간이 더 크기에
CDQ를 통해 DWORD를 QWORD로 바꿔주어야 한다.
그 외에는 위에 보이는 것과 같이 ADD를 IDIV로 바꾸어 연산한다. IDIV는 DIV에 부호가 붙은 연산기호이다.

반응형

'리버싱' 카테고리의 다른 글

5일차, 점프, Argument(arguv, arguv)  (0) 2013.04.13
4일차 역공학, 어셈 & register & stack & dumpwindow에서 내용수정  (0) 2013.04.11
3일차 뺏셈` ~ 배열  (0) 2013.04.10
1일차. 어셈블리어  (0) 2013.04.08
1일차 리버싱  (0) 2013.04.08