[어설픈] LOB 17번 zombie_assassin 문제풀이

2019. 4. 10. 19:52System Hacking/[LOB] Hacker School

안녕하세요!

오늘은

LOB 17번 문제인 

zombie_assassin을 풀어보도록 하겠습니다!

소스코드는 아래와 같습니다!


근데 문제 힌트에서

calling functions continuously! 라고 

적혀있네요!


"함수를 계속해서 호출한다!"

이렇게 이해하시면 됩니다!


inspector(확인하는 사람)라는 변수가 

전역으로 선언되어 있네요!

그 값엔 0이 있습니다!


그리고 밑에 있는

도(do) 개(gye) 걸(gul) 윷(yut) 모(mo) 함수들을 하나씩 보면

각각의 함수가 실행되기 전에

전역변수 check의 값을 확인합니다!


그래서 도->모까지 계속 함수를 실행시켜 주면됩니다!

무슨말이냐?


우리나라의 전통 윷놀이에서 

도:1 개:2 걸:3 윷:4 모:5 

이렇게 되어있죠?


도 함수에서 check의 값을 1로 설정합니다!

그리고 

개 함수를 실행시키면 

개 함수에서 check 값이 1인지 확인하고!

check 값이 1이면 

"개에 온 걸 환영합니다!"

출력하고 check의 값을 2로 바꿔줍니다!


그 이후에는 같은 패턴으로 반복합니다!

그래서 도개걸윷모 순서로

호출을 해야 함수가 문제없이 

계속 호출됩니다!




그러면 이제 main 함수를 한번 살펴 볼까요?

argv형식으로 인자를 받네요!


버퍼[40] 할당

char 형의 addr 포인터 변수 할당


argument는 2개 미만이면 오류!

library로 return 못하게

argv[1]에 \x40가 있으면 exit!


그리고 main함수의 ret address가 

도(do) 함수의 시작 주소와 같지 않으면 exit!


그 다음에 취약한 overflow가 일어남!

그리고 뭐 스택을 지지고 볶고 지우고 난리가 납니다

근데 다행히 buffer+48+100 부터 메모리가

0으로 초기화 되어서!


buffer+48(=ret address까지의 주소)에서

뒤에 100byte 0으로 초기화 안당하고

저희가 쓸 수 있네요!




자 이제 문제 분석을 마쳤으니

어떻게 풀지 payload을 대략적으로 구성해볼까요?


( buffer[40]+ebp[4] )44 dummy+ret_address[4]+개 주소+걸 주소+ 윷 주소+ 모 주소+aaaa(더미)+/bin/sh주소+"/bin/sh" 문자열 직접 입력


물론 아래와 같이 /bin/sh 주소 구해서

넣어도 되지만!


이번에는 payload에 /bin/sh를 직접 넣고!

그 주소 값을 넣도록 하겠습니다! 


위에서 제가 도 개 걸 윷 모 함수 주소를 넣어야 한다고 했죠?

그러니 nm 명령어를 이용해서 

succubus에 있는 do gye gul yut mo 함수 주소를

모조리 구해줍니다!


※몰랐는데 grep에 옵션 -E(대문자로!) "검색할 키워드 1 | 검색할 키워드 2"

이렇게 주면 키워드 1, 키워드 2 모두 다 구해져요!



그래서 구해준 주소들 가지고

입력 값에 넣어주면 아래와 같이 

미완성의 payload가 완성됩니다!


aaaa는 더미 값

bbbb는 /bin/sh가 들어갈 주소 값입니다!


함수들이 알아서 잘 호출되죠?



segmentation fault가 떠서

코어파일이 생성되었으니

그 파일을 열어보도록 할까요?


core 파일을 열어서 이제

우리의 /bin/sh 문자열이 어디 숨어있나

숨바꼭질 놀이를 좀 해봅시다

 


계속 쭉쭉 내려가다 보니!

여기 0xbffffa98에 숨어 있는게 

보이네요!



자 그러면 final paylaoad를 완성시켜 줍시다!


더미 44개 + 도 주소+ 개 주소+ 걸 주소+ 윷 주소 + 모 주소+ 더미(4)+/bin/sh 주소+ /bin/sh 문자열 직접입력


자 여기서 궁금해 하실 point 두 개 !

1) 저렇게 함수 연달아서 놓으면

함수의 인자로 오해할 수도 있지 않냐?


A: 모 함수 말고 도 ~ 윷 함수까지 보시면

함수의 인자 부분에 void라고 적혀있습니다!

인자 안 받는다는 소리죠!


2) 왜 /bin/sh 문자열 주소를 넣냐?


A: mo 함수만 인자를 받는데, 

이 인자는 system 함수의 인자로 들어갑니다!

그냥 아무 인자도 안주면 그냥 system 함수만 실행됩니다!

따라서 /bin/sh를 줘야 저희가 원하는 쉘이 떨어집니다!


결론적으로 아래와 같이 최종 페이로드를 완성하면

shell이 따이고  아래와 같은 password가 보입니다!


고생하셨습니다