반응형

보안관 창고 276

7일차 리버싱의 오묘한맛

## LEA의 주소값 연산 LEA의 오른쪽 대괄호 안은 일반적으로 주소자리로 인식되나 실제로는 안에 연산해서 이루어진 값이 ECX로 전해진다. ## 연산에서 1가지 인자 처리 방법 ADD ECX는 EAX값에 저장된 값과 더하여 그 결과값을 저장한다. ## 연산에서 2가지 인자 처리 방법 SUB EAX, ECX 에서 EAX= EAX-ECX로 결과값을 저장한다. ## 연산에서 3가지 인자 처리방법. IMUL ECX, ECX, 0A의 경우 2,3번째 값을 연산한 값을 ECX에 저장한다. 3-5 len 함수를 대신하는 문자열 확인 for문 for문은 밖에서 초기값을 지정해주고 검은색 화살표가 그려져있는 부분으로 들어와서 조건을 만든 후, 안에 있는 내용을 JMP가 나타나기 전까지 실행한다. 그리고 JMP가 맨 ..

리버싱 2013.04.16

6일차,

## 3-5 소스 수정없이 success가 나오도록 하라!!!나는 계산기로 값으로 예상되는 D8을 넣었다가 3정도 크게나오자 -3을 하여 D5를 사입하여 해결하였다. 그러나 실제로는 EDX에 담기는 문자형을 이용하여 연산하여야 했다. [윗부분은 ECX에 담긴 문자의 크기를 계산하는 항목이다] EBP+X 는 아래와 같은 특징을 가지는데 외워두는게 좋다. [EBP+8] = hInst [EBP+C] = hPrev [EBP+10] = lpCmd (캐릭터형 포인터, 주소를 가리킴) [EBP+14] = nCmdShow MOV EAX,DWORD PTR SS:[EBP+10] ->lpCmd 를 EAX에 넣는다. ## while , for 문. while과 for은 둘다 CMP(compare)~JMP로 이루어져 있다. 그..

리버싱 2013.04.15

5일차, 점프, Argument(arguv, arguv)

오른쪽 옆에 점프구문 이동 보여주는 것 설정하기 debugging option [alt+o] -> CPU에서 show jump path와 하위 2개 체크 점프구문 JMP에는 30여가지의 종류가 있다. JMP - 무조건 해당 주소로 점프한다. JNZ - 연산 결과가 0이 아니라면 점프한다. (CMP로 비교시는 오른쪽에서 왼쪽 값을 뺀 값이 0 이면 점프 sub도) JNE - 연산 결과가 0이 아니라면 점프한다. JZ - 연산 결과가 0일 때 점프한다. JE - 연산 결과가 0일 때 점프한다. JGE - 연산 결과가 0이거나 더 클 때 점프한다. JNG - 연산 결과가 0보다 크지 않을 때 점프한다. .... ## 3-1. CMP ( compare ) 비교 연산 CMP(compare)에서는 오른쪽에서 왼쪽 ..

리버싱 2013.04.13

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

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

리버싱 2013.04.11

3일차 뺏셈` ~ 배열

다음에 보이는 것과 같이 DWORD PTR DS: 다음에는 값이 들어가는데, 이것은 아래에 보이 듯이 상단에 있는 M버튼을 눌러서 메모리 영역으로 들어가서 확인 가능하다. 다음에 보이 듯이 406000 주소지부터 2000개의 공간만큼 data 영역으로 가지며, data 속성을 가지고 있음을 알 수 있다. push 부분에서 다음에 보면 01_03_qu라고 되어있는데, 이것은 프로그램 exe파일 명과 일치하며 8글자까지만 나타난다. 의미는 01_03_quiz.exe에 406030의 내용을 push하겠다는 의미이다. 다음과 같이 3개의 push가 연달아 이어져있는데, sprintf일 확율이 높다. 배열문 출력인 sprintf는 다음과 같이 sprintf(배열명,"hellow %s", 값);으로 나타낼 수 있다..

리버싱 2013.04.10

FPU, FILD, FSTP

FILD 명령 - 16비트, 32비트, 64비트 정수를 double extended-precision floating-point 포맷(80 bit extended precision 포맷)으로 변환한 다음 그 결과 값을 FPU 스택에 PUSH 하는 명령이다. - 단 하나의 operand 만을 사용한다. - FILD 명령에서 사용되는 operand는 반드시 16비트, 32비트, 64비트 메모리 주소여야 한다. (operand로 레지스터가 사용되면 안된다) - 만약 레지스터의 내용을 FPU 스택에 PUSH 하고 싶다면, 레지스터의 내용을 먼저 메모리에 저장한 다음에 FILD 명령을 이용해서 해당 메모리의 값을 FPU 스택에 PUSH 해야 한다. FST/FSTP 명령 - FST와 FSTP 명령은 FPU 스택의 ..

카테고리 없음 2013.04.10

2일차. 올리디버거 설정

올리디버거에서 어셈블리어 창에 옆의 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을 누르면 한줄씩 진행할 수..

리버싱 2013.04.09
반응형