티스토리 뷰

[Hackerschool] F.T.Z

해커스쿨 - level18

lHATAl 2017. 11. 16. 04:32

우선 level18의 힌트를 읽어보도록 하자.



문제의 최종 목적을 shellout() 함수를 동작하도록 하는 것이다.


그리기 위해서는 메모리 조작이 필요하고 메모리 구성을 확인하기 위해 gdb를 확인하였다.



여기서 buf 변수는 스택의 가장 최상위에 존재하므로 check에 대해 값을 바꾸기 위해서는 인덱스값이 음수가 되어 메모리를 수정해주면 된다.


우선 각 변수들에 대해서 정확한 메모리 구조를 알기 위해서 각각의 변수를 사용할때 어떤 위치에서 끌어다 쓰는지 확인할 필요가 있다. 


우선 전체적인 사이즈로 0x100(256)bytes를 최초에 확보하였으므로 모든 지역변수의 사이즈 + dummy 의 값이 256bytes가 되는 것이다.



어셈블리의 코드를 분석해보면 각 변수들의 위치는 다음과 같다.


fds(ebp-256) / count(ebp-112) / x(ebp-108) / check(ebp-104) / string(ebp-100) / SFP / RET



 메모리의 위치를 고려하면 count, x, check, string 사이에는 더미가 없게된다.


입력을 string에 받게 되는데 스택의 가장 높은 메모리 주소에 존재하기 때문에 버퍼 오버플로우로는 공격을 할 수 없다. 따라서 코드의 구성을 조금 더 살펴볼 필요가 있었다.



다음은 switch 조건문이다. default 문구르 확인해보면 count에 대하여 값을 삽입하게 되는데, x의 값이 0x08일 경우 count에 대하여 1씩 줄여주게 된다. 이를 응용하여 string의 인덱스값을 음수로 지정할 경우 높은 메모리 주소이지만 보다 낮은 메모리 주소에 존재하는 check 변수에 접근할 수 있게된다. 따라서 해당 문제의 공격 방법으로는


0x08을 4회 입력하여 string 변수로부터 -4만큼 낮은 곳으로 접근하여, 즉 check 변수에 접근하여 0xdeadbeef로 변경을 하면 된다.


프로그램을 실행하여 직접 입력하여도 괜찮고 다른 방법으로는


$(python -c 'print "\x08\x08\x08\x08" + "\xef\xbe\xad\xde"'; cat) | ./attackme


형식으로 공격을 해도 가능하다.

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

해커스쿨 - level20  (0) 2017.11.17
해커스쿨 - level19  (0) 2017.11.17
해커스쿨 - level17  (0) 2017.11.16
해커스쿨 - level16  (0) 2017.11.16
해커스쿨 - level15  (0) 2017.11.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함