bof


하핳 56바이트 만큼 떨어져 있구나.


하지만 덮어보니 segmentation fault 가 뜨지 않았다.


흠 더미값이 있는것 같다


4바이트 8바이트 12바이트 계속 더해서 세그폴트가 뜨는 곳을 찾아보자.



72byte를 덮어주니 eip가 덮인 것을 확인할 수 있다.


우리는 이 문제를 풀기 위해 bss 영역에 대해서 알 필요가 있다.


bss영역은 한마디로 초기화를 해주지 않은 변수가 들어가는 영역이다.


흠 이제 RTL을 이용하여 우회해보자.


gets를 리턴시키기 위해 bss 를 인자로 받게끔 넣어준다.


그 뒤에 쉘코드를 넣어주면? 쉘이 나올것 같다. 한번 넣어주자.



0x804A020 이 bss 영역의 주소이다


여기서 20은 공백을 의미하므로 30으로 바꿔넣어주자



gets 함수의 주소는 0x080482f0이다


이제 익스플로잇을 해보자.


익스플로잇에 사용할 쉘코드는

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80 이다.




'pwnable > 기타' 카테고리의 다른 글

songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
Format string  (0) 2016.08.09
echo is what?  (0) 2016.08.09
RTL 기법 실습  (0) 2016.07.16

secret



원래 IDA 로 까보면 플래그가 보인다.....


허나 우리는 공부를 해야 하므로 리눅스에서 exploit 을 통해 알아보자


흠 보아하니 포멧스트링 취약점이 있다.


나이쓰 쑤아리 질러


흠 몇번째가 플래그를 출력하는 값일까.


/dev/urandom 을 가져오기 때문에 값은 아마 바뀔거다.



햏 6번째였다....



'pwnable > 기타' 카테고리의 다른 글

songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
RTL 심화  (0) 2016.08.09
echo is what?  (0) 2016.08.09
RTL 기법 실습  (0) 2016.07.16

wantable



IDA로 까보면 내용은 단순한 것 같다.



왓더뻑!$@#$$


쉘 스크립트를 어느정도 알고 있다면 금방 풀 수 있는 문제이다....

'pwnable > 기타' 카테고리의 다른 글

songsari's prob2 (Command Injection)  (0) 2016.09.10
songsari's prob1 (MEMORY_LEAK)  (0) 2016.09.10
RTL 심화  (0) 2016.08.09
Format string  (0) 2016.08.09
RTL 기법 실습  (0) 2016.07.16


오옹 bof 문제이다. 허나 문제가 있다.

/usr/bin/bof 파일을 못열도록 설정해놓았다.


젠장.....

if 문이 참이 되면 Good Skill! 이라는 문자와 동시에 setreuid 명령어를 통해

uid가 바뀌면서 쉘이 실행된다.


char buf[10]


?


char buf2[20]


아마 스택은 이렇게 되어 있을 것이다.


그렇다면 10byte + @로 채워준 후에 buf2의 첫 시작을 go로 덮으면 될것 같다


해보자 게씽게씽



이러지 말자 원래는 gdb로 해야되는 것이 정석이다 ㅡㅡ;;


뭐 일단 풀었으니 빨리 level10으로 가보도록 하자.






'pwnable > FTZ' 카테고리의 다른 글

level8  (0) 2016.08.04
level7  (0) 2016.08.03
level6  (0) 2016.08.03
level5  (0) 2016.08.03
level4  (0) 2016.08.03


shadow 파일이 어딘가에 숨겨져 있댄다.


이름이 shadow 파일인가? 우선 확인해 보도록 하자.



잇힝 찾았다.



흠.... 파일의 크기가 다르다.


그렇다면 파일 사이즈를 옵션으로 찾아보자



find 명령어는 파일 사이즈를 옵션으로 찾을 수 있다.


파일 사이즈의 단위를 모르니.... 

b - block

c - byte

k - kbyte

w- 2byte (word)


저 4개의 옵션중 c와 w 두 옵션에서 저런 결과가 나왔다.


흠.... 저 4개의 파일들 중 level9 라는 문자열이 있는곳이 정답일 것이다.


grep 을 이용해 찾아보자.



(참고) grep으로 문자열 검색하는 방법

(http://soharang.tistory.com/815)


흠 어쩐지 저 found라는 이름이 수상했더니만!


shadow 파일은 저런식으로 생겨먹었는데


1 : 사용자명 

2 : 패스워드 
3 : 패스워드 파일 최종 수정일 
4 : 패스워드 변경 최소일 
5 : 패스워드 변경 최대일

6 : 패스워드 만료 경고 기간 

7 : 패스워드 파기 기간 (패스워드 파기 후 계정 비활성 기간) 
8 : 계정 만료 기간 
9 : 예약 필드 


이러한 구조로 되어있다.

보통 패스워드는 암호화 되어 저장한다.


존더리퍼를 사용하여 복호화 하면 


:?apple 가 패스워드이다.


:?를 지우니 로그인이 되었다.







'pwnable > FTZ' 카테고리의 다른 글

level9  (0) 2016.08.04
level7  (0) 2016.08.03
level6  (0) 2016.08.03
level5  (0) 2016.08.03
level4  (0) 2016.08.03


아니 이것은!!!!!

이런 유형의문제는 실력의 유무와는 상관없이 약간의 삽질을요구한다.


만약 CTF에서 이러한 문제가 출제되었다면 빠르게 풀어서 점수를 획득하도록 하자.


일단 /bin/level7 을 열어보자.



흠...... 이게 뭐지 라고 생각한다면 당신은 센스가 없는 사람이다.


"-"를 1로 "_" 를 0으로 치환해봐야겠다 라는 생각을 했다면

당신은 성공한 것이다. 일단 바꿔보자


1101101 1100001 1110100 1100101


흠 이렇게 보면 뭐가 뭔지 알 수 없다.

일단 10진수로 바꿔보자.


109  97  116  101


이렇게 봐도 알 수 없다.....지금 나온 숫자를 ASCII 코드로 바꿔보자.


m a t e


흠 이게 패스워드인듯...



흠흠흠 나왔다

'pwnable > FTZ' 카테고리의 다른 글

level9  (0) 2016.08.04
level8  (0) 2016.08.04
level6  (0) 2016.08.03
level5  (0) 2016.08.03
level4  (0) 2016.08.03


와우 친절하지 않을 수가 없다.

로그인을 하자마자 저렇게 hint를 던져준다.

ctrl+c를 눌러 취소하고 내부를 살펴보도록 하자



에효... 패스워드 파일이 바로 보인다....


솔찍히 이건 무슨 취약점인지 필자도 잘 모르겠다.


그냥 넘어가기로 하자. (나중에 한번 알아봐야지)

'pwnable > FTZ' 카테고리의 다른 글

level8  (0) 2016.08.04
level7  (0) 2016.08.03
level5  (0) 2016.08.03
level4  (0) 2016.08.03
level3  (0) 2016.08.03



얍얍 이것이 힌트로다.


/usr/bin/level5 프로그램은 /tmp 디렉토리에 임시 파일을 생성한다. 라는 것이 이 문제의 힌트이자 열쇠이다.



파일을 살펴본 결과 level 6에 대한 setuid 도 걸려있다.


실행시켜보면 알겠지만 임시파일은 우리가 육안으로 확인해보기도전에 사라진다.

(그래서 엿같다)


우리가 이 문제를 풀기 위해서는 여러가지 방법이 존재하는데

그중 대표적인 방법이 바로 symbolic link를 이용하여 문제를 해결한다.


방법을 설명하자면 다음과 같다.

1. tmp 디렉터리에 tmmp 라는 파일을 하나 만들어 준다.

2. /tmp/tmmp 에 level5.tmp라고 심볼릭 링크를 걸어준다.

3. /usr/bin 이 실행되면서 level5.tmp에 password를 쓴다.

4. level5.tmp는 사라지지만 tmmp는 남아있게 된다.


즉 /tmp/tmmp 라는 파일을 만들고 심볼릭 링크를 통해 level5.tmp 를 쉽게 말해 가짜로 만드는 것이다. 그렇게되면 /usr/bin/level5라는 프로그램이 level5.tmp에 쓰기 연산을 수행하지만, level5.tmp는 tmp/tmmp 에 연결되어 있으므로, tmp/tmmp 에 데이터를 쓰게 되는 것이다.

(모르면 구글링 검색합시다. ㅡㅅㅡ 필자도 구글검색을 통해 알았습니다.)


먼저 tmmp라는 파일을 만들어 준 다음 level5.tmp 와 심볼릭 링크를 걸어준다.



ls -al 명령어를 통해 제대로 걸려있는지 확인할 수 있다.


자 이제 level5를 실행시켜보자.



모띠모띠 기모띠~ 하게 패스워드가 출력된 것을 확인하고 다음으로 넘어간다.



 

'pwnable > FTZ' 카테고리의 다른 글

level7  (0) 2016.08.03
level6  (0) 2016.08.03
level4  (0) 2016.08.03
level3  (0) 2016.08.03
level2  (0) 2016.08.03


힌트다


누군가 /etc/xinetd.d/에 백도어를 심어놓았댄다........ 일단 보자




얍얍 있다. 실행파일은 아니고... 텍스트파일 같다 한번 까보자.



와웅 저게 뭐지....... 구글링을 통해 알아보자


service finger                                                       //서비스 이름

{

disable = no                                                  //xinet의 제어를 받을래?

flags                    =REUSE                   

socket_type           =stream                             //사용하는 TCP/IP 소켓

wait                     =no 

user                     =level5                              // 데몬의 uid

server                   =/home/level4/tmp/backdoor // 서비스가 실행될때 부름

log_on_failure        += USERID                         //

}


대충 이정도이다.


xinetd란 서비스에 접속을 요청할시에 xinetd가 중간에 개입하여 허가된 사용자인지를 검사한다. 허가된 사용자가 맞다면, 해당 서비스를 요청해주는 일종의 검문소역할이라고 생각하면 된다.


자 이제 저 문구를 자세히 보자


서비스가 실행될때 /home/level4/tmp/backdoor 을 실행한다.

우리가 이 backdoor 파일을 조작하여 패스워드를 출력할 수 있지 않을까?


해보자! 먼저 저 경로를 따라간다.



vi를 이용하여 backdoor 파일을 만들어 주자!!!!

C언어 명령어를 이용하여 my-pass 를 실행시킬 수 있도록 만들어 주자.


흠 이제 finger 명령어를 치면 플래그가 나올까?





흠흠흠 잘 되지 않았다.


그 이유는 기본 finger 서비스의 경우 disable 옵션이 yes 라서 외부에서 접속할 경우엔 실행되지 않는다. 하지만 backdoor 서비스는 disable이 no 로 설정이되어있어 외부에서 접속할 경우엔 backdoor 서비스가 실행 된다.


finger 명령어는 외부 서버의 유저들의 정보도 가져올 수 있는 기능이 있는데,
finger [user]@[host] 명령어를 사용하면 된다.


백도어가 실행되어야지만 우리가 원하는 결과를 실행시킬 수 있으므로

finger @localhost 를 하면 우리가 지정한 backdoor 가 실행된다.



얄루 나왔다!

'pwnable > FTZ' 카테고리의 다른 글

level6  (0) 2016.08.03
level5  (0) 2016.08.03
level3  (0) 2016.08.03
level2  (0) 2016.08.03
level1  (0) 2016.08.02

다음 소스코드와 아래의 힌트가 있다


다음 코드는 autodig의 소스이다.


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>


int main(int argc, char **argv){


    char cmd[100];


    if( argc!=2 ){

        printf( "Auto Digger Version 0.9\n" );

        printf( "Usage : %s host\n", argv[0] );

        exit(0);

    }


    strcpy( cmd, "dig @" );

    strcat( cmd, argv[1] );

    strcat( cmd, " version.bind chaos txt");


    system( cmd );


}


이를 이용하여 level4의 권한을 얻어라.


more hints.

- 동시에 여러 명령어를 사용하려면?

- 문자열 형태로 명령어를 전달하려면?



아 눈아프다...


일.단.은 setuid가 level4인 파일을 찾아보자.





아이 갓잇@@@@!!!


이제 저 C 소스코드를 분석해보자


만약 argv[ ]의 인자가 2개인 경우 들어온 인자를 "dig@" 뒤에 붙여준다.


예를들어 sabjilkng 라는 문자열을 넣어주면 dig@sabjilking 가 된다.


그리고 그 다음줄은 version.bind chaos txt라는 문자열을 

현재 cmd 명령어 뒤에 추가한다.


우리가 autodig sabjilkng 를 입력하면

$ dig@sabjilkng version.bind chaos txt 라는 명령어를 실행하게 된다.


more hint를 참고하면 동시에 여러 명령어를 사용하려면? 이라고 힌트가 나와 있다.


리눅스에서는 ;(세미콜론)을 사용해서 여러개의 명령어를 ; 로 구분하여 여러 명령어를 입력하고 실행시킬 수 있다.


그렇다면 dig@sabjilkng version.bind chaos txt ; my-pass 명령을 이용하여 level4 의 패스워드를 알아낼 수 있지 않을까?



level3 의 패스워드가 출력되었다 ㅠㅠ


그 이유는 dig가 실행된 다음 my-pass 명령어가 실행되었기 때문이다.


여기서 more hint의 두번째 줄을 보면 문자열 형태로 명령어를 전달하려면? 이라는 힌트가 있다. 그렇다면?


인자를 따옴표로 묶어서 하나의 문자열로 넣어줌으로써 해결할 수 있다.



잇힝 나왔다!!

'pwnable > FTZ' 카테고리의 다른 글

level6  (0) 2016.08.03
level5  (0) 2016.08.03
level4  (0) 2016.08.03
level2  (0) 2016.08.03
level1  (0) 2016.08.02

+ Recent posts