본문 바로가기

3. Pwnable (포너블)/2) 개념 정리

[2021.05.22] 8주차 : Bandit Level 15,16,17->18 | 달고나 문서 p.34 ~ ~ p.44

벌써 한 학기 마지막 활동이라니..!!!

아쉬움도 많지만 팀원들과 1학기를 알차게 보낼 수 있어서 너무너무 행복했습니다 🤩

 

 

이번 시간은 Bandit Level15, 16, 17 -> 18 풀이를 했고, 달고나 문서는 p.34 ~ p.44까지 진행했습니다.

 

 


 

Bandit Level 15, 16, 17 -> 18

 

 

 

 

Bandit 15

 

 

s_client : SSL/TLS 클라이언트 프로그램

 

 

openssl : 네트워크를 통한 데이터 통신에 쓰이는 프로토콜인 TLS와 SSL의 오픈 소스 구현판이다. C 언어로 작성되어 있는 중심 라이브러리 안에는, 기본적인 암호화 기능 및 여러 유틸리티 함수들이 구현되어 있다.

출처 : 위키

 

 

가장 기본적인 사용법은 다음과 같습니다.

openssl s_client -connect [서버]:[포트]

 

-> openssl s_client -connect localhost:30001

 

 

 

 

Bandit 16

 

 

포트 번호가 31000과 32000 사이인 서버에 연결중인데 정확히 어떤 포트와 연결 중인지 찾고, SSL 연결 중인 오직 하나의 서버만 다음 단계로 갈 수 있는 키를 줄 것이다...

 

힌트에 있는 nmap을 한번 활용해보겠습니다.

 

nmap [스캔유형][스캔옵션][호스트주소]

 

스캔 유형은 어떤 걸 줘야 할지 잘 모르겠어서 일단 옵션이랑 주소만 줬는데,

 

31046

31518

31691

31790

31960

이렇게 5개가 열려있다고 합니다.

 

하나씩 연결을 해보면 31790이 SSL 연결 중인 것을 알 수 있는데, RSA PRIVATE KEY로 되어있는 값을 따로 파일에 저장해서 SSH 접속하면 됩니다.

 

 

 

 

Bandit 17

 

 

passwords.old passwords.new 이렇게 두 개의 파일이 있는데, 내용은 같지만 유일하게 한 줄만이 다르다고 합니다.

여기서는 diff 명령어를 사용해주면 됩니다.

 

 

 

diff 사용법은 manpage를 확인하면 됩니다.

 

저는 간단하게 diff passwords.new passwords.old를 사용하였습니다.

 

 

 


 

달고나 문서 p.34~p.44

 

 

이번 주 달고나 문서 공부는 효주님이 정리한 문서를 토대로 작성하였습니다.

 

 

<쉘 실행 프로그램> 

쉘 실행 :/bin/sh입력 

execve() 함수 : 바이너리 형태의 실행파일 or 스크립트 파일 실행 

 

<Dynamic Link Library & Static Link Library> 

Dynamic Link Library(동적 링크 라이브러리) : DDL 

 

 

 

 

소프트웨어 개발에서 자주 쓰고 기초적인 함수들을 중복 개발하는 것을 피하기 위해 표준화된 함수 및 데이터 타입을 만들어서 모아 놓은 것. 표준화할 수 있는 함수를 미리 만들어서 모아 놓은 것. 

 

라이브러리를 한 번 구축해 놓기만 하면 다시 만들 필요 없이 불러서 사용할 수 있으므로 개발 속도도 빨라지고 신뢰성도 확보할 수 있다. 

 

정적 링크와는 다르게 컴파일 시점에 실행 파일에 함수를 복사하지 않고, 함수의 위치정보만 갖고 그 함수를 호출할 수 있게 한다. 

 

 

 

Static Link Library(정적 링크 라이브러리)

특정 기능의 라이브러리를 static 하게 제작한다는 것은 link 단계에서 라이브러리(*.lib 파일)를 실행 바이너리에 포함시킨다는 얘기이다. 

 

, 라이브러리의 동작 코드가 이를 사용하는 실행 바이너리 속에 포함되기 때문에 별도의 추가 작업 없이, 그리고 독립적으로(실행 바이너리만으로) 라이브러리 함수들을 사용할 수 있다. 

 

하지만, 정적 라이브러리를 사용하는 프로그램이 늘어나면 날수록 불필요하게 실행 파일들의 크기가 커진다. 

 

 

 

범용 레지스터(General Purpose Register) 

: 작은 데이터의 임시 저장 공간으로, 연산 처리 및 데이터의 주소를 지정하는 역할을 한다. 컴퓨터의 장치들을 제어하는 역할 또한 수행한다. 

 

 

EAX  산술 연산 및 논리 연산 수행 
EBX  메모리 주소 저장 
ECX  반복문 사용 시 반복 카운터로 사용 
반복할 횟수 지정하고 반복 작업 수행 
EDX  EAX 레지스터와 같이 쓰임 
부호 확장 명령 등에 사용 
큰 수의 곱셈 또는 나눗셈 연산 
EDI  복사할 때 목적지 주소 저장 
ESI  데이터를 조작하거나 복사할 때 데이터의 주소 저장 
ESP  메모리 스택의 끝 지점 주소 포인터 
EBP  다음에 실행해야 할 명령어의 주소 포인터 
EIP  다음에 실행해야 할 명령어의 주소 포인터 

 

 

인터럽트(Interrrupt) 

: 하드웨어가 어떠한 이벤트를 CPU에게 알리기 위해서 사용하는 방법 

종류  설명  예시 
하드웨어 인터럽트  입출력장치, 타이밍 장치, 전원 등 외부적인 요인에 의해 발생. ISR 종료 후 대기.  키보드, 마우스 입력 
소프트웨어 인터럽트 
(exception or trap) 
소프트웨어가 OS 서비스를 요청하거나 에러를 일으켰을 때 발생. ISR 종료 후 다시 프로그램으로 돌아거나 프로그램을 강제로 종료.  파일 읽기/쓰기, 0으로 나누기, overflow 

 

소프트웨어 인터럽트  종류  설명  예시 
Trap  의도적으로 일으킨 예외. ISR 종료 후 실행 재개  시스템 콜 
Fault  복구가 가능할 수도 있는 예외. ISR 종료 후 실행을 재개할 가능성도 있음  0으로 나누기, 잘못된 메모리 접근 
Abort  복구가 불가능한 예외. ISR 실행 시 프로그램 강제 종료  하드웨어 고장 

 

 

 

Interrupt Service Routine(ISR) 

CPU에 인터럽트가 걸리면 인터럽트 서비스 루틴(interrupt service routine)에 제어권을 넘겨준다. ISR은 인터럽트의 종류별로 인터럽트 핸들러(interrupt handler)의 주소가 담긴 테이블인 인터럽트 벡터(interrupt vector)를 보고 어떤 인터럽트가 발생했는지 결정한다. 그리고 해당하는 인터럽트 핸들러의 주소로 이동하여 예외처리를 실행한다. 

 

 

 

<쉘을 띄우기 위한 과정> 

1. 스택에 execve()를 실행하기 위한 인자들을 제대로 배치한다 

2. NULL과 인자 값의 포인터를 스택에 넣어 둔다. 

3. 범용 레지스터에 이 값들의 위치를 지정해 준다. 

4. interrupt 0x80을 호출하여 system call 12를 호출하게 한다. 

 

 

 

 

 

 

 

 

 

 

 

한 학기 동안 모두 수고 많으셨습니다 :)

포~야호~ 화이팅!!!