2019. 4. 10. 19:52ㆍSystem 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가 보입니다!
고생하셨습니다
'System Hacking > [LOB] Hacker School' 카테고리의 다른 글
[어설픈] LOB 18번succubus 문제풀이 (0) | 2019.04.12 |
---|---|
[어설픈] LOB 16번 assassin 문제풀이 (0) | 2019.04.08 |
[어설픈] LOB 15번 giant 문제풀이 (0) | 2019.04.06 |
[어설픈] LOB 14번 bugbear 문제풀이 (0) | 2019.04.04 |
[어설픈] LOB 13번 darkknight 문제풀이 (0) | 2019.04.02 |