728x90


fgets이 표준 입력으로부터 45byte를 읽어드리기 때문에 bufferoverflow가 일어난다.


check의 값을 0xdeadbeef와 맞추어야 한다.



gdb로 까 보면 buf는 ebp-56에 있고 check는 ebp-16에 있다.


다행히 둘의 차이가 45이하이다.



역시나 입력대기를 위해 cat을 붙여주어야 한다.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level13  (0) 2015.09.20
[ftz] level12  (0) 2015.09.20
[ftz] level11  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
728x90


조금, 아주 조금 더 디테일한 바이트 조작이 필요 하다. 일단 i의 값을 변조 시키면 안된다.



바로 gdb로 열어서 확인 해 보면 long i 는 ebp-12에 있고


buf는 ebp-1048에 있다. 그렇다면 현재 스택은


-----------  [  buf(1024)  ][  dummy(12)  ][  long i(4)  ][  dummy(8)  ][  ebp  ][  ret  ]   ----------


이렇게 있다.



위 내용을 참고로 i의 위치 전까지 아무 문자열로 채우고 i의 값을 그대로 넣어주고


ret 전까지 12바이트를 또 아무 문자열로 채우고 쉘코드의 위치를 넣으면 끝.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level14  (0) 2015.09.20
[ftz] level12  (0) 2015.09.20
[ftz] level11  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
728x90



소스를 보니 level11문제와 동일하다. 다만 11번은 프로그램인자로 str의 값을 입력받았다면


이번에는 stdin(표준 입력)으로 부터 값을 받고 출력을 해 준다.



똑같이 환경변수를 이용해서 쉘 코드를 등록한 뒤 공격코드를 넣었다.


##

cat을 붙이는 이유:

완전히 이해하지는 않았지만 cat을 붙이지 않을 경우 gets가 쉘 코드를 읽고 쉘 코드가 실행되어 쉘이 실행 될때

사용자의 입력을 대기해야하는데 바로 종료시키게 되어 원하는 명령을 할 수 없게 된다. 그래서 cat을 붙이게 되는데

괄호로 묶어주지 않을 경우 "python ....."실행 후 "cat | ./attackme"으로 실행되기때문에 괄호로 묶어서

위와 같이 쓰게 된다.

-- 참조 : http://cosyp.tistory.com/208

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level14  (0) 2015.09.20
[ftz] level13  (0) 2015.09.20
[ftz] level11  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
728x90


이 문제에는 2가지 취약점이 있다. 하나는 strcpy에 의한 buffer overflow취약점과


printf문에 의한 format string취약점이 있다. 어차피 level20에 fms문제가 나오므로 buffer overflow로 풀었다.

(사실 fms로 하다가 잘 안풀려서 일단 keep.)



쉘 코드를 메모리에 올리는 방법중 "환경 변수"를 이용하는 방법이 있다.


환경변수는 프로그램 실행 시 메모리에 함께 올라가기 때문이다.


이를 이용하면 쉘 코드를 메모리에 올리고 환경변수의 메모리 주소값을 이용하여 쉘 코드를 실행 시킬 수 있다.


##

위 사진에 있는 쉘 코드는 http://kaspyx.kr/4 이 블로그를 참조, 아니 copy하였다.

제작법까지 상세하게 나와있다.


쉘 코드 :

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80



컴파일이 가능한 환경이면 이런 코드를 이용해서 환경변수가 메모리에 위치하게 되는 주소를 알 수 있다.



여러번 실행을 시켜 보았는데 지속적으로 고정된 주소값이 나왔다.



gdb로 까 보면 알 수 있듯이 ret의 스택상 위치는


[  buf(256)  ][  dummy(8)  ][  ebp(sfp)  ][  ret(여기)  ]


에 있으므로 공격코드는


./attackme `python -c 'print "A"*268+"환경변수주소(little endian)"'`


이 된다.


위 사진에서 보이듯이 setuid가 attackme에 걸려있어 level12의 쉘을 얻었다.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level13  (0) 2015.09.20
[ftz] level12  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
[ftz] level8  (0) 2015.09.18
728x90



아마도 두 사람의 대화가 저 "공유메모리"에 있을 것이다. 그리고 저 메모리 번지에 접근하는 방법에


저 7530값이 필요 할 것이다. 해서 구글링을 하였더니 친절한 블로그가 있었다.


http://mintnlatte.tistory.com/27


위 블로그에 공유메모리에 대한 api설명이 잘 되어있다.



게으름뱅이여서 예외처리는 하지 않았다.


#include 
#include 
#include 
#include 

int main(void)
{
    char buf[100];      // 도청한 대화를 저장할 문자열 변수

    // 7530을 key로 하는 1024크기의 공유메모리 생성(IPC_CREAT 옵션) 이미 있을 경우 접근 권한 설정 (0660)
    // 성공시 공유메모리 식별 id를 리턴한다.
    unsigned long shmID = (unsigned long)shmget(7530, 1024, IPC_CREAT | 0660);   
    
    // 식별 id에 해당하는 공유메모리를 attach할 나의 프로세스의 주소지정
    // 성공시 attach된 공유메모리 주소 반환
    unsigned long shmADDR = (unsigned long)shmat(shmID, NULL, 0);

    // shmADDR에서 100byte만큼을 buf에 저장
    memcpy((void*)buf, (void*)shmADDR, 100);

    // buf 출력
    printf("%s\n",buf);

    return 0;
}



<공유메모리 원리>



compile하여 실행하면 끝



728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level12  (0) 2015.09.20
[ftz] level11  (0) 2015.09.20
[ftz] level9  (0) 2015.09.18
[ftz] level8  (0) 2015.09.18
[ftz] level7  (0) 2015.09.17
728x90



의무적으로 hint를 열어 보니 소스 코드가 나온다.


buf에 40바이트만큼 표준입력으로부터 읽어드린 뒤


buf2와 "go"가 같으면 uid를 변경하여 bash쉘을 실행한다.



3010은 /etc/passwd파일을 보면 level10의 uid인 것을 알 수 있다.


buf는 buf2보다 코드 상에서 늦게 정의 되었으므로 실제 메모리 stack에서 buf2보다 낮은 주소에 위치하게 될 것이다.


fgets()에서 40바이트를 읽어서 buf에 저장한다. buf는 10byte이기 때문에 10보다 큰 데이터를 입력할 경우 overflow가 일어난다.


처음에 10바이트 입력후 overflow가 일어나는 줄 알았지만 찾아보니 쓰레기값이 있다고 한다.


실제 메모리에는 이렇게 들어있다.


##########메모리###############

낮은 주소

---------------------

|           1           |

|           1           |

|           1           |

|           1           |    ----> bof[10] (linux는 메모리가 4바이트씩 할당되어 12byte다.)

|           1           |

|           1           |

|           1           |

|           1           |

|           1           |

|           1           |

---------------------

|                       |

|       쓰레기         |

|                       |

|                       |

---------------------

|           g          |      -> 우리의 목표

|           o          |

|                       |

|                       |    ----> bof2[10] (역시 12byte다.)

|                       |

|                       |

|                       |

|                       |

|                       |

|                       |

---------------------

|                       |

|      쓰레기          |

|                       |

|                       |

---------------------

|                       |

|       쓰레기         |

|                       |

|                       |

---------------------  ----------------> ebp

|                       |

|        sfp           |

|                       |

|                       |

---------------------  

|                       |

|                       |

|        ret            |

|                       |

---------------------

높은 주소

################################



1을 16개와 go 를 입력하여 overflow가 일어났다.


Good Skill! 과 함께 level10의 쉘을 얻었다. my-pass 하면 끝.



gdb로 까 보면 (level10 권한 필요) buf (ebp-40)와 buf2 (ebp-24) 가 정확히 16 byte 차이가 난다.


## 기본적으로 gdb는 AT&T문법이므로 intel문법으로 변경하고 싶으면

## (gdb) set disassembly-flavor intel 라고 치자.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level11  (0) 2015.09.20
[ftz] level10  (0) 2015.09.18
[ftz] level8  (0) 2015.09.18
[ftz] level7  (0) 2015.09.17
[ftz] level6  (0) 2015.09.17
728x90



find부터 쓰자.



find를 보게 되면 size옵션에 "2700c"라고 크기 뒤 c를 붙였는데


default로 b로 되어있어 저렇게 지정을 해 주어야 한다.


/etc/rc.d/found.txt 를 확인 해 보자.


b(default) : 블록단위 512KB

c          : 바이트단위 1Byte

k          : 1 KB

w         : word단위 2Byte



shadow파일형식이다. " : " 로 구분되어 각 필드별로 의미가 있다. 필요한 것은 두번째 필드.


계정의 비밀번호가 암호화되어 들어있다.


John the Ripper(유닉스 계열 전용 password crack툴)을 이용해서 비밀번호를 크랙하자.



설치를 해야 하지만 ftz서버에 미리 푼 사람들이 이미 설치를 해 두었다. 



위 명령의 [shadowFile]에 아까 찾은 파일을 넣으면 풀린다.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level10  (0) 2015.09.18
[ftz] level9  (0) 2015.09.18
[ftz] level7  (0) 2015.09.17
[ftz] level6  (0) 2015.09.17
[ftz] level5  (0) 2015.09.17
728x90



힌트를 확인하자. 패스워드를 입력하면 다음레벨의 패스워드를 얻을 수 있다.



가까이 있다고 하니 같은 디렉토리인 /bin을 보았다.


뭔가 수상해 보이는 wrong.txt를 확인해 보니 다음과 같이 모스부호처럼 생긴 문자열이 출력이 되었다.


아무래도 언더바(_)는 0, 하이픈(-)은 1인 2진수 인 것 같다. 그리고 중간에 공백이 3개가 있으니 4글자 이라고 생각이 든다.


해서 다음과 같은 python 스크립트를 짜보았다.



간단히 설명하자면 wrong.txt파일을 열어서 첫 1라인을 읽어드린 뒤


하이픈은 1로, 언더바는 0으로 문자열 교체 후


공백에 따라 문자열을 잘라낸다.


int(i,2)는 i를 정수형으로 바꾸는데 두번째 인자는 i의 형태이다. (2진수 이므로 2)


그리고 chr()은 아스키값을 문자열로 치환한다.



실행 해 보면 mate라는 문자열을 얻게 된다.


/bin/level7 을 실행시켜 mate를 입력하면 끝 

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level9  (0) 2015.09.18
[ftz] level8  (0) 2015.09.18
[ftz] level6  (0) 2015.09.17
[ftz] level5  (0) 2015.09.17
[ftz] level4  (0) 2015.09.17
728x90



로그인 하자마자 힌트가 뜬다. enter를 입력하니



이런 창이 뜬다. 텔넷 접속 서비스를 이용해 본 적이 없는 세대여서 뭔지 모르겠다.


찾아보니 텔넷 서비스에 접속되기전 Ctrl + C연타로


해킹이 이루어진 적이 있다고하여 힌트창에서 Ctrl + C를 누르니 허무하게 쉘이 뜬다.


그리고 매우 친절하게도 password도 있다.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level8  (0) 2015.09.18
[ftz] level7  (0) 2015.09.17
[ftz] level5  (0) 2015.09.17
[ftz] level4  (0) 2015.09.17
[ftz] level3  (0) 2015.09.16
728x90



임시파일의 내용을 확인해 보고 싶어진다. 확인해 보자.



/usr/bin/level5를 실행 한 뒤 /tmp/level5.tmp를 확인해 보니 그런 파일이 없다고 뜬다.


아마도 잠시동안만 생성된 뒤 삭제되는 프로그램인 것 같다.



그래서 위와 같은 간단한 코드를 이용해서 level5.tmp를 확인하도록 하자.


컴파일 후 실행하면 끝.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level7  (0) 2015.09.17
[ftz] level6  (0) 2015.09.17
[ftz] level4  (0) 2015.09.17
[ftz] level3  (0) 2015.09.16
[ftz] level2  (0) 2015.09.16

+ Recent posts