본문 바로가기

WARGAME/pwnable.kr [system]

[Toddler's Bottle] 6번 random

random

언제나처럼 cat random.c를 해본다.

 

random.c

key 를 입력받고 rand() 와 xor시킨 값을 0xdeadbeef 와 비교해서 같으면 플래그를 획득할 수 있다.

 

rand()가 랜덤으로 난수를 생성하는데 어떻게 풀어야하는걸까 정말 2^32 번 반복해야하는걸까 ?

rand() 그대로 사용하면 랜덤 값이 아닌 같은 값을 출력한다는 취약점이 있다.

따라서 실행시 마다 바뀌는 난수를 얻고 싶다면 srand(time(NULL)) 을 사용해야한다.

 

*rand() : 예측할 수 없는 하나의 난수를 생성, 범위는0~RAND_MAX(0x7fff) ,따라서 난수의 범위는0~32767

*srand() : 호출할때 전달받은 인자를 기반으로 난수를 초기화

*time() : 인자로 NULL을 넘기면1970년1월1일(UTC 타임 존) 으로부터 경과한 현재 초 수를 리턴

-> 즉 시간은 계속 흐르고 변화하므로 이 값을 srand인자로 넘기면 난수를 초기화 시켜준다.

-> srand(time(NULL))선언 이후에 rand()를 호출하여

->실행 시 마다 초기화되는 난수를 가지고 랜덤 수를 생성할 수 있는 것

 

아무튼, 이 소스에서는 rand()를 그냥 호출하고 있으니 실행 시마다 고정된 값이 출력될 것이므로

생성된 랜덤 값을 gdb로 확인해서 key의 페이로드를 구하면 된다.

 

disas main

우선 rand() 호출 직후에 브레이크 포인트를 걸고 실행한 후 random 변수의 값을 확인한다.

 

18에 브포를 걸고 eax에 들어간 값을 확인해보면

info register $eax

0x6b8b4567임을 확인할 수 있다.

 

key ^ random == 0xdeadbeef 여야 하므로 random ^ 0xdeadbeef 를 통해 key 를 알아낼 수 있다.

 

key 는 

0x6b8b4567 xor 0xdeadbeef

가 될 것이고 이걸 정수형으로 변환하면 3039230856이다.

 

실행 후 인자로 입력해주면,

flag

flag 획득!

'WARGAME > pwnable.kr [system]' 카테고리의 다른 글