배열은 더블포인터
배열은 포인터이다.
결국 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 |