본문 바로가기
HACKING/HACKERSCHOOL FTZ

hackerschool ftz level 11, 12 문제 풀이

by pharmerci 2021. 5. 12.
728x90

level11

한달만에 쓰는 글인것 같다..!(자료구조 짜증나ㅜㅜ) 앞으로는 학교에서 배운 내용도 블로그에 써봐야겠다.

 

오늘도 역시 hackerschool ftz를 풀어보자! level 20까지 달려야겠다..

 

 

 

 

오랜만에 켜서 까먹고 있다가 전에 내가 써둔 블로그 글 보고 다시 천천히 따라해보기..! 이래서 블로그를 쓰는건가?

암튼 putty 켜서 아이디랑 비밀번호 이전에 찾아둔거 입력하고~

 

 

 

 

 

파일에 뭐가 있나~ 살펴보면 볼만한게 일단 hint! hint 안을 뒤져보니 다음과 같은 소스코드가 있다.

attackme 를 이용해서 비밀번호를 구하는 것 같으니 이 소스코드는 attackme의 소스코드인 듯 하다.

str을 256바이트의 크기로 정했는데 입력값의 크기는 제한되지 않았다. 이것으로 버퍼오버플로우 문제인가? 라고 생각할 수 있다.

 

 

 

 

 

gdb를 이용해서 hint를 뒤져보려고 했으나 에러가 났다. 위의 ls에서 봤듯, 권한이 없어서 그런것으로 보인다.

 

 

 

 

 

 

그래서 tmp라는 파일에 이 파일을 level11라는 이름으로 복사를 해주었다. 확인해보니 권한이 있어서 gdb로 뒤져볼 수 있을 것 같다.

 

 

 

 

 

 

gdb를 이용해 뒤져주고! 디스어셈블을 해보니 main+41에서 주소를 옮기는 명령어가 일어나고, main+48에서 복사가 일어나는 것 같다.

lea 명령어는 찾아보니 주소값을 옮겨주는 명령어라고 한다. mov는 값을 옮겨주는 명령어라 차이가 있다고..!

암튼 마지막쪽에 8바이트는 쓰레기값으로 존재하고 있다.

 

스택 구조는

str[256]

dummy[8]

SFP[4]

RET[4]

이렇다고 볼 수 있다. SFP는 스택프레임을 거치고, 함수가 돌아가야할 위치를 저장해둔 포인터이다.  즉, 함수가 호출되기전의 스택의 흐름을 그대로 유지하기위한 레지스터 (?) 라고 한다.

 

쉘코드를 사용할 것인데, 쉘코드는 명령쉘을 시작해서 원하는 곳부터 공격이 일어날 수 있도록 돕는 코드라고 할 수 있다. 여기서는 25바이트 쉘코드를 이용할 예정이다. 그리고 앞에는 NOP를 의미하는 \x90으로 채울 것이다.

 

이 코드를 입력한 후 b* main+53을 입력하여 strcpy 명령어가 일어난 후인 위치에 break point를 건다.

 

 

 

 

 

 

r `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"AAAA"'`

그래서 이런 코드를 입력해주고 x/100 $esp로 내부에 들어간 쉘코드를 확인해보면 0xbfffff5b0 부터 0x90909090이 시작된다.

여기를 리턴주소로 잡고 tmp/attackme를 실행해보자

 

 

 

 

 

 

그래서

./attackme `python -c 'print "\x90"*243+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\xb0\xf5\xff\xbf"'`

이 코드를 gdb 를 나와서 입력해주면 segmentation fault가 나는데 이 주변에 코드를 노가다로 입력해주다보면 맨 아래처럼 sh-2.05b$ 로 명령어를 입력하는 부분이 바뀐다.

여기는 우리가 아까 복사한 파일이니까 저 코드 그대~로 실제 파일에 적용해보자

 

 

 

 

 

 

실행해보면 역시나 똑같이 명령어 입력부분이 바뀌고 my-pass로 명령어를 입력하면? 다음과 같이 비밀번호가 나온다!

 

 

 

 

 

 

level12

level12 시작! 방금 얻은 비밀번호로 로그인을 하고 나서, ls -al로 안에 뭐가있는지 찾아봤다.

보니 attackme파일을 이용해야 할 것 같고, hint 파일도 있따.

hint 파일 열어보니! 소스코드가 있다. level11이랑 비슷한듯 다른 모양인데 다른점이라 하면 문자열을 입력받는다는 거!

 

 

 

 

 

 

gdb로 attackme를 뜯어보자. main+49를 보면 ebp-264부터 입력을 받았다.

level11처럼

str[256]

dummy[8]

SFP[4]

RET[4]

이런 구조인 듯 하다.

 

 

 

 

 

 

환경 변수를 이용하여 풀어볼 것인데, tmp 폴더로 이동해서 export를 이용해서 원하는 동작을 사용자 임의로 등록할 수 있다. 여기에 우리는 쉘코드를 넣을 것이다. 위에서 넣었던 쉘코드를 python -c print를 이용해서 넣어준다.

 

그리고 환경변수에 등록된 쉘코드의 주소를 알아보기 위해서 int main() printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c 이렇게 간단한 c언어 코드를 만들었다.

 

gcc는 파일을 컴파일하겠다는 의미이고!

 

만든 c언어 코드를 실행해보니 쉘코드의 주소가 출력되었다. 이걸 바탕으로 문제를 해결할 수 있겠다!

 

 

 

 

 

 

이제 저 주소를 리턴주소로 잡고 bof를 한다. attackme 프로그램은 입력을 gets함수로 받으니까 이것이 아닌 다른 형태로 프로그램을 실행해야 한다.

(python -c 'print"\x90"*268+"\x8d\xfc\xff\xbf"'; cat) | ./attackme 이렇게!

 

굵은 글씨 처리되어 있는 곳이 리턴주소라고 할 수 있다.

그러면 아까 힌트에서 봤던대로 문장을 입력하라는 문구가 뜨고 임의로 문자들을 입력해주면? 일반적인 명령어 입력창이 안뜨는데 여기에 my-pass를 입력하면! 비밀번호가 뜬다!

 

 

728x90