본문 바로가기
Security/pwnable.kr

[pwnable.kr] Toddler's Bottle - random

by 단월໒꒱ 2021. 11. 15.

이번에 풀 문제는 random 문제이다.

차례대로 풀고 싶었으나 지금 도전하기엔 어려워서 일단 풀만한 것부터 해보기로 했다.

 

 

 

 

이번 문제는 random value에 대한 문제인 것 같다.

 

얼마 전 과제를 할 때 random 함수를 쓰더라도 seed 값을 바꾸지 않는 이상 값이 매번 바뀌지 않고 일정하다는 내용을 알아본 적이 있다.

이런 내용에 대한 문제인가 의심이 들었지만 일단 다음으로 넘어가보도록 하자.

 

문제에 적혀있는대로 명령어를 통해 pwnable.kr에 접속한다.

 

 

 

 

비밀번호는 guest라 했으므로 그대로 입력해준다.

 

 

 

 

접속이 완료되었다.

 

 

 

 

마찬가지로 ls -l 명령어를 통해 어떤 파일이 있나 살펴보았다.

우리가 원하는 건 flag이지만 아직 flag에 접근할 수 없으므로 일단 현 시점에서 접근할 수 있는 random.c 파일을 먼저 확인해보았다.

 

 

 

 

random이라는 변수에 rand 함수로 얻은 값이 저장되어있다는 것을 알 수 있다.

그리고 key 값을 입력 받는데, key와 random을 XOR 연산을 한 것이 0xdeadbeef 이면 flag를 출력하도록 되어있다.

 

XOR 연산을 한 것에 XOR 연산을 다시 해주면 아래처럼 원래 값이 나오므로

key ^ random == 0xdeadbeef

key == 0xdeadbeef ^ random 이 성립한다는 것을 알 수 있다.

 

이제 random값이 무엇인지 알아야하는데, 앞서 말한대로 seed를 설정할 수 없는 rand() 함수로 얻은 random 값은 항상 일정하다.

 

간단하게 소스코드를 만들어 random 값을 구해보았다.

 

 

 

 

random 값은 1804289383이다. 여러번 실행시켜서 매번 값이 같다는 것 또한 확인했다.

 

1804289383를 16진수로 바꾸면 6B8B4567이다.

 

6B8B4567과 DEADBEEF를 XOR 연산한 결과 B526FB88이 나오고 이 값을 다시 10진수로 바꿔준다.

 

 

 

 

계산기로 변환한 결과 key 값은 3039230856인 것을 알 수 있다.

 

 

 

 

random 파일을 실행시킨 뒤 위의 과정을 통해 얻은 값을 입력해주면 우리가 원하는 flag 내용을 볼 수 있다.

 

 

 

 

위에서 구한 flag 내용을 복사해서 붙여넣으면 

 

 

 

 

문제를 해결했다고 뜬다.

 

 

댓글