포스트

[pwnable] random

pwnable, system hack

[pwnable] random

1
2
$ ls
flag  random  random.c

random이 실행가능한 파일로 보여서 실행후 아무 입력이나 넣어보았다.

1
2
3
$ ./random
3
Wrong, maybe you should try 2^32 cases.

올바른 숫자를 넣어야 flag를 얻을 수 있는 것처럼 보였다.
다음으로 random.c 파일을 열어보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat random.c

#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;
}

seed를 지정해 주지 않으면 random 값이 프로그램 실행마다 동일한 sequence로 나온다고 알고 있어서 직접 출력해 보았다.

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!
	printf("%x\n", random); // print random
	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;
}
1
2
$ ./random
6b8b4567

몇번을 실행해도 결과는 0x6b8b4567 으로 똑같았다.
따라서 정답은 0x6b8b4567과 0xdeadbeef를 xor 연산한 0xb526fb88이다.
(0xb526fb88 = 3039230856)

정답

1
2
$ ./random
3039230856
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.