[3주차] 프로토콜 정리

프로토콜: 컴퓨터로 이루어지는 데이터 교환 방식을 정한 규칙

프로토콜의 기본 요소

  1. 구문(SYNTAX): 전송하고자 하는 데이터의 형식, 부호화, 신호 레벨
  2. 의미(SEMANTICS): 효율적이고 정확한 정보 전송 및 오류 관리를 위한 제어 정보 규정
  3. 시간(TIMING): 통신 속도, 메세지의 순서 제어

프로토콜의 기능

  1. 단편화: 긴 데이터 블록 쪼개기
  2. 캡슐화: 프로토콜에 적합한 데이터 블록 제작을 위해 정보 추가

프로토콜 정리

1. TCP (Transmission Control Protocol)

client와 server 연결 상태에서 데이터 통신하는 프로토콜

client server
1. server로 SYN  
  2. client로 SYN-ACK
3. server로 ACK  

Segment format
*segment: TCP 통신 단위

TCP Segment Format

Source port address (4 bits) 데이터 보내는 호스트의 TCP 포트
Destination port address (4 bits) 데이터 받는 호스트의 TCP 포트
Sequence Number (8 bits) TCP 세그먼트에 있는 첫번째 바이트에 대한 순번
Acknowledgement (16 bits) receiver가 받기 원하는 number
HLEN (16 bits) header 길이 저장
Reserved (3 bits)  
Control field (13 bits) 1bit씩 존재
flag처럼 사용, 패킷 받으면 제일 먼저 확인
ACK: 데이터 전달 받음
SYN: 연결 요청
FIN: 연결 종료 요청
Windows size (8 bits) TCP 세그먼트 보내는 호스트의 TCP 버퍼 크기
TCP Checksum (8 bits) TCP 데이터와 TCP 헤더의 error 유무 확인
Option (16 bits)  

2. UDP (User Datagram Protocol)

일방적 데이터 전송하는 프로토콜
신뢰성이 떨어짐, 실시간 전송에 많이 쓰임

sender receiver
  1. sender로 request
2. receiver로 response  

UDP Communication

source port (16 bits) 출발지
destination port (16 bits) 목적지
length (16 bits) 길이
checksum (16 bits) 오류 검사

3. IP (Internet Protocol)

다른 네트워크 간 데이터 전송을 위한 경로 제어 프로토콜

IP의 속성

  1. 비신뢰성: IP 데이터그램 dest로 전송
  2. 비접속성: 논리적 주소로만 패킷 전송

Datagram format
*IP의 통신단위는 Packet인데 format은 datagram이라 명칭한 거 같다.

IP Datagram Format

VER (4 bits) ip버전을 기록, IPv4인지 IPv6인지
HLEN (4 bits) header의 길이 저장
기본 크기 20 bytes + option 때문에 플러스 알파 존재
전체길이/4의 몫 저장
Service type (8 bits) header+data
datagram 전체 길이 바이트 단위
Total length (16 bits) 단편화에서 같은 datagram인지 확인하는 번호
Identification (16 bits)  
Flags (3 bits) 처음 1 bit는 항상 0
2 bit: IP 라우터에 의해 분열 여부, 분열 가능하면 0
3 bit: 원래 데이터에 단편화가 더 있는지, 마지막 조각이면 0
Fragmentation offset (13 bits) 단편화되기 전 datagram의 위치
Time to live (8 bits) 패킷 수명
1~255 사이 값
라우터들이 패킷 전달할 때마다 –1
Protocol (8 bits) 어떤 상위계층 프로토콜이 포함되었는지 표시
Header Checksum (16 bits) 헤더에 오류 check
Source IP Address source 주소
Destination IP Address dest 주소

if 중간에 다른 라우터 존재, physical 주소 변경하여 목적지 도달
via 라우팅 알고리즘, 최적 경로 설정(라우팅 테이블)

4. HTTP (HyperText Transfer Protocol)

서버/클라이언트 간의 데이터 교환을 request/response로 정의한 프로토콜
TCP/IP 통신 위에서 사용됨

client   server
1. server로 request 이 사이에 proxy 존재
(ex. gateway, filtering..)
 
    2. client로 response

HTTP Communication

request는 다음 세 가지

  1. request line : method, path, version이 있다.
  2. request headers
  3. request message body

response는 다음 세 가지

  1. status line: version과 상태 코드가 있다.
status line  
1xx informational
2xx success
3xx redirection
4xx client error
5xx server error
  1. response headers: user와 상호작용을 위한 데이터를 담는 부분
  2. response message body: server의 응답 부분

*HTTPS는 HTTP에 TLS 프로토콜 도입하여 메세지 암호화..

5. ICMP (Internet Control Message Protocol)

ping을 이용한 통신에 쓰이는 프로토콜

sender switch router receiver
1. ping      
2. <receiver의 IP주소가 본인 네트워크와 동일한지 파악
동일하다면, 해당 네트워크로 ICMP 패킷 전달
동일하지 않다면, 기본 게이트웨이로 패킷 전달
     
3. ARP 패킷 생성, 경유 스위치로 전달      
  4. 전달 받은 ARP 패킷 learning -> table 갱신 -> flooding    
    5. ARP 패킷 검증과 ARP 캐시 테이블 갱신  

6. ARP (Address Resolution Protocol)

상대방의 IP 주소만 알고, MAC 주소를 모를 때 사용

     
같은 네트워크    
sender switch receiver
1. broadcast로 같은 네트워크 전체 node에게 패킷 flooding    
  2. 전달 받은 ARP 패킷 learning -> ARP table 갱신(MAC 주소 기록) -> request 답 없다면 다시 flooding  
    3. ARP 패킷 받고 sender의 MAC 주소 기록-> ARP Reply 패킷 전송
    2. 전달 받은 ARP Reply 패킷 learning -> ARP table 갱신(MAC 주소 기록) -> sender에게 전달

ARP Communication

Hardware type (6 bits) hardware 주소 타입, 네트워크 유형
Protocol type (2 bits) 사용하는 프로토콜 type
Hardware length HLEN (1 bit)  
Protocol Length/Size (1 bit) 망계층 주소 크기
Operation Code (2 bits) ARP 패킷 종류 표시
request - 1
reply - 2
rarp request - 3
rarp reply - 4
Sender Hardware Address (6 bits)  
Sender Protocol Address (4 bits)  
Target Hardware Address (6 bits)  
Target Protocol Address (4 bits)  

7. FTP (File Transfer Protocol)

TCP/IP 프로토콜을 가지고 server/client 파일 전송 지원 프로토콜

client server
1. 3-way handshaking 1회 진행  
2. request 입력해서 server로 보냄
FTP commands 사용
 
  3. 숫자 코드로 response
숫자 코드: FTP server return codes

8. FTPS (Trivial File Transfer Protocol)

FTP의 expand 버전.. TLS/SSL 암호화 프로토콜 지원
포트를 암호화하여 안전한 데이터 전송

9. TELNET (TELetype NETwork)

인터넷이나 로컬 영역 네트워크 연결에 사용

10. SSL/TLS

암호화 프로토콜
응용 계층과 TCP 계층 사이 보안 layer

client server
1. 3-way handshaking 1회 진행  
2. SSL/TLS 작동  

11. SSH

원격 시스템에서 명령을 실행하기 위해 다른 컴퓨터 로그인에 사용
TELNET에서 보안이 강화된 프로토콜

[3주차] 디버깅 실습 문서화

x32dbg로 실습 진행했다. 실습 방법은 동일하다.

첫 화면

파일 열고 첫 화면이다.

파일 열기

main 함수에 진입하려면 __cexit을 찾는 게 빠르다. 우클릭->다음을 찾기를 하면 기호 카테고리에서 위와 같은 화면이 나오는데 왼쪽은 모듈, 오른쪽은 symbol이 있다. symbol에서 cexit을 검색해준다. 해당 주소를 클릭하고 우클릭->참조 찾기를 하면

참조 찾기

위와 같이 나오는데 다시 이걸 참조 찾기 해보면 오른쪽과 같이 나온다.

참조 결과

참조한 주소를 찾아가서 위를 보면 project4._wmain이 뜬다.

project4._wmain

진입해보면 “swing 31”, “Hello world” 같은 문자열이 나온다.

문자열 검색 방법

우클릭->검색->현재 모듈->문자열 찾기를 하면 위와 같은 화면이 뜬다.

문자열 찾기

주소를 더블 클릭하면 참조한 명령 주소로 갈 수 있다.

모듈 호출 찾기

우클릭->검색->현재 모듈->모듈간 호출하면 위와 같이 뜬다. MessageBoxW가 쓰인 주소를 더블 클릭하면

모듈 호출 결과

위와 같이 이동한다.

이동 결과

혹은 아까 cexit 검색한 것처럼 기호 카테고리에서도 name을 검색하여 찾을 수 있다.

[3주차] swing_register_asssignment.exe 분석

swing_register_asssignment에서 다른 모듈 호출하는 명령 목록을 가져온다.
_cexit을 찾아서 주소로 간다.

image1

해당 _cexit 위에 있는 call이 메인 함수인 거 같다. 해당 callee를 더블 클릭해본다.

image2

puts 같은 출력 함수와 문자열에 있는 걸 보아 main이 맞는 거 같다.

image3

중단점을 설정하고 해당 부분까지 f9로 와준다.

image4

맨 위 Hello SWING 문자열 명령을 분석해보면
swing_register_as~(짤렸다)부분 주소를 hex로 보면

image5

일단 주소가 00404052임을 알 수 있다. 왼쪽 ascii 부분에 Hello SWING!이 맞게 써져 있다.
mov로 esp에 옮겨주는데

image6

원래 이랬던 esp가 명령을 실행하면

image7

이렇게 변한다. 맨 앞 4bytes만 리틀 엔디안으로 읽으면 00040452
아까 본 Hello SWING!이 담겨 있는 주소이다.

출력 명령을 할 차례이다.

image8

디버깅 창에 문자열이 뜬 걸 알 수 있다.

image9

다음 문자열은 call로 다른 함수를 호출해온다.

image10

f7로 진입해보면 ebp가 나온다.

image11

들어간 직후 스택 상단에 들어간 00401643값은

image12

아까 호출했던 명령어 다음 주소이다.

image13

위 callee를 실행하면 eax가 7이다. 어떻게 7이라는 값이 나왔을까

image14

mov eax, dword ptr ss:[esp+18] 에서 esp+18에 저장된 값이다.

image15

mov eax, dword ptr ss:[esp+1C] 에서 esp+1C에 저장된 값이다.

image16

해당 값들은 eax에 옮겼다가 스택에 넣어줬기 때문에 스택 상황은 위와 같다.
마지막 eax에는 3이 있다.

image17

callee에 들어간 후 어셈블리이다.
ebp+8과 ebp+C에 있는 4,3을 가져와서 add 해주므로 값은 7이다.

image18

eax값이 7로 반환된 것을 확인할 수 있다.

image19

print 함수 실행

image20

디버깅 화면에 7로 알맞게 출력되었다.

image21

다음 callee에 진입해보면

image22

위와 같다

image23

아까와 동일하게 caller 다음 주소가 stack에 쌓인다.

image24

분기문이 있다. ebp-C가 어떤 flag의 역할을 해서 계속 대소 연산을 해주는 거 같다.

image25

jle less일 때 분기해주는 거 같다.
바로 직전 명령어가 4와 비교이기 때문에
if([ebp-C]<4)
    jmp
인 거 같다.

image26

image27

I am Main %d을 출력해준다. 이때 %d는 eax 값이다.

image28

디버깅 화면이다.

image29

eax가 4가 될 때까지 루프 돌렸다. eax가 4가 되면 jle가 분기되지 않고

image30

다음으로 넘어가는 걸 알 수 있다.
이후는 return 0을 위한 코드로 종료를 해주는 거 같다.

[3주차] shark

화면을 열어본 첫 화면이다

첫 화면

http 패킷은 없다

http 패킷

ftp로 secret.png로 저장한 거 같다.

ftp 저장

단편화된 FTP data를 모아준다

FTP data

오른쪽 hex는 FTP Data

FTP Data Hex

단편화된 패킷들

단편화된 패킷

raw로 모아서 저장하면

raw 저장

깨진다

깨진 파일

여러 삽질을 해봤는데 이건 아닌 거 같다. HxD 시그니처를 바꾸려다가 다른 방법을 써보기로 했다.
아까 secret.png를 추출하면서 가운데에 낀 패킷이 하나 더 있었다.

추출된 패킷

힌트는 identification이었다

힌트

해당 숫자가 순차적이지 않았다!
순차적으로 만들기 위해

순차적 만들기

column으로 넣어주고 정렬한다

정렬

hex stream으로 파일 조각들을 복사한다
follow 처럼 묶어서 저장하고 싶었는데 모르겠어서 그냥 노가다로 복붙했다

파일 조각 복사

무제2

[3주차] dump

Image

q=SELECT IF(ASCII(SUBSTRING((SELECT flag FROM s3cr3t LIMIT 1),39,1))=229, SLEEP(3), 0)

계속 이런 구문이 반복되길래 하나 잡고 ascii 변환했다.

SELECT IF(ASCII(SUBSTRING((SELECT flag FROM s3cr3t LIMIT 1),39,1))=229, SLEEP(3), 0)

s3cr3t 테이블에서 flag 읽고 39번째 ascii 값이 229라면 Sleep하면 아니면 0반환이다.

sleep된 패킷만 모아봐야 한다.

Image

위와 같이 설정을 바꾸고 Time으로 정렬한다.

Image

상단에 3초 이상의 패킷들을 ctrl+m으로 mark해준다.

Image

mark한 response의 request에서 Hypertext Transfer Protocol을 보면 Request 쿼리가 존재한다.

Image

모은다(노가다)

%3D 뒤 숫자를 모아준다.

71,95,111,66,109,110,49,95,95,53,119,104,55,23,73,51,51,105,76,52,106,115,73,125,99,55,100,84,95,69,110,81,80,78,95,112,48,99,52

이걸 파이썬으로 ascii 변환해준다.

index=[71,95,111,66,109,110,49,95,95,53,119,104,55,23,73,51,51,105,76,52,106,115,73,125,99,55,100,84,95,69,110,81,80,78,95,112,48,99,52]

p=''

for i in index:
    p+=chr(i)

print(p)

정답이 아니라고 한다…..

알고보니 패킷순대로 ascii값을 검사하지 않는다

SUBSTRING((SELECT flag FROM s3cr3t LIMIT 1)

여기서 두번째 인자값에 맞춰서 정렬해줘야 한다.

노가다로 정렬했다.

위 파이썬 코드에서 index 리스트 구성만 바꾸면

Image

플래그가 알맞게 나온다.