[5pt]bof

Pwnable.kr 2015. 8. 6. 22:15
#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;
}


Introduction:

  간단한 bof문제, main안에 func함수 인자로 "0xdeedbeef"를 받고 있는데, 이 부분을 "0xcafebabe"로 덮어 씌우면 됨


How to solve:

  소스코드에서 func함수 시작 시 캐릭터형 배열 32칸을 만든 것을 확인하여, 일단 표준 입력에 "A"를 32개 입력해보았다. 그 결과 그림 1과 같은 결과가 나타났는데, 32칸의 스택이 A(0x41로) 채워진 후 "0xdeadbeef"까지 덮으려면 약 20바이트를 더 채워야 되는 것을 확인할 수 있다. 이에 따라 그림 2와 같이 명령어를 작성하여 다시 공격해 보았다.

<그림 1> 프로그램 실행중 스택을 캡쳐


  그림 2는 "A"로 52바이트를 채운 후 마지막에 "0xcafebabe"을 붙여 스택에 있던 "0xdeadbeef" 를 덮어씌우는 명령어를 작성해 공격을 수행하는 과정을 나타낸다. 다음과 같이 공격을 수행했을 때 정상적으로 쉘을 얻어낸 것을 확인하였다.

<그림 2> flag 정보 획득




'Pwnable.kr' 카테고리의 다른 글

[1pt]mistake  (0) 2015.08.06
[1pt]cmd1  (0) 2015.08.06
[1pt]fd  (0) 2015.08.06
[1pt]random  (0) 2015.08.06
[2pt]lotto  (0) 2015.08.06
Posted by Hugh_K
l

[1pt]random

Pwnable.kr 2015. 8. 6. 22:14
#include <stdio.h>

int main(){
        unsigned int random;
        random = rand();        // random value!
        unsigned int key=0;
        scanf("%d", &key);

        if( (key ^ random) == 0xdeadbeef ){
                printf("Good!\n");
                system("/bin/cat flag");
                return 0;
        }

        printf("Wrong, maybe you should try 2^32 cases.\n");
        return 0;
}



Introduction:
  본 문제는 rand()함수를 통해 만들어진 랜덤값과 표준입력을 통해 받은 key값에 xor연산을 수행하여 나온 결과가 0xdeadbeef가 될 경우 flag를 출력

How to solve:
  일단 rand()함수에는 seed값이 들어있지 않으므로, 계속 같은 값을 생성할 것이다. ltrace명령어를 이용하면 rand()함수를 통해 생성되는 값을 볼 수 있다. 그림 1은 ltrace명령어를 통해 rand값이 0x6b8b4567임을 확인한 그림이며, 그림 2는 그림 1에서 확인한 갑과 0xdeadbeef값을 xor하여 key값을 계산한 그림이다. 이렇게 얻어낸 key값을 프로그램에 입력하면 문제가 해결된다.

<그림 1> ltrace를 이용해 랜덤값을 확인


<그림 2> key값을 계산하기 위해 랜덤값(0x6b8b4567)과 0xdeadbeef를 연산


'Pwnable.kr' 카테고리의 다른 글

[1pt]mistake  (0) 2015.08.06
[1pt]cmd1  (0) 2015.08.06
[1pt]fd  (0) 2015.08.06
[5pt]bof  (0) 2015.08.06
[2pt]lotto  (0) 2015.08.06
Posted by Hugh_K
l

[2pt]lotto

Pwnable.kr 2015. 8. 6. 21:37
        unsigned char lotto[6];

        if(read(fd, lotto, 6) != 6){

                printf("error2. tell admin\n");

                exit(-1);

        }

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

                lotto[i] = (lotto[i] % 45) + 1;         // 1 ~ 45

        }

        close(fd);



        // calculate lotto score

        int match = 0, j = 0;

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

                for(j=0; j<6; j++){

                        if(lotto[i] == submit[j]){

                                match++;

                        }

                }

        }



        // win!

        if(match == 6){

                system("/bin/cat flag");

        }

        else{

                printf("bad luck...\n");

        }


Introduction:

  본 문제는 사용자가 6자리의 문자를 입력하여 프로그램에서 생성한 6자리의 번호를 맞추는 문제. 

How to solve:

  프로그램을 조작해 lotto배열과 submit배열의 값, 그리고 match의 값을 출력해보면 본 프로그램은 로직상 문제가 있음을 확인할 수 있다. 그림 1에서 나타나듯, 각 배열의 값을 비교하는 로직은 lotto의 배열의 1문자에 대해 submit배열의 6문자를 비교하게 된다.(설명이 좀 이상한듯..) 즉, 인풋 값으로 "\x20\x20\x20\x20\x20\x20"을 넣었을 때 match==6의 상황(line 43)은 실제 로또의 확률보다 훨씬 높은 확률로 나타나게 되고, 이정도 확률은 BF를 수행해도 쉽게 답을 얻을 수 있을 정도로 빈번하게 나타난다.

<그림 1> lotto배열과 submit배열, 그리고 match값을 출력한 결과


Command line:

Submit your 6 lotto bytes :       

Lotto Start!

bad luck...

- Select Menu -

1. Play Lotto

2. Help

3. Exit

1

Submit your 6 lotto bytes :       

Lotto Start!

sorry mom... ~!@#$%^&*()_+~!@#$%^&*()_+~!@#$%^&*()_+

- Select Menu -

1. Play Lotto

2. Help

3. Exit

'Pwnable.kr' 카테고리의 다른 글

[1pt]mistake  (0) 2015.08.06
[1pt]cmd1  (0) 2015.08.06
[1pt]fd  (0) 2015.08.06
[5pt]bof  (0) 2015.08.06
[1pt]random  (0) 2015.08.06
Posted by Hugh_K
l