본문 바로가기

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

[2021.05.8] 6주차 : Bandit Level 10,11,12->13 | 달고나 문서 p.13 ~ p.27

 

이번 주는 Bandit Level 10, 11, 12 총 세 문제를 진행하였고, 12 레벨은 문제가 까다로워 다음 주에 다시 다뤄보기로 하였습니다. 또한 달고나 문서를 p.12 ~ p.27까지 읽고 질의응답하는 시간을 가졌습니다.

 

 

 

 

 

Bandit

 

 

 

Level 10은 base64로 인코딩 된 data.txt 파일을 복호화해서 비밀번호를 찾아내는 문제였습니다.

 

 

 

 

 

Level 11은 data.txt 파일 내용이 모두 카이사르 암호화로 치환되어서 이를 해독하는 문제였습니다.

 

 

 

 

 

Level 12는 data.txt 파일이 여러번 압축되어 있어서 이를 계속해서 압축 해제해주어야 하는데, home 디렉터리에 대한 권한이 없기 때문에 /tmp/test/ 와 같은 임시 디렉터리를 만들어주어 파일을 복사해 수행하면 됩니다.

 

 

또한 파일이 hex dump로 되어있어서 xxd -r을 통해 hex를 binary로 돌려주는 과정을 먼저 거쳐야 합니다.

 

bzip2

gzip

tar

 

이렇게 세 종류로 압축이 되어 있는데 구글링을 통해 해당 압축 파일을 어떻게 풀면 되는지 공부한 후 진행하였습니다.

 

 

 


 

 

달고나 문서 p.12 - p.27

 

 

C프로그램을 어셈블리 코드로 변환

$gcc S o simple.asm simple.c

 

gcc?

GNU(GNU is Not Unix) 프로젝트의 프리웨어(freeware) 컴파일러

본래는 c언어용 컴파일러였으나 후에 여러 언어도 지원

https://ibabo.tistory.com/86 -->컴파일 과정

 

어셈블리 파일 단계

$gcc S o simple.asm simple.c(simple.c 소스코드를 컴파일해서 simple.asm 어셈블리어 소스로 저장한다.)

-어셈블리 코드는 컴파일러의 버전에 따라 다르게 생성됨(보안 성능, 수행 속도(보안성능, 개선 등),), 버전이 높다고 무조건 좋은 것은 아님

 

 

 

 

 

 

 

ESP가 맨 꼭대기를 가리키는 이유 

: 프로그램이 수행되면서 push 와 pop명령을 할 것이기 때문 

 

ebp를 저장하는 이유 

: 이전에 수행하던 함수의 데이터를 보존하기 위해서 

base pointer 

 

 


 

 

어셈블리어 명령어

 

 

(1) MOV 

move의 약자. 

영어로는 "옮기다"라는 뜻이지만 여기서는 데이터를 복사한다는 뜻이다. 

source에서 destination으로 데이터를 복사한다. 

MOV [Destination], [Source] 

ex. MOV reg, mem 

 

 

(2) ADD 

말 그대로 add 

영어 뜻과 같이 더하다 라는 의미가 있다. 

destination에 source의 값을 더해서 Destination에 저장한다. SUB와 반대 성질을 갖고 있다. 

ADD [destination], [source] 

ex. ADD eax, 100 

eax레지스터에 100을 더해서 다시 eax레지스터에 저장. 

 

 

(3) SUB 

subtract(빼다)의 약자. 

영어 뜻과 같이 빼다 라는 의미가 있다. 

destination에 source의 값을 빼서 destination에 저장한다. ADD와 반대 성질을 갖고 있다. 

SUB [destination], [source] 

ex. SUB eax, 100 

eax레지스터에 100을 빼서 다시 eax레지스터에 저장. 

 

 

(4) PUSH 

Push on Stack의 약자. 

스택에 값을 넣는다. 

ESP의 값이 4만큼 줄어들고 이 위치에 새로운 값이 채워진다. 

여기서 ESP의 값이 4만큼 줄어드는 이유는 스택의 구조가 뒤집어진 컵처럼 되어있기 때문이다. 

스택의 확장이라고 볼 수 있다. 

PUSH [값] 

ex. PUSH reg8 

 

 

(5) POP 

. Pop from Stack의 약자. 

. 스택에서 값을 뺀다. 

. ESP의 값이 4만큼 늘어나고 그 위치에 있던 4byte만큼을 destination에 복사한다. 

. POP [destination] 

ex. POP reg16 

 

 

 

2. 레지스터 

 

(1) ESP 

. Stack Pointer 

. 스택 메모리 주소를 가리킨다.  

. 단순히 스택 메모리 주소를 가리키지만 매우 중요해서 다른 용도로 쓰면 안 된다. 

 

 

(2) EBP 

. Pointer to data on the stack 

. 스택이 깨지지 않도록 한다. 

. 함수가 호출되었을 때, 그 순간의 스택 메모리 주소(ESP)를 잠시 저장하고 있다가, 함수가 리턴되고 되돌아올 때 이 주소로 돌아옵니다. 

 

 

(3) EIP 

. Instruction pointer 

. CPU가 처리할 명령어의 주소를 나타내는 레지스터(32비트) 

. CPU는 EIP에 저장된 명령어의 주소에서 명령어 하나 처리하고 그 길이만큼 EIP를 증가시킴 

. 직접 값을 변경할 수 없음. 간접적으로 해야 함 

 

 

(4) EAX 

. Accumulator for operands and results data 

. 산술 연산 명령어에서 상수/변수 값의 저장 용도로 사용.  

. 일반적으로 함수 리턴 값에 사용됨. 

. 모든 Win32 API 함수들은 리턴 값을 EAX에 저장한 후 리턴함. 

 

 

 

 

효주님, 서은님 작성