본문 바로가기
포너블(pwnable)/CTF(pwnable.kr)

[Toddler's Bottle] random 문제풀이

by LIZ0904 2021. 4. 5.
반응형

오늘의 문제

오늘의 문제는 random value와 관련되는 것 같다.

 

 

문제 접속

ssh random@pwnable.kr -pppp(pwd: guest)로 접속을 해준다.

 

random.c

cat 명령을 사용해서 random.c 파일의 내용을 확인해보았다.

 

unsigned int random;
random=rand();

랜덤함수를 사용해 만들어진 랜덤값(random value)를 unsigned int 변수 random에 넣어주고 있다.

 

unsigned int key=0;
scanf("%d", &key);

unsigned int 변수 key에는 scanf를 통해 입력값을 받는다.

 

if(key ^ random) == 0xdeadbeef){
	printf("Good!\n");
    system("/bin/cat flag");
    return 0;
}

이렇게 만들어진 입력값에 대해, key^randoom의 값이 0xdeadbeef와 같으면 /bin/cat flag 명령이 실행된다. 

 

gdb

gdb random 명령을 사용해 random 파일을 디버깅해보자!

 

 

rand()

첫번째에 나오는 call 명령을 통해 rand() 함수가 여기서 호출된다는 것을 추측해볼 수 있다. 

 

 

pb 및 실행

그래서 rand()함수가 호출된 후인 main+18 라인에, b명령을 사용해 breakpoint를 걸어주었다. [b *main+18]을 입력하면, 정상적으로 0x400606 주소에 breakpoint가 걸린 것을 확인할 수 있다.

그 다음 r 명령을 이용해 프로그램을 run(실행)시켜주면 breakpoint에서 멈춘 것을 확인할 수 있다. 

 

 

x/x $eax

x/x $eax를 사용해,  breakpoint에서 멈춘 부분에서의 eax 레지스터의 값을 확인해보았다. 

gdb에서 x명령어는 메모리를 보여주는 명령어이다. x옵션을 사용하면  이를 16진수로 보여주게 된다.

결과를 확인해보면, 0x6b8b4567이 나오므로, random 변수에는 0x6b8b4567 값이 들어가 있음을 알게 되었다!!

 

 

XOR

0xdeadbeef와 0x6b8b4567을 XOR한 값을 계산하면 key 값을 알 수 있다.

 

 

key 값

key 값은 정수형(10진수)이기 때문에, 위에서 찾은 값을 10진수로 변환해서 입력한다.

 

 

정답 입력

3039230856을 입력해주면 flag 값이 나온다!!

 

 

flag

flag을 입력해주면 성공~~!!

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

 

반응형

댓글