본문 바로가기

코드^학습/워게임풀이(약간)

해커스쿨 level11 풀이

레벨11은 기초적은 BOF를 이용하여 다음단계 권한을 얻는 문제입니다.

이제 막 공부를 시작한 저로서는...조금 힘들었지만 여기저기에 물어보고 찾아보고 하면서 풀었습니다.

(인터넷엔 정말 풀이가 상세해요! 구...굳!)


그래서 저도 하나 남겨봅니다.

힌트를 한번 보죠!



그렇다면 attackme의 어셈코드를 살펴봅니다.

다른 블로그에도 나와있지만 총 3가지 함수로 이루어져 있군요. setreuid, strcpy, printf 함수입니다.

그럼 이 코드를 보면서 스택을 직접 그려봅시다. (그러면 이해가 빨라져요ㅋ)

직접 사진으로 찍었습니다(올ㅋ 하지만 글씨가 개판인게 함정)


아무튼 strcpy가 가지는 버퍼오버플로우의 취약점을 이용합니다.

이 메인함수는(hint를 cat하면 볼 수 있는) 실행할 때 인자를 받을 수 있으므로 bof를 통해서 level12의 권한을 얻을 수 있습니다.


단번에 알아보기 힘들 수 도 있지만 결과적으로는 strcpy함수까지 끝이 났을 때 esp는 epb로부터 264바이트 내려간 위치에 있습니다.


이제 gdb로 main를 디스어셈블하고 strcpy에서 breakpoint를 잡습니다.

여기에서는  b *main+48 이렇게 합니다.


이제 nop와 쉘코드 (제공된 25byte의 shellcode : \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)를 이용하여 ret의 자리에 shellcode를 실행할 수 있는 주소를 찾습니다.


아! 쉘코드를 어떻게 만드느냐? 그건 지금 초입인 저로서는 몰라요...

Google神에게 여쭤보면 신탁을 내려주세요. 찾아보세요.

그리고 굳이 nop가 아니더라도 a같은 글자를 넣어도 되요. 다만 nop를 사용하면 읽어올때 무시하고 다음글자로 계속 넘어가니까, 저는 이걸 사용합니다.


이렇게 넣고 내부를 살펴보면


이렇게...뭔소리인지 알 수 없는 결과가 뜨죠...

안 되는 이유는 breakpoint가 지금 strcpy에 잡혀있는데 bof를 일으키려면 strcpy함수가 실행되어야하기 때문입니다.

breakpoint를 1개 더 잡아서(b *main+66) strcpy를 실행하고도 잠시 멈춘 후에 다시 살펴봅니다.


이제야 제대로 뜨네요 와~


붉은 칸부터 박아넣은 쉘코드입니다. 그럼 그 전에 있는 주소 아무거나 잡아서 넣는다면 차례차례 타고 가면서 쉘코드를 만나고 실행될 것입니다.


자 이제 ret에 넣을 주소도 알았으니

최종공격 코드를 만들어봅니다.

`perl -e 'print "\x90"x75,"\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","\x90"x168, "\x50\xf9\xff\xbf"'`


최종실행하면...



와 성공했다~~~

'코드^학습 > 워게임풀이(약간)' 카테고리의 다른 글

해커스쿨 level12 풀이  (0) 2012.08.14
Level 3 풀이  (0) 2012.08.14
Level 2 풀이  (0) 2012.08.14
Level1 풀이  (2) 2012.07.23
Level 0 풀이  (0) 2012.07.19