힌트다.


FTZ 문제의 경우 각 문제별로 힌트가 존재하니 한번 참고하여 풀어보길 바란다.


텍스트 모드 vi 는 크게 3가지 기능을 갖고 있다.


1. 텍스트  모드

2. 명령 모드

3. ex 모드


우리는 여기서 2의 명령 모드를 이용하여 쉘 명령어를 실행할 것이다.

여기서 쉘 명령어를 실행시키는 방법은 다음과 같다


:sh -  쉘로 나가기

:! 쉘 명령어 - 쉘 명령어를 한줄만 실행시킨다.

r! 쉘 명령어 - 쉘 명령의 결과를 화면에 출력시킨다. 


그렇다면 우리는 두번째 !쉘 명령어를 통해 my-pass를 실행시킬 수 있지 않을까?


하지만 vi 또는 vim에서 시도해본 결과 되지 않았다.


혹시... 낚시인가..... setuid가 level3으로 되어있는 파일이 있는지 찾아보자.




이런 젠장 ㅡㅡ;;


한번 실행시켜보자.



흠 뭔가 다른데? 저기서 한번 시도해보자!



얄루 나왔다!

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

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


잇힝 힌트파일을 까보면 setuid가 level2 권한으로 설정된 파일을 찾으라는 것이다.


리눅스에는 uID와 gID 가 있다.


각각 user ID, group ID 인데 리눅스 기초를 꼭 공부하도록 하자.


이제 find 명령어를 이용해 찾아보자.


find / -perm +4000 -user level2

(찾아라 - 권한옵션 - user가 level2인)



다른 곳은 전부 Permission denied 를 뱉어낸 반면 단 하나의 파일이 걸려들어왔다.


잇힝 찾았다!!! 한번 실행해보자.



쉘을 내 놓거라



my-pass 때려주면 플래그가 나오게 된다.


이문제가 백도어의 원리를 설명해주고 있다.



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

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

bof


버퍼 오버플로우 문제이다 평상시 공부했던것 처럼 풀면 되나....


약간의 문제가 있어보인다!


확인해보자


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
	char overflowme[32];
	printf("overflow me : ");
	gets(overflowme);	// smash me!
	if(key == 0xcafebabe){
		system("/bin/sh");
	}
	else{
		printf("Nah..\n");
	}
}
int main(int argc, char* argv[]){
	func(0xdeadbeef);
	return 0;
}

overflowme 라는 배열이 32byte로 선언되어 있다.


그리고 gets ( )함수를 통해 입력받아 그 값이 0xcafebabe 이면 쉘을 얻어낼 수 있다.


기본값은 0xdeadbeef 으로 선언되어있다.


우리는 하던대로 배열 32byte를 덮어씌우고 func의 주소를 찾아 deadbeef를 cafebabe로 바꾸면 쉘을 딸 수 있다.


실행해보자. 



WOW 보호기법중 하나인 카나리가 걸려있다.


그렇다면 우리는 스택의 주소를 참조하여 어디에 deadbeef 라는 값이 들어가 있는지 찾으면 될것 같다. 자 분석해보자.



disas func 명령어를 통해 func 함수를 디스어셈블리 한 내용이다.


자세히 보면 0x5655564f 에서 gets 함수를 통해 입력을 받고

0x5655565d 에서 jne 명령어를 통해 분기된다.


그렇다면 gets 함수 다음에 바로 break 문을 걸고 실행을 시킨후 스택을 보면 덮이는 부분을 확인할 수 있을 것 같다.



버퍼 오버플로우 공격을 실행하면 분명히 stack이 덮일것이다 확인해보자.




자 두번째 끝에부터 0x41414141로 덮였다.


보이는가 0xdeadbeef 가!!!!


우리는 저 부분을 0xcafebabe 로 바꿔주면 되는것 아닌가!!!


자 바꿔주자 저부분 전까지 덮어주려면 12byte 만큼을 더 덮어주면 된다.


그렇다면 공격코드는 다음과 같다.


(python -c 'print "A"*52 + "\xbe\xba\xfe\xca")


공격을 시도할 땐 nc로 payload를 보내보자


(python -c 'print "A" * 52 + "\xbe\xba\xfe\xca" + "\n"' ; cat) | nc pwnable.kr 9000



'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -passcode  (0) 2016.09.24
pwnable.kr -echo1  (0) 2016.09.23
pwnable.kr -flag  (0) 2016.07.15
pwnable.kr -shellshock  (0) 2016.07.15
pwnable.kr -mistake  (0) 2016.07.15

bin-overflow


일단 pwnable 바이너리가 나오면 무조건 IDA 로 살펴보는 습관을 들이자.



main함수의 내용을 IDA 를 통해 C로 출력한 모습이다.


read 함수를 통해 32byte를 입력받을 수 있게 해 놓았다.


[bp-4h] : ebp로 부터 4byte 만큼 떨어져 있다는 뜻이다.


그렇다면 gdb를 통해 확인해 보도록 하자.



r <<< $(python -c 'print"A"*20')


입력함수의 인자에 20byte를 채워보았다. 


나중에는 계산해서 넣어주어야 하지만 지금은 그냥 게싱을 한다 생각하자.


20byte를 채워주니 ebp와 eip 의 값이 모두 바뀐 것을 확인할 수 있었다.


그렇다면 16byte로 다시 채워보자.




ebp는 채워졌으나 eip가 바뀌지 않았다.


그렇다면 20byte를 덮어씌웠을때 eip까지 모두 덮인다는 것을 확인할 수 있다.


다시 IDA로 넘어가서 분석해보자.


system 함수가 있는것으로 보아 RTL 공격이 통할 것 같다.






그렇다면 flag를 출력해주는 문자열이 어딘가에 존재할 것이다. 찾아보자



"/bin/cat flag" 라는 문자열이 존재한다.



자 이제 공격 코드를 삽입해 보자. 


python -c 'print"A"*20 + "\x50\x83\x04\x08" + "AAAA" + "\x90\x85\x04\x08"' 


앞에있는 함수의 주소는 뒤에있는 주소를 인자로 받고 

"AAAA"라는 문자열을 리턴한다.




임의로 만든 flag 인 helloworld가 출력됬음을 확인할 수 있다.



※실습하기 전에 미리 flag 파일을 만들어 놓도록 하자~



'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
echo is what?  (0) 2016.08.09


flag 파일의 확장자를 알 수 없어 

Hex-Ray를 통해 출력시켜보았다.




ELF 바이너리 파일 같은데 밑에 내려보면 UPX! 라는 문구로 보아


UPX 로 패킹되어 있음을 알 수 있었다.


먼저 패킹을 풀어주도록 하자.








시그니처에 UPX 가 사라진 것으로 보아 언패킹에 성공했다는 것을 알 수 있다.


확장자가 ELF 인 것으로보아 바이너리 파일 임을 짐작할 수 있고 이제 이 파일을 헥스레이인 IDA를 이용하여 분석해보자.




IDA에서 main 함수를 찾은 뒤 소스를 확인해보면



flag 라는 값을 볼 수 있을 것이다 더블클릭하여 이 부분을 살펴보면



짜잔! 하고 플래그가 나타나게 된다.


'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -echo1  (0) 2016.09.23
pwnable.kr -bof  (0) 2016.07.29
pwnable.kr -shellshock  (0) 2016.07.15
pwnable.kr -mistake  (0) 2016.07.15
toddler -collision  (0) 2016.07.15


문제의 소스코드는 다음과 같다.




소스코드를 보면 권한 상승후 system함수를 실행하고 있다는 것을 알 수 있다.


또한 line 5를 잘 보면 shellshock 취약점이 존재한다는 것을 알 수 있다.


shellshock는 환경변수를 통한 코드 인젝션이 가능한 취약점이다.


bash의 환경 변수에 함수정의를 이용해서 원하는 코드를 추가할 수 있고 , 다음 bash가 사용될 때 추가된 코드가 실행되는 취약점이다. 


즉 함수정의 뒤에 임의의 명령을 추가하면 bash 는 환경변수를 import할때 끝에 추가된 명령까지 같이 실행하게 된다. 


이를 이용하여 test라는 환경변수에 함수정의를 이용하여 /bin/cat flag 라는 명령을 추가한 후 shellshock 프로그램을 실행해보자.



공격이 제대로 실행되었다.

'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -bof  (0) 2016.07.29
pwnable.kr -flag  (0) 2016.07.15
pwnable.kr -mistake  (0) 2016.07.15
toddler -collision  (0) 2016.07.15
toddler -fd  (0) 2016.07.13

mistake.c 의 소스코드를 열어보면 다음과 같다.


#include <stdio.h>

#include <fcntl.h>


#define PW_LEN 10

#define XORKEY 1


void xor(char* s, int len){

int i;

for(i=0; i<len; i++){

s[i] ^= XORKEY;

}

}


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

int fd;

if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){

printf("can't open password %d\n", fd);

return 0;

}


printf("do not bruteforce...\n");

sleep(time(0)%20);


char pw_buf[PW_LEN+1];

int len;

if(!(len=read(fd,pw_buf,PW_LEN) > 0)){

printf("read error\n");

close(fd);

return 0;

}


char pw_buf2[PW_LEN+1];

printf("input password : ");

scanf("%10s", pw_buf2);


// xor your input

xor(pw_buf2, 10);


if(!strncmp(pw_buf, pw_buf2, PW_LEN)){

printf("Password OK\n");

system("/bin/cat flag\n");

}

else{

printf("Wrong Password\n");

}


close(fd);

return 0;

}


소스코드를 해석하자면


처음에 입력한 10byte 값과 두번째로 입력된 10byte를 XOR 연산한다.


연산한 결과값이 처음에 입력한 값과 같다면 /bin/cat/flag 를 출력한다.


소스코드를 분석할 줄 알면 아주 간단한 문제이다.


동시에 C언어에 대해 얼마나 깊게 이해하고 있는지를 묻는 아주 재미있는 문제이다.


XOR 연산의 특징은


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

A xor B

0      0 = 0

0      1 = 1

1      0 = 1

1      1 = 0

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


두개의 값이 반전일 경우 1을 출력하고 두개의 값이 같을경우에는 0을 출력한다.


첫번째 10바이트와 두번째 10바이트 수를 XOR 해서 처음 수가 나와야 한다면


1111111111

0000000000


을 연산하게 되면 1111111111 처음 값이 나오게 된다.



개인적으로 이런 문제를 아주 좋아한다.


'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -bof  (0) 2016.07.29
pwnable.kr -flag  (0) 2016.07.15
pwnable.kr -shellshock  (0) 2016.07.15
toddler -collision  (0) 2016.07.15
toddler -fd  (0) 2016.07.13

col.c 의 소스코드를 보면 다음과 같다.



20byte passcode를 인자로 받는다.


check_password() 함수를 참고하면 입력받은 값을 4byte 씩 5번 입력받아


res 변수에 누적된다.


우리는 누적된 값을 0x21DD09EC로 맞춰주면 된다.


먼저 0x21DD09EC를 5로 나누어 보면 0x06C5CEC8 이다.


하지만 0x21DD09EC는 5로 나누었을때 나머지가 4 이므로


0x06C5CEC8 x 4 + (0x06C5CEC8 + 4) = 0x21DD09EC 가 된다. 


이제 이걸 인자로 쳐 넣어주면 된다.





'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -bof  (0) 2016.07.29
pwnable.kr -flag  (0) 2016.07.15
pwnable.kr -shellshock  (0) 2016.07.15
pwnable.kr -mistake  (0) 2016.07.15
toddler -fd  (0) 2016.07.13

ssh fd@pwnable.kr p2222 에 접속하면 fd.c 의 C언어 소스코드가 있다. 



argv[1]에 어떠한 값을 넣어야 하고 그 값은 0x1234이다


atoi()함수가 있는것으로 보아 0x1234를 정수로 넘겨줘야 할것 같다.


또한 strcmp()함수로 "LETMEWIN"이라는 문자열을 비교하여


맞으면 /bin/cat/flag를 통해 플래그를 출력한다.


자 이제 집어 넣어보자


flag가 정상적으로 출력되었음을 확인할 수 있다.

'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -bof  (0) 2016.07.29
pwnable.kr -flag  (0) 2016.07.15
pwnable.kr -shellshock  (0) 2016.07.15
pwnable.kr -mistake  (0) 2016.07.15
toddler -collision  (0) 2016.07.15

문제의 소스코드를 보면 다음과 같다.


#include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> int main(int argc, char **argv) { volatile int modified; char buffer[64]; char *variable; variable = getenv("GREENIE"); if(variable == NULL) { errx(1, "please set the GREENIE environment variable\n"); } modified = 0; strcpy(buffer, variable); if(modified == 0x0d0a0d0a) { printf("you have correctly modified the variable\n"); } else { printf("Try again, you got 0x%08x\n", modified); }

}


getenv 를 통해 GREENIE라는 환경변수를 가져오고 있다.


그 이후는 기존에 했던 것들과 똑같으며 우리는 환경 변수를 설정해줘야 한다.



export 명령어를 통해 GREENIE라는 환경변수를 설정한 후 환경변수 속에 python으로 exploit code를 삽입한다.


그후 해당 파일을 실행하면 공격이 성공했음을 알 수 있다.





'pwnable > exploit-exercise' 카테고리의 다른 글

stack5  (0) 2017.02.24
stack4  (0) 2017.02.24
stack3  (0) 2017.02.24
stack1  (0) 2016.07.09
stack0  (0) 2016.07.09

+ Recent posts