ls 명령어로 어떤 파일이 있는지 확인하였다.
flag 파일과 실행파일인 random, 소스코드인 random.c 파일이 있다.
random.c 소스코드를 먼저 읽어보았다.
함수는 main 뿐이며 먼저 random 변수를 선언했다.
random 함수를 사용하여 난수를 생성하고, 이를 random 변수에 대입한다.
srand(time(NULL))이 아닌 random을 사용하고 있으므로 불규칙적인 seed 없이 난수가 생성되고 있다.
key 변수를 선언하고 scanf 함수를 사용하여 사용자로부터 입력을 받는다.
if 문을 통해 key 값과 random 값을 XOR 한 값이 0xdeadbeef와 일치하는지 확인하고
일치할 시에 "Good!"과 함께 flag 값을 출력한다.
* random
- seed 값을 사용하여 난수를 생성하는 함수
- 프로그램을 실행할 때 마다 항상 같은 난수를 생성한다는 취약점을 가짐
- srand: 시간 값을 매개로 초기화하면 실행할 때 마다 일정하지 않은 불규칙 난수가 생성됨
- srand(time(NULL))으로 사용하면 "난수"를 생성할 수 있음
random 파일을 실행하보았다.
숫자와 문자에 관계없이 "Wrong, maybe you should try 2^32 cases."를 출력한다.
key ^ random == 0xdeadbeef 이다.
XOR 연산을 두번 취하면 이를 없앨 수 있으므로 나는 random 값을 알면 key 값을 구할 수 있다.
random 값을 찾기 위해 먼저 random 파일을 gdb 했다.
< +18 > 부분에 Break point를 걸어두었다.
나는 rand 함수를 지난 직후의 변수 값을 알아야 하는데
rand 함수 호출 직후인 <+18> 의 rbp-0x4에 생성된 난수가 들어있기 때문이다.
디버그하기 위해 bp를 건 후에 run 해주었다.
레지스터의 info를 확인하여 rax 값을 확인하였다.
rand 함수를 거쳐온 random 함수의 값은 0x6b8b4567이다.
key ^ random == 0xdeadbeef
key == 0xdeadbeef ^ 0x6b8b4567
key == 0xb526fb88 = 3039230856(10진수)
XOR 연산을 통해 원하는 key 값을 얻을 수 있었다.
random을 실행하였고 구한 key 값의 10진수 값을 대입하여
random 문제의 flag 값을 얻을 수 있었다.
끝 !