본문 바로가기

Wargame/[pwnable.kr]

[pwnable.kr] random 문제 풀이

※ pwnable.kr의 워게임 random 문제이다.

1. 프로그램 분석

#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;
}
  • rand함수로 랜덤값을 생성하고 변수 하나를 입력받아 변수와 랜덤값을 xor 연산하여 값이 0xdeadbeef가 되면 system 함수를 호출하는 프로그램이다.

2. 취약점 분석

  • rand 함수는 프로그램이 생성될 때 값이 고정되어 프로그램을 여러번 실행시켜도 같은 값을 돌려준다.
  • random 변수는 값이 정해져 있다는 뜻이다.
  • random 변수가 정해져 있으므로 적절한 key값을 입력하여 xor 연산을 하여 0xdeadbeef 를 만들면 flag를 획득할 수 있다.

3. 익스플로잇

1) rand 함수로 생성된 값을 저장하는 random 값을 찾는다. 빨간 상자를 보면 rand 함수의 리턴값을 eax에 저장하는 것을 알 수 있다. 그러므로 <main+21>에 break를 걸고 실행하여 rax값을 확인하면 random 값을 찾을 수 있다.

 

2) random의 값은 0x6b8b4567 인 것을 알 수 있다.

 

3) (key) xor (0x6b8b4567)을 하면 0xdeadbeef가 나와야 한다. 자기 자신을 xor 연산 시키면 0이 나오는 특징(A xor A = 0)을 이용할 것이다.

A = 0x6b8b4567, B = 0xdeadbeef 라고 정한다. 

key = A xor B 로 하면 (A xor A = 0) 특징에 의해

key xor B
= A xor B xor A 
= B     

4) key = 0x6b8b4567 xor 0xdeadbeef = 0xb526fb88 이다. scanf로 "%d"이므로 정수를 입력받는다. 0xb526fb88 = 3039230856을 입력하면 flag를 획득할 수 있다.

 

 

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

[pwnable.kr] passcode 문제 풀이  (1) 2023.07.29
[pwnable.kr] flag 문제 풀이  (0) 2022.08.20
[pwnable.kr] bof 문제 풀이  (0) 2022.08.20
[pwnable.kr] collision 문제 풀이  (0) 2022.08.19
[pwnable.kr] fd 문제 풀이  (0) 2022.08.19