Pwnablekr_Toddlers Bottle_random

ssh로 접속하면 소스파일과 실행파일이 있다.

C 파일의 핵심 알고리즘은 다음과 같다.

  • rand 함수로 랜덤 숫자 생성
  • 입력값과 랜덤 숫자를 xor한 값과 0xdeadbeef를 비교, 맞을 시 플래그 인쇄

rand함수는 srand로 설정한 시드가 같다면 매번 같은 숫자를 뽑는다. 위 코드에서는 딱히 srand를 호출하지 않으므로 디폴트 시드인 1을 이용한다. 디버거를 이용하여 random 변수에 어떤 수가 저장되는 지 알아내면 된다.

rand함수를 호출한 뒤 eax에 반환한 리턴값이다. random 변수에는 0x6b8b4567이 저장된다.

이제 key를 찾으면 된다. key^0x6b8b4567 = 0xdeadbeef 를 만족하는 key를 구해야 한다. key는 0xdeadbeef ^ 0x6b8b4567 한 값이다. 이는 xor 계산의 특징이다.

즉, key의 값은 0xB526FB88이다. scnaf에서 %d를 이용하므로, 0xB526FB88를 10진수로 변환한 3039230856를 입력해야 한다.

flag는 Mommy, I thought libc random is unpredictable... 이다.


tags: writeup, pwnable, elf file, linux, c lang, insecure randomness, pseudo random