본문 바로가기

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

[2021.05.1] 5주차 : Bandit Level 6, 7, 8, 9 -> 10 | 달고나 문서 p.1 ~ p.12

포야호팀이 중간고사를 무사히 마치고 3주만에 뭉쳤습니다~~

 

 

 

모임이 없는 3주 동안 Bandit을 6~13 레벨까지 풀어오기로 했으나

10부터 생각보다 난이도가 높아

시간 소요가 많이 돼서 10까지만 진행하였습니다.

 

 

 

 

 

 

find 명령어를 사용해 

-user , -group, -size 옵션을 주어 파일을 찾아내는 문제였습니다.

 

 

 

 

 

 

 

grep 명령어를 사용해 millionth 이라는 문자열이 있는 행을 출력하도록 하였습니다.

cat data.txt | grep "millionth"

 

 

 

 

 

 

data.txt 파일 내에는 수많은 라인이 출력되는데, 오직 한 줄을 제외하곤 모두 중복된다고 합니다.

sort 명령어로 먼저 정렬을 해주고, uniq로 그 한 줄을 찾아주면 됩니다.

저(팀장)는 sort와 uniq 둘 다 처음 써봐서 많이 뚝딱거렸는데, 옵션이 많아서 그렇지 사용하는 법은 쉬웠습니다!

 

 

 

 

이번 문제도 data.txt 파일 내에 있는 비밀번호를 찾아내는 것입니다.

 

 

 

 

해석이 불가능한 이상한 문자열들이 나열되는데,

우리가 찾는 비밀번호는 앞에 등호(=)가 여러개 출력되는 상태라고 하네요. 

여기서 도움이 되는 명령어가 바로 strings라고 합니다.

 

 

보통 특정 문자열을 찾을 때 grep 명령어를 사용하는데, 여기선 단순히 grep만을 사용할 수 없습니다.

이 파일은 binary 파일이라 명령어를 쓸 수 없습니다. (grep은 binary를 처리하지 못한다고 하네요)

 

 

여기서 strings를 써주면 그나마 의미있는 문자열들을 나열해줍니다.

비밀번호는 아니지만 ====로 등호가 포함된 줄도 출력이 되네요.

 

 

 

이때!

grep과 strings를 같이 써주면 됩니다.

 

 

 

제일 아래에 있는 문자열이 바로 비밀번호입니다.

 

 

 


 

저희가 지난 4차시 스터디까지 C언어 공부를 모두 마무리했고, 

이제는 본격적으로 달고나 문서를 읽을 차례입니다.

 

 

이번 시간에는 가볍게 p.12까지 읽었는데요,

모두 BOF를 처음 공부해서 확실히 45분내에 읽고 정리하는데 시간이 부족하긴 하더라구요.

그래도 최대한 정독하고, 정리까지 마쳤습니다.

 

 

그냥 개념만 정리하는 것보다는 문서를 읽으면서 궁금한 것들을 추가적으로 검색해 해답을 찾는식으로 공부하였습니다.

 

 


서은님이 정리

 

 

<8086 시스템의 기본적 구조>

 

시스템 초기화-> 커널을 메모리에 적재, 가용 메모리 영역 확인

운영에 필요한 기본적 명령어 집합을 커널에서 찾기에 커널 영역은 반드시 저 위치

기본적 커널은 64KByte 영역에 자리 하지만 오늘날에는 확장하여 더 큰 영역을 사용

 

 

 

 

 

<하나의 프로그램이 실행되기 위한 메모리 구조>

 

하나의 프로세스 실행시 프로세스를 segment 단위로 묶어서 가용 메모리에 저장

오늘날에는 멀티 테스킹이 가능>> 여러 개의 프로세스 저장, 병렬적 작업 수행

 

하나의 segment는 최대 byte의 크기를 가질 수 있으며 segment의 구조는 위 사진과 같다 (code,data,stact)

code segment는 시스템이 알아들을 수 있는 명령어가 들어 있다(기계어 코드)

code segment는명령을 수행하면서 메모리 상의 특정 위치에 있는 명령을 지정해 주어야하는 경우가 있는데

자신이 현재 메모리 상에 어느 위치에 저장 될지 컴파일 과정에서는 알 수 없다.

따라서 segment에서는 logical address를 사용하게 된다 (실제 메모리 상의 주소 매핑)

segment selector에 의해 자신의 시작 위치(offset)을 찾을 수 있고 위치에 있는 명령어를 수행할지 결정

 

-physical address=offset+logical address

 

 

 


 

팀장이 정리

 

 

1. 8086 Memory Architecture, 8086이란?

8086은 인텔사에서 1978년에 제작한 개인용 컴퓨터를 위한 16비트 마이크로프로세서.

 

 

 

2. 범용 레지스터 약자

 

 

32비트 크기 (4바이트)

이전에는 16비트라 AX, BX로 사용되었지만, 80386 이후로 32비트로 확장되면서 Extended 되었다고 해서 E가 붙여짐.

 

 

 

 

EAX (Extended Accumulator Register) : 산술(덧셈, 곱셈, 나눗셈 등), 논리 연산을 수행하며 함수의 반환값(return)이 이 레지스터에 저장

 

EBX (Extended Base address Register) : 메모리 주소 저장 용도, ESI 레지스터나 EDI 레지스터와 결합될 수 있음.

 

ECX(Extended Counter Register) : 반복 명령어 사용시 카운터로 사용되는 레지스터. ECX 레지스터에 반복할 횟수를 지정하고, 반복 작업을 수행함. 시프트 연산자(비트 이동)에도 사용

 

ESI/EDI(Extended Source/Destination Index) : 데이터 조작, 복사할 때 소스 데이터의 주소가 저장 / 목적지의 주소가 저장

 

ESP/EBP(Extended Stack/Base Pointer) : ESP(Extended Stack Pointer)에는 함수가 진행되고 있을 때 스택 프레임의 끝 지점 주소(스택의 가장 아랫부분, 스택의 마지막)가 저장되며, PUSH, POP 명령에 따라 ESP의 값이 4바이트씩 변한다. EBP(Extended Base Pointer)에는 스택 프레임의 시작 지점 주소(스택의 가장 윗 부분, 스택의 처음)가 저장됨. EBP 레지스터는 현재 사용되는 스택 프레임이 소멸되지 않는 이상 EBP 레지스터의 값은 변하지 않는다.

 

 

 

 

 

 

 

 

다음 스터디 목표 

- Bandit 10, 11, 12 풀어오기

- 스터디 시간에 달고나 문서 p.12 ~ p.27까지 읽고 정리

 

 

 

 

 

수고하셨습니다 😁