0x02 Study :)/Pwnable

[pwnable.kr][Toddler] random 문제풀이

eli_ez3r 2018. 8. 14. 15:34

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 함수로 랜덤값을 가져오고 있다. 하지만 컴퓨터에서 랜덤값은 항상 똑같은 패턴으로 생성된다. 그래서 보통 랜덤값을 사용할 때에는 rand 함수로 나온 값에 현재 시간이나 다른 요소들을 포함하여 생성한다.

 

이 문제에서는 단순히 rand 함수만 사용하기 때문에 랜덤값을 추출할 수 있다.



(gdb) x/x $rbp-4
0x7ffd79059f2c:	0x6b8b4567

rand함수가 실행된 이후에 BP를 걸어 값을 확인해 보면 0x6b8b4567가 나온다.

XOR연산의 특징은 A xor B = C 일때, A xor C = B 라는 특징이 있다.

결론적으로 key값은 0xdeadbeef xor 0x6b8b4567 을 하면 얻어 낼 수 있다.



root@kali:~/BoB7/pwnable/flag# python
Python 2.7.15 (default, May  1 2018, 05:55:50)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> str1 = 0xdeadbeef
>>> str2 = 0x6b8b4567
>>> print str1 ^ str2
3039230856

 

key값은 3039230856이 된다.

 

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




잘못 된 개념을 서술하였거나, 잘못 풀이된 내용이 있으면 댓글 달아주시면 감사합니다 :)

태클 댓글이나 메일(513.eunice@gmail.com) 환영입니다 !! 😊☺️👍