
언제나처럼 cat 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의 페이로드를 구하면 된다.

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

0x6b8b4567임을 확인할 수 있다.
key ^ random == 0xdeadbeef 여야 하므로 random ^ 0xdeadbeef 를 통해 key 를 알아낼 수 있다.
key 는

가 될 것이고 이걸 정수형으로 변환하면 3039230856이다.
실행 후 인자로 입력해주면,

flag 획득!
'WARGAME > pwnable.kr [system]' 카테고리의 다른 글
[Toddler's Bottle] 9번 mistake (0) | 2019.11.27 |
---|---|
[Toddler's Bottle] 4번 flag (0) | 2019.11.19 |
[Toddler's Bottle] 3번 bof (0) | 2019.11.19 |
[Toddler's Bottle] 2번 collision (0) | 2019.11.14 |
[Toddler's Bottle] 1번 fd (0) | 2019.11.14 |