DongDD's IT

[pwnable.kr] random 본문

Wargame/pwnable.kr

[pwnable.kr] random

DongDD 2018. 4. 2. 14:17

[pwnable.kr] random



Problem




random value를 프로그래밍에 사용하는 방법을 배웠다고 되어있었다.

random과 관련된 프로그래밍이 되어있을 것 같았다.

먼저 ssh를 통해 접속해보았다.



ssh를 통해 접속하니 flag파일과 random 실행 파일, random.c 소스 코드 파일이 있었다.

먼저 소스 코드를 확인해보았다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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;
}
 
cs


소스 코드는 간단한 형태로 되어있었다. 먼저 random 변수를 선언하고 random에 rand()함수를 통해 random값을 생성해 넣는다. 그 후에 key값을 stdin으로 입력받고 입력받은 key값과 앞에서 rand()함수를 통해 생성한 random 값이 들어간 random과 xor을 해서 이 값이 0xdeadbeef라면 if문으로 들어가 flag를 출력해주는 방식으로 되어있었다.



Solution


이 문제는 rand() 함수의 취약점을 이용하면 쉽게 해결할 수 있다. 단순히 rand()함수만 사용하게 되면 프로그램을 실행한 후 rand()함수가 생성하는 random()값이 일정하게 된다. seed를 사용하지 않으면 이런 현상이 나타나고 이 점을 이용해 gdb를 통해 처음 생성되는 random 값을 확인하고 이 값을 이용하면 된다.



gdb를 통해 random 변수가 들어간 위치를 확인하고 rand()함수가 실행된 이후에 들어가는 값을 확인해보았다.

random에 들어가는 값이 0x6b8b4567로 고정되어있는 것을 확인할 수 있었다.

이 값을 이용해 넣어야 할 key값을 구할 수 있었다.


0xdeadbeef = key ^ random

key = 0xdeadbeef ^ random(0x6b8b4567)


이렇게 key값을 구한 후 프로그램을 실행하고 10진수로 key값을 넣어주니 flag를 획득할 수 있었다.






**************     Answer & Flag     **************




0xdeadbeef ^ 0x6b8b4567 = 3039230856


key = 3039230856





Flag : Mommy, I thought libc random is unpredictable...



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

[pwnable.kr] leg  (0) 2018.06.10
[pwnable.kr] input  (0) 2018.04.19
[pwnable.kr]passcode  (0) 2018.03.28
[pwnable.kr] flag  (0) 2018.03.09
[pwnable.kr] bof  (0) 2018.03.07
Comments