Security/System

[pwnable.kr] Toddler's Bottle - random 문제

bonggang 2019. 10. 2. 03:55

문제


https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr

 

문제풀이


 

접속

ssh random@pwnable.kr -p2222

 

코드 확인 및 해석

ls 명령어로 파일 목록 확인 후 cat random.c로 코드 확인

#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;
}

- 코드를 보면 (key^random) == 0xdeadbeef 를 만족하면 flag를 획득할 수 있다.

- rand()를 사용했지만 srand(time(NULL))을 사용한 것은 아니다 = 매번 같은 값이 생성된다.

※ rand() 시 같은 값이 나오는 이유는 시드(seed)를 변경해주지 않았기 때문이다.

- random 변수의 값을 찾아서 0xdeadbeef와 XOR 시킨다면 flag 획득 가능

 

디버깅

random 변수 값을 찾기 위해 디버깅을 해보자!

- b *main+18: random 변수 위치를 찾기위해 Break Point를 걸어준다.(call rand() 직후)

 

- rax 값이 rand() 함수를 거친 random 변수의 값이다.

※ rax: 함수 종료 후 반환 시 rax에 저장된 값을 return

 

계산

- random 변수의 값(0x6b8b4567 = 1804289383

- 0xdeadbeef와 XOR

 

실행화면