본문 바로가기

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

해커스쿨 level12 풀이

레벨12입니다.

구조는 똑같습니다. 다만 입력받는 방식이 다르죠

스택구조같은 것은 레벨 11의 풀이를 참조해주세요. 같습니다.ㅎ


힌트를 살펴보죠!


권한을 상승하는 setreuid는 있고... 문장을 입력하는 gets와 출력해주는 printf가 있네요ㅋ

어셈코드를 확인해 보시면 알겠지만 11번 과 동일합니다ㅎ


즉 ret까지 도달할 빈공간은 268이죠ㅎ(버퍼 264 + ebp 4 = 268)


먼저 레벨11에 썼던 방법으로는 레벨12를 통과할 수가 없습니다.

(쉘인지 뭔가가 뜨기는 하는데...id나 그런명령어는 듣지 않아요. 이렇게 말이죠)

11번에서는 srtcpy의 취약점을 이용했구요 12번에서는 gets의 취약점을 이용하기 때문이라 생각합니다.


아무튼 공격 시나리오는 레벨11과 동일하게

1. 버퍼에 쓰레기값을 채우고 쉘코드를 넣은 다음

2. 다시 쓰레기값을 채워서 ebp까지 덮어주고

3. ret에 삽입이 되도록 쉘코드 전의 주소를 넣어주면 끝나는 방식입니다.

하지만 아까 위에서 말했듯이 입력하는 방법이 이번에는 다르다는거죠ㅎ


(Ezbeat님의 블로그에서 보시면 11번과 다르게 main함수에서 입력받기 때문에 ebp의 위치가 고정적이라 하고

Geundi님 블로그에서는 gets로 짠 코드는 입력받는 글자의 개수를 정해주지 않기때문에 BOF가 일어나기 쉽다고 합니다ㅎ)


자 풀어봅시다.

이번 공격코드의 형태는 (perl –e ‘print “공격코드”;cat) | ./attackme 이렇습니다.

생소한게 ;cat과 | 가 있다는 것이죠. 이건 짚고 넘어가겠습니다. (제가 그렇게 배워서ㅎㅎ)


먼저 명령어 뒤에 쓰이는 ;(세미콜론) 입니다.

; 를 쓰게 되면 한줄의 명령어 안에 여러개의 명령어를 넣을 수 있습니다.

예시를 보면 딱 이해됩니다.


이해하셨죠? ls와 whoami와 id를 한줄에 넣고 세미콜론으로 구분해주면 따로따로 실행이 됩니다.


cat은 표준입력받는 것이니 대략 아실테고...

| 는 Pipe라고 하는데 Pipe왼쪽명령어의 출력을 오른쪽 명령어로 보내는 역할을 합니다.


공격코드에 cat을 주어 표준입력으로 받은 이유는 코드안에 gets가 있기때문이리라 생각합니다.

자 그럼 공격코드를 만들어보죠!


11의 공격코드를 이용해서 변형 and 가공하면

(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, "\x40\xfa\xff\xbf"';cat) | ./attackme

가 되겠습니다.

(ret에 덮어쓸 주소가 레벨 11과 조금 다른 이유는 그대로 하면 [세그멘테이션 오류]가 뙇하고 뜨는 이유로ㅠ

주소를 바꿨습니다. gdb로 주소위치를 보면서 하는게 좋긴하지만 전에 스샷으로 찍은게 있어서 그렇게 하였네요ㅎ)



이렇게 실행을 해보면!

성공!

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

Level 5 풀이(진행중)  (0) 2012.08.22
Level 4 풀이  (0) 2012.08.14
Level 3 풀이  (0) 2012.08.14
Level 2 풀이  (0) 2012.08.14
Level1 풀이  (2) 2012.07.23