일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- #Best of the Best #OS #MINT64 #Sqix
- BEST of the BEST
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- Overwatch League SaberMetrics
- C++11
- FTZ 레벨2
- Network
- vi
- libtins
- libpcap
- Find
- KASAN
- #Qt Creator
- #MINT64 #Sqix
- command
- 오버워치
- ftz
- >
- vim
- 오버워치 세이버메트릭스
- vi 외부 명령어
- #
- linux
- Sqix
- #IntelManual
- 인터럽트
- Today
- Total
Sqix
FTZ Level6 본문
Level6에 접속하여 들어갑니다.
=================================================
hint - 인포샵 bbs의 텔넷 접속 메뉴에서 많이 사용되던 해킹 방법이다.
메뉴
텔넷 접속 서비스
1 . 하이텔 2. 나우누리 3. 천리안
=================================================
위와 같이 1,2,3 어떤 메뉴를 들어가더라도, Connection Refused라는 텔넷 에러 메세지와 함께 연결이 종료됩니다.
혹시나 해서 저 메뉴 입력 상태에서 bash 쉘의 명령어들을 쳐 보았지만 바로 프로그램이 종료됩니다.
input 화이트리스트 검사를 하는지 테스트를 하기 위해서 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 등
다양한 입력들을 넣어 보았지만 전부 종료되는 것으로 보아 1,2,3이 들어오지 않으면 바로 접속 종료를 시키는 것 같습니다.
hint에서 메뉴로 넘어오기 위해 Enter를 한 번 쳐야 하는데, 여기서 input이 먹히나 싶어서 넣어 보았습니다.
그냥 버퍼에 남아서 밑으로 내려오는 것 같습니다.
그러던 중, 다른 작업을 잠시 하기 위해 hint에서 CTRL + C를 눌렀더니 바로 쉘이 떨어졌습니다.
????????
ls를 했더니, password와 tn이라는, 기존에 없던 파일이 있었습니다.
우선 password는 ascii text라고 해서, cat을 해 보았더니 다음 비밀번호가 나왔습니다.
tn은 elf 파일이기에, 혹시 분석이 가능할까 싶어 gdb를 올려 보았습니다.
main이 바로 보였기 때문에 bp를 걸고 바로 분석을 시작합니다.
push ebp
mov esp, ebp
sub 0x8, esp
첫 줄은 이전 스택의 베이스 포인터를 저장해 놓고, 해당 함수에 대한 스택공간을 확보하는 작업을 합니다.
sub 0xc, esp
push 0x80486f2
call 0x8048384 <system>
add 0x10, esp
그 후 바로 systemcall을 하고, 스택공간을 정리해 줍니다.
x/2s 0x80486f2 (해당 주소의 문자열을 순서대로 두 개 출력) 명령어를 이용해서 문자열을 검색해 봤습니다.
즉, syscall에서 어떠한 것을 검색하는지 봤습니다.
syscall에 들어가는 것은 cat hint 문자열, 즉 hint file의 문자열을 긁어오는 것입니다.
call 0x8048354 <getchar>
그 후, getchar를 이용해서 하나의 문자를 받아옵니다.
sub 0xc, esp
push 0x80486fb ( "clear " )
call 0x8048384 <system>
add 0x10, esp
다시 clear 명령어를 syscall로 실행시킵니다.
sub 0xc esp
push 0x8048720
call 0x80483c4 <printf>
add 0x10, esp
sub 0xc esp
push 0x8048760
call 0x80483c4 <printf>
add 0x10, esp
sub 0xc esp
push 0x80487a0
call 0x80483c4 <printf>
add 0x10, esp
sub 0xc esp
push 0x8048760
call 0x80483c4 <printf>
add 0x10, esp
sub 0xc esp
push 0x80487e0
call 0x80483c4 <printf>
add 0x10, esp
sub 0xc esp
push 0x8048720
call 0x80483c4 <printf>
add 0x10, esp
sub 0xc esp
push 0x8048760
call 0x80483c4 <printf>
add 0x10, esp
sub 0xc esp
push 0x8048760
call 0x80483c4 <printf>
add 0x10, esp
sub 0xc esp
push 0x80487e0
call 0x80483c4 <printf>
add 0x10, esp
printf를 호출하여 문자열을 작성합니다.
이 부분은 당연히 Telnet 메뉴일 것입니다.
sub 0x8, esp
push 0x80484e0
push 0x2
call 0x8048374 <signal>
add 0x10, esp
시그널을 받아옵니다. 아무래도 여기선 시그널 핸들러를 가져온 것 같네요.
x/32x 0x80484e0을 한 결과 sig_func라는 함수가 나타납니다. push 0x2는 파라미터로 들어간 것 같습니다.
Signal 함수에서 파라미터 2가 나타내는 것은 Ctrl + C입니다.
잠시 signal 함수 내부를 보겠습니다.
(gdb) disas sig_func
push ebp
mov esp, ebp
sub 0x8, esp
sub 0xc, esp
push 0x80486e0
call 0x80483c4 <printf>
add 0x10, esp
leave
ret
printf를 해 주는 함수입니다. CTRL + C가 들어가면 이게 호출이 되는 구조입니다.
can't use ctrl + c \n 이란 문자열을 담고 있네요. ctrl+c를 누르지 말라는 것 같습니다.
sub 0xc, esp
push 0x80488a0
call 0x80483c4 <printf>
add 0x10, esp
0x80488a0의 문자열을 출력합니다. 문자열이 다 깨져서 다른 write-up을 봤는데 "접속하고 싶은 bbs를 선택하세요" 라는 문자열이라고 합니다.
sub 0x8, esp
lea 0xfffffffc(ebp), eax
push eax
push 0x80488c3
call 0x8048394 <scanf>
add 0x10, esp
여기서 eax의 값에는 ebp-4가 들어갑니다. 0xfffffffc는 -4를 뜻합니다. 즉, push ebp-4, push 0x80488c3을 통해 scanf의 인자를 넣어 주는 것입니다.
저 push ebp-4는 변수가 있는 자리입니다. 0x80488c3에는 %d가 들어 있었습니다.
cmpl 0x1, 0xfffffffc(ebp)
jne 0x80485ff <main+263>
sub 0xc, esp
push 0x80488c6
call 0x8048384 <system>
add 0x10, esp
cmpl 0x2,0xfffffffc(ebp)
jne 0x8048615 <main+285>
sub 0xc, esp
push 0x80488db
call 0x8048384 <system>
add 0x10, esp
cmpl 0x3, 0xfffffffc(ebp)
jne 0x804862b <main+307>
sub 0xc, esp
push 0x80488f1
call 0x8048384 <system>
add 0x10,esp
이제 ebp-4, 즉 변수에 값이 어떤 것이 들어가느냐에 따라 각자 syscall에 다른 파라미터를 넣어서 실행합니다.
텔넷을 실행합니다. 하지만 ping을 쏴 봤지만 저 서버들은 다 닫혀 있던 것으로 파악되었습니다.. 안 되는 것이죠
cmpl 0x1, 0xfffffffc (ebp)
je 0x804864d <main+341>
cmpl 0x2, 0xfffffffc (ebp)
je 0x804864d <main+341>
cmpl 0x3, 0xfffffffc (ebp)
je 0x804864d <main+341>
sub 0xc, esp
push 0x8048920
call 0x80483c4 <printf>
add 0x10, esp
그 후, 변수 검사를 실행해서 1,2,3이 아니라면 main+341, 즉 leave - ret(스택프레임 닫는 명령어)으로 넘어가도록 합니다.
x/s 0x8048920을 해 봤지만, 한글이라 깨져 있었습니다. 아무래도 잘못된 입력이니 종료한다는 의미인 듯 합니다.
아무래도 저 ctrl + c를 하지 못하게 막았던 이유가, ctrl + c를 이용하면 작업 종료 후 배시쉘로 이동할 수 있기 때문인 듯 합니다.
그게 나오기 이전에 ctrl + c를 하여 쉘이 저희에게 떨어진 것이라고 생각되네요.
이렇게 쉘을 땄기 때문에, cat password를 하면 비밀번호를 얻어 다음으로 넘어갈 수 있습니다.
'Wargame > FTZ' 카테고리의 다른 글
FTZ Level8 (0) | 2018.06.17 |
---|---|
FTZ Level7 (0) | 2018.06.12 |
FTZ Level5 (0) | 2018.06.12 |
FTZ Level4 (0) | 2018.06.12 |
FTZ Level3 (0) | 2018.06.12 |