버그 바운티
기업의 서비스나 제품 등의 취약점을 찾으면 포상급을 지급하는 제도
리버싱 (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 //이러한 형태는 되지 않는다.
X eXtention 확장이라는 의미
MOVZX
- 부호가 없는 정수에만 사용 //unsignend 부호 없는 정수 표현
ex)
char 1byte int 4byte
unsignend int eax;
unsignend char al =10;
eax = al; //작은 공간 -> 큰 공간으로 복사가 이뤄질 때 사용
MOVZX EAX , AX //부호 없는 정수 AX가 EAX에 들어갔다 해석.

MOVSX
- 부호가 있는 정수에만 사용
ex)
char 1byte int 4byte
int eax;
char al =10;
eax = al; //작은 공간 -> 큰 공간으로 복사가 이뤄질 때 사용
MOVZX EAX , AX //부호 있는 정수 AX가 EAX에 들어갔다 해석.

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 |