ID: level9
PW: apple
1.
level9에 로그인해주고 cat 명령어로 hint 파일을 읽어주자.
만약 buf2의 첫 두글자가 "go" 라면, Good Skill!을 출력하고 3010,3010권한으로 bash를 실행시켜 주는 코드인 것 같다 !
3010,3010은 level10 권한이겠지!
그렇다면 어떻게 buf2 변수에 go 문자열을 넣을 수 있을까?
스택은 이렇게 되겠지?
— — —
RET[4] → 높은 주소
SFP[4]
buf2[10]
buf[10] → 낮은 주소
— — —
문제에서 요구하는 건 buf2의 첫 두글자가 "go"여야 하는데, 소스를 보면 buf만 입력받기 때문에 불가능하다.
하지만 ! 이 소스코드에서 취약점은 fgets 이다.
이 함수에서는 buf가 10바이트인데도 불구하고, 40바이트만큼 입력받는다.. 우리의 목표는 buf를 넘치게 하여, buf2 영역까지 인자가 침범하도록 하는 것이다.
이 문제를 풀 때 사전지식으로 BOF에 대해서 알아야 한다.
http://reverserbobt.tistory.com/attachment/ik2.pdf 이곳에 BOF 설명이 자세히 나와있으니 참고하도록 ... (달고나 BOF 문서)
2.
cp ./hint /tmp/level9.c -> tmp 디렉토리에 level9 c언어 파일을 만들어서 hint를 고대로 복사해라
vi /tmp/level9.c → tmp 디렉토리에 있는 level9.c 파일을 수정해라
이상한 한글들을 지워주고 소스코드만 남겨준 뒤, wq를 이용해 저장하고 나가줍니다!
gcc -o /tmp/level9 /tmp/level9.c → /tmp/level9 c언어 파일을 /tmp/level9 라는 이름으로 컴파일 해라
컴파일 해줍니다.
3.
디버깅도 해줍니다.
gdb -q /tmp/level9 → /tmp/level9 실행 파일을 디버깅 해라
보면, [ebp-40]에서 문자열을 입력받습니다.
그리고 아래에 [ebp-24]에서 문자열 비교를 해주네요.
즉, [ebp-40]은 buf의 위치, [ebp-24]는 buf2의 위치가 되는 것입니다.
이를 이용하여, 오버플로우를 발생시켜 buf2 첫 두글자가 go가 되도록 해보겠습니다.
디버깅 결과로 알 수 있듯이, buf와 buf2 사이의 거리는 16입니다.
원래는 10이여야 맞는 것 같은데, 중간에 dummy라는 쓰레기 값이 6만큼 끼었다는 걸 알 수 있습니다 ~
그러므로 16만큼 A로 대충 채운 뒤, go를 넣은 결과, buf2 첫 두 글자에 go가 들어간 것입니다!
buf[10] | dummy[6] | buf2[10]
AAAAAAAAAA AAAAAA + go
(python -c 'print "A"16+"go"';cat)|/usr/bin/bof
그와 동시에 /usr/bin/bof 을 실행한 것이지요!
buf2 첫 두글자에 go 문자열이 들어갔으므로, level10의 권한을 얻게 되었네요.
my-pass 명령어로 passwd를 취득해 줍니다. level10에서 만나요 안녕~
(2019.12에 작성한 글을 가져왔습니다.)
'Pwnable > FTZ' 카테고리의 다른 글
[FTZ] level 11 풀이 <BOF-strcpy> (0) | 2024.01.18 |
---|---|
[FTZ] level 10 풀이 <공유메모리> (0) | 2024.01.18 |
[FTZ] level 8 풀이 <John the Ripper> (0) | 2024.01.18 |
[FTZ] level 7 풀이 <진법변환, ASCII> (0) | 2024.01.18 |
[FTZ] level 6 풀이 <bbs 해킹기법> (0) | 2024.01.18 |