-
해커스쿨 ftz level20System/HackerSchool ftz level 2019. 7. 9. 01:27
마지막 레벨입니다!
이번에도 level18에 비하면 너무 허전하네요 그런데 중요한건 이번 레벨에서는 BOF가 안 먹힙니다!
특별히 코드 해석을 한번 해보자면, bleh라는 80바이트 배열을 초기화한 뒤 79바이트만큼의 문자를 입력받고 그대로 다시 출력하는 코드거든요
순서를 보자면 setreuid 명령어는 문자열을 입력받는 명령 위에 있구요
ㅇ? 암튼 그래서 BOF가 안 먹혀요 그럼 어떡해야 되냐
여기서 취약점이 뭐냐면 printf(bleh) 이 부분인데요 이 경우에는 FSB(포맷 스트링 버그)를 노려볼 수 있어요
간략하게 설명해볼게요 보통 printf() 함수를 사용할 때는 printf("%s", var) 이런 식으로 사용하잖아요(예시를 들자면?) 그런데 지금 코드에서는 bleh라는 80바이트짜리 배열을 지정하고는 그걸 그대로 printf() 함수에 집어넣었단 말이죠
그게 취약점입니다 네 그렇대요 더 자세한 건 다른 문서 찾아보시면 훨씬 더 자세하고 명확한 정보를 얻을 수 있으니 그쪽을 추천드리구요 ^!^
그래서 attackme 파일을 실행시킨 뒤 특정 문자 + 다음 서식문자를 넣으면 12바이트 뒤에 입력한 문자들이 그대로 나타나는 것을 볼 수 있지요 (A는 아스키코드표에 따라 41이기 때문)
그러면 다음으로 할 짓은 printf() 함수의 소멸자 .dtors 주소 확인입니다
printf() 함수가 사라짐과 동시에 프로그램이 끝나는데, 그 틈에 printf() 함수의 소멸자를 찾아 거기에 딱 쉘코드를 삽입해버리면 쉘이 따일 거라는 예상이 되기 때문이죠?
따라서 환경변수에 에그쉘을 설정한 뒤, tmp 파일로 이동 / getenv.c에 환경변수 EGG의 주소를 확인하는 코드 작성, getenv C파일 컴파일 뒤 실행하면 0xbffffc8d 주소에 EGG의 주소가 있음을 확인할 수 있습니다
근데 0xbffffc8d의 정수값은 x86 시스템에서 지정할 수 없는 크기이므로, 반으로 쪼개야 되거든요
이걸 해주는게 %n(FSB에서 빈번하게 쓰이는 서식문자 중 하나, 다른 하나는 %x임)입니다
0xfc8d(64653) -> 0x08049598, 0xbfff(49151) -> 0x0804959a 에 저장하면 됩니다.
끝 아닙니다 뭔가 FSB도 좀 어려운 부분이 있는게 이 자릿수 계산인 거 같아요..
AAAA\x94\x95\x04\x08AAAA\x96\x95\x04\x08%8x%8x%8x%8x 여기에
64653 에서 자릿수 40바이트를 빼서 64613으로 만들어주고, %n이 앞자릿수도 계산한다는 것을 감안해서 64653을 0xbfff에서도 빼줘야 합니다. 근데 0xbfff에서 빼면 음수가 나오기 때문에 0x1bfff에서 빼면 50034가 나와요
사실 이해 안 가네요ㅎ 복습해야지
그래그래 기계어 코드 짜고 실행시켜주면 쉘코드가 작동되면서
짜잔 FSB를 이용한 쉘따기 성공이네요
hackerschool level 후기)
트레이닝을 작년 이맘때 시작했을텐데 중간에 잠복기 빼면 한 7개월?만에 웬만큼 포너블에 익숙해진듯 하네요
앞으로 더 어려운 내용 접하고 할때마다 포기하고 싶어질지도 모르겠다만
처음 시작했을 때 마음을 잃지 않고 잘 해나가고 싶네요 ㅎㅇㅌ
2019.7.9
해커스쿨 레벨 끝, LOB 시작..?
'System > HackerSchool ftz level' 카테고리의 다른 글
해커스쿨 ftz level19 (0) 2019.07.08 해커스쿨 ftz level18 (0) 2019.07.08 해커스쿨 ftz level17 (0) 2019.06.15 해커스쿨 ftz level16 (0) 2019.06.15 해커스쿨 ftz level15 (0) 2019.06.14