[5pt]bof

Pwnable.kr 2015. 8. 6. 22:15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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