FTZ level 16
- Question
· level16 ID로 Login해서 level17의 password를 찾기
- Solution
· 'level16' Directory의 hint 내용을 확인해보면 Hint로 attackme File의 Source Code가 제공된다.
· Source Code 분석
◦ Stack Memory 영역에 crap 변수를 4Byte만큼, buf 변수를 20Byte만큼 확보한다.
◦ call이라는 함수 변수에 printit 함수의 주소를 넣어 printit 함수를 실행시킨다.
◦ 'fgets' 함수가 사용되었으며 이를 이용해 BOF 공격을 해야 한다.
· File을 분석하기 위해서는 gdb를 사용해야하는데 원본 File이 level14에 대해서만 쓰기(w)가 가능하므로 쓰기 권한이 주어진 tmp Directory에 복사 후 분석해야한다.
· gdb를 이용한 분석
◦ 0x38(56Byte) 만큼의 Stack Memory 영역을 확보한다.
◦ EBP-16에 0x8048500을 저장한다.
◦ EAX에 EBP-16의 값(0x8048500)을 복사해 실행시킨다.
◦ printit 함수의 내용을 확인해보면 처음 시작 주소가 0x08048500이라는 것을 확인할 수 있으며 앞서 Main 함수에서 EBP-16에 복사한 값(0x8048500)이 printit의 시작 주소라는 것을 알 수 있다.
◦ 즉, EBP-16영역에 shell 함수의 주소를 복사하면 shell 함수가 실행된다는 것이 된다.
◦ shell 함수의 내용을 확인해보면 shell 함수의 주소가 0x80484d0이라는 것을 알 수 있다.
· 명령어를 이용한 공격
◦ EBP-16에 저장된 주소 값을 call 함수에서 호출하므로 40Byte(56-16)를 NOP로 채워줘 EBP-16의 값을 shell 함수의 값으로 바꿔준다.
◦ Python을 이용해 공격해본다.
◦ 명령어
1 | (python -c 'print "\x90"*40+"\xd0\x84\x04\x08"';cat)|./attackme | cs |
· Password 확인
◦ my-pass 명령어로 Password를 확인해본다.
- Answer
· Password : king poetic
'System Security > FTZ' 카테고리의 다른 글
FTZ level18 (0) | 2015.08.18 |
---|---|
FTZ level17 (0) | 2015.08.18 |
FTZ level15 (0) | 2015.08.18 |
FTZ level14 (0) | 2015.08.18 |
FTZ level 13 (0) | 2015.08.18 |