LOB_12.golem->darkknight
해킹/LOB 2016. 1. 28. 16:12
음.. 드디어 리턴주소 자체를 덮을 수 없게 되었다.
main에서 problem_child라는 함수를 호출하여 40바이트 버퍼에 41바이트를 strncpy하여 1바이트만 덮도록 되어있다.
즉 problem_child의 SFP, 그중에서도 마지막 1바이트만 덮을 수 있다.
http://satanel001.tistory.com/59
전에 fake ebp관련 공부하면서 함수의 프롤로그와 에필로그에 대해서 공부한 내용이다.
이부분을 어느정도 숙지하고 있어서 이 문제를 해결하는데 그렇게 애를 먹지는 않았다.
모르고있었다면 정말 막막했을듯...
스택에서 이 SFP라는 녀석은 항상 ebp가 가르키는 주소에 들어있는데 바로 뒤 4바이트에 리턴 주소가 들어있다.
둘은 용도도 유사하다. 리턴 함수가 끝나고 돌아갈 코드영역의 주소인것 처럼 SFP는 함수가 끝나고 돌아갈 이전 함수의 ebp를 가지고 있다.
자세한건 위 포스팅을 참고하고.... 이 배경지식을 바탕으로 공격 계획을 짜보면.
1.problem_child의 SFP를 변조한다.
2.이 SFP는 problem_child의 에필로그 과정을 거쳐 함수 main의 ebp로 사용된다.
3.main은 이 조작된 ebp의 다음영역 즉 ebp+4부분을 리턴으로 인식해서 점프할 것이다.
4.그러므로 스텍 어딘가에 쉘코드와 그 시작주소를 넣어주고
5.시작주소 -4부분으로 problem_child의 SFP를 변조해주면 되겠다.
이런 계획을 바탕으로 동적 디버깅을 해보자.
입력값은 a 4자리와 마지막 41번째의 c 한자리, 가운데는 전부 b로 채워줬다.
블록지정한 부분이 SFP 부분인데 보이는것처럼 한바이트가 0x63('c')로 덮혀있다.
이제 할것은 저 a로 덮인 4자리에 리턴주소를 넣어주고 그 앞 4바이트인 0xbffffa80으로 main의 ebp를 바꿔줄 것이다.
그러기 위해선 블록지정한 SFP의 0x63한바이트를 0x80으로 바꿔주면 되겠다.
a에 들어갈 리턴주소는 0x62('b')가 시작되는 부분으로 넣어주면 main이 끝나며 b로 덮힌 영역을 실행할 것이다.
이부분에 쉘코드를 넣어주면 된다.
최종적인 페이로드는
./darkknight `python -c 'print "\x88\xfa\xff\xbf"+"\x90"*11+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"+"\x80"'`
이렇게 된다. 시도해보자.
성공했다.
코드를 보니 이런형태의 공격을 FPO라고 하는 모양이다.
끝-
'해킹 > LOB' 카테고리의 다른 글
LOB_번외.bash2의 함정. (0) | 2016.01.29 |
---|---|
LOB_13.darkknight->bugbear (0) | 2016.01.29 |
LOB_번외.my-pass파일을 공격해서 한번에 마지막까지 뚫기 (0) | 2016.01.27 |
LOB_11.skeleton->golem (0) | 2016.01.27 |
LOB_10.vampire->skeleton (0) | 2016.01.22 |