FTZ

Layer7 14과제 -F.T.Z level 12 풀이-

건_빵 2019. 7. 9. 15:44

먼저, 저번 시간에도 말했지만 segment란 하나의 프로세스

즉, 하나의 프로그램이 실행되기 위한 메모리 구조이다.

운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 segment라는 단위로 묶어서

쓰지 않는 메모리 영역에 저장시킨다.

 

저번 내용을 보지 못 했다면 

https://adkim.tistory.com/25

 

컴퓨터 메모리 구조

시스템이 초기화 되기 시작하면 시스템은 커널을 메모리에 적재시키고 가용 메모리 영역을 확인하게 된다. 시스템은 운영에 필요한 기본적인 명령어 집합을 커널에서 찾는다. 커널이란? 컴퓨터의 운영체제의 핵심..

adkim.tistory.com

SFP(stack Frame pointer)

- RET 위에서 프로그램 메모리의 기준점

RET(retern)

- 프로그램이 종료 후 돌아가게 될 주소가 저장되는 부분

 

function prologue

함수가 시작할 때 하는 작용

function Epilogue 

함수가 끝날 때 하는 작용

 

ESP: SS(stack segment) 레지스터가 가리키는 stack segment의 맨 꼭대기를 가리키는 포인터

EBP: SS 레지스터가 가리키는 스텍상의 한 데이터를 가리키는 포인터

 

참고

stack segment

: 현재 수행되고 있는 handler, program이 저장하는 데이터 영역으로

 우리가 사용하는 버퍼가 바로 이 stack segment에 자리 잡게 된다. 또한 프로그램이 사용하는 

 mutiple 스텍을 생성할 수 있고 각 스텍들간의 switch가 가능하다.

+ 지역 변수들이 자리 잡는 공간이다.

 


위 빨간 네모를 한 부분을 잘 보자.

빨간 네모 상자 안에 첫 번째 부분은 str변수를 할당 받는 부분이다.

264를 할당 받고 있다.

그 후 그 밑에는 SFP와 RET를 할당 받는 공간이다.

따라서 메모리 구조는 다음과 같다.

Memory[RET[4], SFP[4], dummy[8], str[256]]

ftz 11과 동일한 방법이다.

 

환경 변수를 설정해주자.

환경 변수는 os가 필요한 정보를 메모리에 등록해 놓고 필요할 때마다 참조하는 영역을 의미한다.

(일반 사용자도 환경변수에 등록해서 사용이 가능)

환경변수에 등록된 데이터는 고정적인 메모리 주소를 가지고 있게 된다. 그래서 우리가 필요한 쉘코드를 환경 변수에

등록하고 이 환경 변수의 메모리 주소를 알아 올 수 있다면 우리는 ret의 값을 환경변수에

등록한 쉘코드로 변조가 가능하게 된다.

 

유의할 점은 쉘코드 내용이 실제로 경로를 포함하고 있어서 환경변수를 등록 할 때 경로임을 표시해주는 "$"를

앞에 붙여줘야 한다.

 

그리고 쉘 코드를 (python -c 'print "쉘코드"')와 같이 전달해야 메모리에서 끌어와 구동시킬 수 있다.

 

이렇게 나온 주소를 이용해서 리틀엔디안 방식을 사용하면 된다.

 

우리는 이제 pipe("|")라는 것을 이용할것이다.

지금까지의 힌트에서는 c언어가 인자로 값을 입력 받았다.

하지만 위 소스코드에서도 볼 수 있듯이 인자로 값을 입력 받는 부분이 없다.

 

Pipe 명령어는 왼쪽 표준 출력을 오른쪽의 표준입력으로 넘겨주는 역할을 한다.

또한 cat을 써줘야 한다. 왜냐하면 오버플로우 하는 코드만 있고

표준 출력을 해주는 코드가 없다면 attackme에 표준 입력이 되지 않기 때문에

두 가지 명령어를 함께 쓸 수 있게 해주는 ';'(세미콜론)을 사용하고

이를 괄호로 묶어서 pipe로 넘겨주면 될것 같다.

 

have no clue