본문 바로가기
Pwnable/Pwnable CTF

[Pwnable.kr] Toddler's Bottle_random

by Y06 2021. 4. 6.

처음 화면에 들어가면 보이는 문제이다.

아빠, 프로그래밍에서 임의의 값을 사용하는 방법을 가르쳐주세요! 라고 문제에서 얘기하고 있다.

우분투를 사용하여 문제에 접속하였다.

ls -l 을 이용하여 파일 목록을 확인하였다.

먼저, 소스코드를 확인하겠다.

unsigned int로 key를 입력받고 rand()와 XOR시킨 값을 0xdeadbeaf와 비교해서 같으면 flag가 실행되면서 플래그 값을 획득할 수 있다.

 rand()가 랜덤으로 난수를 생성한다. rand() 함수는 그대로 사용하면 랜덤 값이 아닌 같은 값을 출력한다는 취약점을 가지고 있다.

따라서 실행할 때마다 바뀌는 난수를 얻지는 못한다.

rand 함수의 번위는 0~RAND_MAX(0x7fff)이다. 즉, 0~3276을 의미한다.

 

소스코드를 보니 rand() 함수를 아무것도 붙이지 않고 호출하고 있기 때문에 실핼 시마다 고정된 값이 출력될 것이므로 생성된 값을 gdb 명령어를 통해서 key의 페이로드를 구할 것이다.

 

우선 rand() 호출 직후에 bp를 걸고 실행한 후 random 변수의 값을 확인한다.

18에 브레이크를 걸고 eax에 들어간 값을 확인해보면 0x6b8b4567이라는 것을 확인할 수 있다.

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

 

계산한 값인 3039230856을 넣어준다.

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

'Pwnable > Pwnable CTF' 카테고리의 다른 글

[Pwnable.kr] Toddler's Bottle_leg  (0) 2021.04.27
[Pwnable.kr] Toddler's Bottle_input  (0) 2021.04.06
[Pwnable.kr] Toddler's Bottle_passcode  (0) 2021.03.31
[Pwanable.kr] Toddler's Bottle_flag  (0) 2021.03.31
[Pwnable.kr] Toddler's Bottle_bof  (0) 2021.03.23