리버싱

4일차 역공학, 어셈 & register & stack & dumpwindow에서 내용수정

컴공 2013. 4. 11. 12:09
반응형

배열은 더블포인터

배열은 포인터이다.
결국 arr[10]과 같이 포인터가 포인터의 내용을 담고 있다면 이것은 더블 포인터가 된다.(double pointer)
int a = 1;
int *ptr = &a;
int **double_ptr = &ptr;

double_ptr 안에 있는 내용은 ptr을 가리키는 주소가 있고, ptr에는 num을 가리키는 주소가 있다.


5번 포인터

 int n = 7;
 int *p = &n;
 int n2 = n + *p;

PUSH EBP

MOV EBP,ESP

SUB ESP,0C

MOV DWORD PTR SS:[EBP-C],7           ;  int EBP_C = 7;

LEA EAX,DWORD PTR SS:[EBP-C]

MOV DWORD PTR SS:[EBP-4],EAX         ;  EBP_4 = &EBP_C;

MOV ECX,DWORD PTR SS:[EBP-4]

MOV EDX,DWORD PTR SS:[EBP-C]

ADD EDX,DWORD PTR DS:[ECX]


6번 배열에 있는 특정 포인터 값 선택.

char arr[24]="ITBANK MULTICAMPUS";
char *p;
int n;
p=arr;
n=*(p+5); //더블 포인터와 비슷하다.
MessageBox(NULL, "Count of Variable?", "ITBANK", MB_OK);
return 0; 

SUB ESP,1C

MOV EAX,DWORD PTR DS:[405030]

MOV DWORD PTR SS:[EBP-18],EAX

MOV ECX,DWORD PTR DS:[405034]

MOV DWORD PTR SS:[EBP-14],ECX

MOV EDX,DWORD PTR DS:[405038]

MOV DWORD PTR SS:[EBP-10],EDX

MOV EAX,DWORD PTR DS:[40503C]

MOV DWORD PTR SS:[EBP-C],EAX

MOV CX,WORD PTR DS:[405040]

MOV WORD PTR SS:[EBP-8],CX

MOV DL,BYTE PTR DS:[405042]

MOV BYTE PTR SS:[EBP-6],DL

XOR EAX,EAX

MOV BYTE PTR SS:[EBP-5],AL

LEA ECX,DWORD PTR SS:[EBP-18]

MOV DWORD PTR SS:[EBP-4],ECX

MOV EDX,DWORD PTR SS:[EBP-4]

MOVSX EAX,BYTE PTR DS:[EDX+5]

MOV DWORD PTR SS:[EBP-1C],EAX

초록색 부분은 ebp에서의 주소값을 나타낸다.

어셈블리어에서 dump window를 제외한 나머지 부분은 모두 little endian으로 표기된다.
window dump는 big endian으로 2개씩 묶어서 1byte 데이터로 표기된다.

2-1 어셈블리어, register, stack, dumpwindow에서 코드 내용 수정 및 저장.


위에 보이는 것처럼 MOV EAX,DWORD PTR DS:[406030]이 있다.
4byte 공간에 406030가 가리키는 주소를 집어 넣겠다는 의미이다.

수정 후 화면이 깨지거나 이상하게 보일시 clt + A를 하면 다시 정렬되어 나타난다.

mov로 되어 있던 것을 push ebp로 바꾸었다.

그러자 다음과 같이 push EBP, NOP, NOP, NOP, NOP이 생겼다.
이는 opcode의 A1 30604000가 두 개씩 묶어서 1개의 공간을 차지하고 있음을 알 수 있다.
즉 5개의 공간 중 PUSH EBP를 넣었으나 나머지를 NOP( not operand)로 채운 것이다.

## 데이터 파일 내용 수정
# dump window 부분에서 수정 및 저장


여기서 실행 파일의 데이터원본을 볼 수 있다.
수정한 것을 옮기려면 view exec 밑에 있는 copy to exec를 클릭한다.
view는 직접 데이터 수정창을 열어 수정하는 것이다.


여기서 실제로 바꿀 데이터를 수정해 준다.

 
수정을 마친 후 save file을 하여 현재 파일에 저장하거나, 다음과 같이 backup에 들어가서 다른 파일로 저장할 수도 있다.


## 레지스터 FPU에서 수정하기

레지스터에서 수정하고자 하는 위치로 가 우클릭하면 수정할 수 있는 창이 뜬다.


입력할 때 아스키문자로 입력한다. 원래 3이 입력되어 있던 것을 A(10)으로 바꾸었다. 


F9번을 눌러 실행결과 무사히 수정되었다. 저장을 하려면 아까전처럼 실행파일의 소스를 열어 복사하거나 해서 수정해야 한다.

# 어셈블리어에서 수정 후 저장하기


스페이스 바를 누르거나 우클릭, assemble을 클릭하면 다음과 같이 어셈블리어를 수정할 수 있다.


적용을 할 때 다음과 같이 opcode로 할당받은 공간 중, 남는 공간을 NOP(opcode 90번)으로 채울지 결정할 수 있다.


파일로 저장하기 위해서 수정한 모든 부분을 실행 파일부분으로 복사한다.


실행파일의 데이터영역에서 backup-> save data to file로 다른이름으로 저장한다.





반응형

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

6일차,  (0) 2013.04.15
5일차, 점프, Argument(arguv, arguv)  (0) 2013.04.13
3일차 뺏셈` ~ 배열  (0) 2013.04.10
2일차. 올리디버거 설정  (0) 2013.04.09
1일차. 어셈블리어  (0) 2013.04.08