본문 바로가기

pwnable.kr/Toddler's Bottle

random

 

소스 코드

#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()는 seed값에 변화를 주지 않으면 실행마다 같은 값을 반환한다.

 

main()을 disassemble한 결과이다

 

random = rand();	// random value!

해당 코드는 <main+18>에 해당한다.

따라서 <main+21>에 break point를 걸고 random 변수의 값을 확인해보자

 

random이라는 변수가 위치한 rbp-4의 값이 0x6b8b4567임을 알 수 있다.

 

앞서 말했듯이, rand()는 seed값에 변화를 주지 않는 이상 실행마다 같은 값을 반환하므로, 실행마다 같은 값이 변수 random에 저장되게 된다.

 

따라서 우리는

a ^ b = c

a ^ c = b라는 xor의 계산 성질을 이용해서

 

0x6b8b4567 ^ 0xdeadbeef 의 결과값을 key로 주면 flag를 얻을 수 있다

'pwnable.kr > Toddler's Bottle' 카테고리의 다른 글

passcode  (0) 2023.08.03
flag  (0) 2023.08.03
bof  (1) 2023.06.14
collision  (0) 2023.06.14
fd  (0) 2023.06.14