버그 바운티

기업의 서비스나 제품 등의 취약점을 찾으면 포상급을 지급하는 제도

 

 

 

리버싱 (Assembly 언어) 2일

Anti Reversing      3일

분석방법(정적, 동적, 상세) 분석

 

 

IA32 Basices  (Intel Architecture) 기반

32비트 어셈블리   

 

 

레지스터 

 

전부 10을 가져오지만 비트 크기가 전부 다르다.

 

EAX = 10;   <- int eax =10;        // 32bit 전체 

AX = 10;     <- short ax = 10;    // 16bit 

AL = 10;    <- char al = 10;      // 8 bit

 

범용 레지스터

- ESP를 제외하고 나머지 레지스터들은 아무 값이나 저장.

 

EAX   

- 종료되는 상황에 값이 있으면 return 값을 의미한다.

ex) MOV EAX 10   -> Return 10

 

EDX

 - MUL, DIV(곱셈, 나눗셈) 값 저장 

ECX

 - 평소에는 그냥 계산 값

 - rep 명령이 있으면 반복 횟수로 변경

 

ESI   

- 출발지 주소 저장

EDI

- 목적지 주소 저장

ESP

- 스택의 주소만 저장.

- 제일 마지막에 들어온 데이터의 주소를 저장.

- 즉 , 스택의 최신 데이터를 가리킨다.

EBP

- 스택 프레임의 처음(기준) 지점의 주소를 저장.

- main() 함수가 실행되면 가장 처음 부분의 주소

- main() 함수가 있고 function() 함수가 실행되면 function()의 처음 주소.

EIP

- 다음 실행할 명령의 주소

 

 

flag 

- 상태 코드

연산 결과가 0이면

zero flag=0

연산 결과가 0이 아니면

zero flag=1

 

Break Point

- 멈춰야 되는 주소

software와 hardware로 나뉨. 

 

software 

디버거가 break Point를 지원

실행하다가 원하는 주소에서 멈출 수 있음.

 

Hardware

 - 이 메모리의 데이터를 읽거나 쓰거나 실행하면 멈추는 것.

 - 시작 값과 결괏값을 알 때 일련의 연산과정을 확인할 수 있음 (암호학 쪽에서 사용)

 

 

 

어셈블리어

 

MOV

데이터 복사

ex)

eax = 10;   // MOV EAX, 10   

10의 값을 EAX로 복사한다. 

MOV 10, 20 //이러한 형태는 되지 않는다.

 

eXtention 확장이라는 의미

 

 

MOVZX

- 부호가 없는 정수에만 사용 //unsignend  부호 없는 정수 표현

ex)

 char 1byte  int 4byte

unsignend  int eax;

unsignend  char al =10;     

eax = al;   //작은 공간 -> 큰 공간으로 복사가 이뤄질 때 사용

MOVZX EAX , AX //부호 없는 정수 AX가 EAX에 들어갔다 해석.

부호없는 정수기 때문에 작은비트에서 큰비트로 복사 됐을 시, 부족한 비트는 0으로 채워짐.

 

MOVSX

- 부호가 있는 정수에만 사용

ex)

char 1byte  int 4byte

int eax;

char al =10;     

eax = al;   //작은 공간 -> 큰 공간으로 복사가 이뤄질 때 사용

 

MOVZX EAX , AX //부호 있는 정수 AX가 EAX에 들어갔다 해석.

부호가 있는 정수기 때문에 작은비트에서 큰비트로 복사 됐을 시, 부족한 비트는 1로 채워짐.

 

 

MOVS S(String)

- 문자열 복사

- 피연산자 개수가  0~2개이다.

- 다른 MOV 연산자들은 2개로 고정.

- 1,2,4 byte 씩 가능하다 64bit 시, 8byte도 가능.

 

- 문자열을 복사할 시, 알아서 주소를 변경해 복사를 해줌.

 

  방향 플래그(DF)가 1 이면 ESI와 EDI는 감소,

  방향 플래그(DF)가 0 이면 ESI와 EDI는 증가  //대부분이 증가한다.

 

 

MOVS 가 나올 때 무조건 크기를 명시해서 나옴. 아래와 같이 표시됨.

 

  BYTE == 1byte == B

  WORD == 2byte == W

  DWORD == 4byte == D

  QWORD == 8byte == Q  

 

MOVS     //피연산자가 없을 경우 , 크기에 따라 MOVSB  MOVSD MOVSW 이런 식으로 나타냄.

MOVSB // ESI의 1byte를  EDI로 옮긴다.

MOVSD // ESI의 4byte를  EDI로 옮긴다.

 

 

 

ESI  //출발지

EDI //도착지

MOVS EDI , ESI라는 연산 식이 고정이다. 따라서, 아래 연산 식이 전부 같은 의미.

MOVS EDI , ESI  

MOVS     //피연산자가 없을 경우 , 크기에 따라 MOVSB  MOVSD MOVSW 이런 식으로 나타냄.

MOVS EDI

MOVS ESI 

간단히 정리하면 , ESI의 값을 EDI로 복사할 거야 라는 의미이다.

 

ADD

더하기 연산자 

 

MOV EAX, 1

MOV EBX, 2

ADD EAX, EBX or ADD EAX, 2      

ADD 1, 2 //이런식의 문법은 오류다.

 

eax=1;

ebx=2;

eax+=ebx;

 

SUB

빼기 연산자

 

MOV EAX, 1

MOV EBX, 2

SUB EAX, EBX      

SUB 1, 2 //이런식의 문법은 오류다.

 

eax=1;

ebx=2;

eax-=ebx;

 

MUL

부호 없는 곱하기 연산자

- unsignend을 사용해야 보임.

- 결과는 EDX:EAX에 저장

 

IMUL

부호 있는 곱하기 연산자

 

- 피연산자의 수가 3개 까지 표현 가능

- 결과는 EDX:EAX에 저장

- 결괏값을 초기화할 때 양수면 0으로 초기화 음수면 1로 초기화

IMUL ECX -> //IMUL (EAX), ECX를 표현

IMUL EAX, EBX, ECX  //EBX * ECX의 값을 EAX의 저장

 

 

DIV

부호 없는 나누기 연산자

- unsignend을 사용해야 보임.

- 몫 : EAX

- 나머지 : EDX

 

IDIV

부호 있는 나누기 연산자

- 몫 : EAX

- 나머지 : EDX

- 나눗셈 수행 전 CBW, CWD, CDQ를 통해 부호 비트를 확장

- 음수면 1로 채우고 양수면 0으로 채운다.

 

 CBW 1byte 끼리 나누기

 CWD 2byte 끼리 나누기

 CDQ 2byte와 4byte를 나눌 때 큰 바이트를 따라감.

 

INC(++)

증가 연산자

값이 1씩 증가

 

DEC(--)

감소 연산자

값이 1씩 감소

 

AND 

둘다 참일 때만 참

 

MOV EAX, 59

MOV EBX, 15

AND EAX, EBX   //59와 15를 AND연산하여라.

 

eax = 59;

ebx = 15;

eax &= ebx;

 

OR

하나라도 참이면 참

 

MOV EAX, 59

MOV EBX, 15

OR EAX, EBX   //59와 15를 OR 연산하여라.

 

eax = 59;

ebx = 15;

eax |= ebx;

 

XOR

 같으면 0 다르면 1

 패리티 점검에 사용

 x^y=z ==  y^z=x

 

0을 선언할 때, 

MOV EBX, 0 이러한 식보다

XOR EBX, EBX   이러한 식이 더 유용하다. cpu가 논리연산을 선호하기 때문이다.

 

 

MOV EAX, 59

MOV EBX, 15

XOR EAX, EBX   //59와 15를 OR 연산하여라.

 

eax = 59;

ebx = 15;

eax ^= ebx;

 

SHL

연산자의 비트를 왼쪽으로 이동 곱셈

1의비트를 잃어버리면 곱셈의 규칙이 깨짐

 

MOV d1, 5

sh1 d1, 1

 

SHR

연산자의 비트를 오른쪽으로 이동 나눗셈 

1의비트를 잃어버리면 나눗셈의 규칙이 깨짐

 

MOV d1, 32

shr d1, 1

 

LEA

 

두번 째 Operand의 주소를 계산하고 첫번째 Operand에 저장

 

 

MOV 에서의 [ ]는 포인터 연산자이다.  즉, 

MOV eax, [edx+4] 는 edx+4의 주소를 eax의 저장한다라는 의미이다.

eax = *(edx+4);

LEA eax, [edx+4]   //edx+4의 결과를 eax의 저장

eax = edx+4;

 

 

SCAS (SCAn String)

EAX에 저장되어 있는 값과 ES:EDI가 가리키는 곳(주소) 에 저장되어 있는 값을 비교

SCASB  byte를 의미

 

 

 

STOS(STOre String)

EAX에 저장 되어 있는 값을 ES:EDI가 가리키는 곳에 값을 저장 

STOSB byte를 의미

 

 

 

 

CMP EAX, EBX  //EAX가 더크면 조건문 실행        if문 같은 제어문이 나올 때 나옴.

JG 0x1000

 

CMP, TEST, SCAS  //비교 연산자 대부분 JUMP와 연관되어 나옴.

JG 0x1000

JL

JE

JZ

JNZ

 

 

 

REP

ECX레지스터의 저장된 값 만큼  해당 명령어를 반복 실행, 접두사 형식으로 사용됨

 

'악성코드 분석' 카테고리의 다른 글

패스워드 알아내기  (0) 2019.06.04
quiz를 통해 익숙해지기  (0) 2019.05.22
어셈블리어 로 test.cpp 해석  (0) 2019.05.21
Debugger사용법, 간단한test.exe파일을 통해 분석  (0) 2019.05.17
기초지식(스택)  (0) 2019.05.16

+ Recent posts