티스토리 뷰

[Hackerschool] F.T.Z

해커스쿨 - level15

lHATAl 2017. 11. 16. 02:16

level15의 힌트를 확인해보자.



level14와 매우 유사한 코드를 가지고 있지만 한가지 차이점이 있다. 바로 check 변수가 포인터형이라는 것이다. 즉 check의 값이 0xdeadbeef가 되는 것이 아닌, check가 가리키는 값이 0xdeadbeef가 되도록 해주면 된다. 따라서 공격 방법으로 buf 변수에 0xdeadbeef를 입력해놓은 다음 check의 값을 buf 변수의 시작 주소값을 덮어씌워 주면 공격을 성공할 수 있다.



gdb를 통하여 분석한 디스어셈블링을 통해 메모리의 배치가 level14와 마찬가지인 것을 확인할 수 있었다.


$(python -c 'print "\xef\xbe\xad\xde"+"A"*36+"[buf시작주소]"'; cat) | ./attackme 라는 명령어로 공격할 수 있게된다.


추가적인 방법으로는 환경변수에 0xdeadbeef 를 기록하여 포인터의 값을 환경변수가 저장된 주소로 유도하는 방법이 존재한다.


우선 export DEADBEEF=`python -c 'print "\xef\xbe\xad\xde"'`로 환경변수 DEADBEEF라는 값을 생성해준다.



다음은 해당 환경변수의 주소값을 출력할 수 있는 코드이다.


ptr += (strlen(argv[0]) - strlen(argv[2]))*2; 의 경우


프로그램의 이름 길이마다 환경변수의 주소가 달라질 수 있기 때문이다.



다음과 같이 환경변수의 주소값을 확인할 수 있고 이를 통해 check가 가리키는 주소값을 0xbffffef1으로 유도할 수 있다.


$(python -c 'print "A"*40+"\xf1\xfe\xff\xbf"'; cat) | ./attackme


로 공격이 가능해진다.

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

해커스쿨 - level17  (0) 2017.11.16
해커스쿨 - level16  (0) 2017.11.16
해커스쿨 - level14  (0) 2017.11.16
해커스쿨 - level13  (0) 2017.11.15
해커스쿨 - level12  (0) 2017.11.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함