-
해커스쿨 ftz level16System/HackerSchool ftz level 2019. 6. 15. 02:49
새벽이 찾아왔습니다. 주인장은 글을 써주세요.
이번엔 좀 다른 형태의 BOF 문제인거 같네요 void로 shell()과 printit() 함수를 정의한 뒤 main에서 이러쿵저러쿵 하고 있습니다
간략하게 각 함수의 역할을 설명하고 가자면 shell()은 그대로 쉘 따주는 함수, printit()은 Hello there! 이라는 문장을 출력해주는 함수고, main()은 본 프로그램이 실제로 작동하는 함수죠
여기서 main함수의 두번째줄 코드가 이해가 안 가서 검색해본 결과, 함수 포인터 call 선언 뒤 그에 printit을 대입하는 코드라고 하더군요. 굳이 포인터로 한 이유는 아마도 디버깅할 때 주소값 찾기 편하라고 그런 거 같네요
아무튼 이 코드를 보고 우리가 해야 할 일은 buf에서 오퍼플로우를 일으켜서 *call 부분에 shell 함수의 주소를 덮어씌우면 대신 shell함수가 실행될 거라는 겁니다
아니 그래서 할 일은 shell 함수의 시작주소를 일단 알아내야죠 더불어 main함수에서 함수간에 떨어진 차이도 알아야 하고요
뭐 모르겠다 싶으면 일단 gdb 키는겁니다 하하
<main+24>와 <main+36>에서 봤듯 일단 40바이트만큼 채워준 뒤에 shell의 주소를 덮어씌워야 될듯 합니다
음 근데 <main+6>의 0x8048500은 어떤 주소일까요 뭐 main함수에서 본다면 printit의 주소일 거 같긴 하지만
저 주소를 찾기 위해 shell의 시작부분 주소를 확인했더니 아니네요? 그럼 printit이겠네요
아 아무튼 shell 함수의 시작주소는 0x080484d0입니다
네 역시 printit 맞죠 0x08048500
그렇게 파이썬으로 공격해주면 성공적으로 쉘을 딸 수 있습니다
약간 새로운 코드라 겁먹었는데 별거 아니네요 하하^
2019.6.15
졸려도 행복합니다
'System > HackerSchool ftz level' 카테고리의 다른 글
해커스쿨 ftz level18 (0) 2019.07.08 해커스쿨 ftz level17 (0) 2019.06.15 해커스쿨 ftz level15 (0) 2019.06.14 해커스쿨 ftz level14 (0) 2019.06.13 해커스쿨 ftz level13 (0) 2019.06.12