Post

(53) pwnable.kr random 문제 풀이

문제 설명

Daddy, teach me how to use random value in programming!

문제 풀이

이번에도 역시나 3개의 파일이 존재합니다. random.c부터 확인해 봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main(){
  unsigned int random;
  random = rand();  // random value!

  unsigned int key=0;
  scanf("%d", &key);

  if( (key ^ random) == 0xdeadbeef ){
    printf("Good!\n");
    system("/bin/cat flag");
    return 0;
  }

  printf("Wrong, maybe you should try 2^32 cases.\n");
  return 0;
}

rand()함수로 random값을 설정하고 key를 입력으로 받고 xor연산을 해서 결과가 0xdeadbeef(3735928559)라면 flag를 주도록 되어 있습니다.
flag를 얻기 위해서 rand()함수의 결과가 무엇인지를 알아야 합니다. 대부분의 언어에서, 랜덤함수는 seed가 고정되어 있습니다. 따라서 seed를 바꾸는 작업이 없으므로 프로그램은 항상 같은 값을 random에 넣을 겁니다.

그럼 그 값이 뭔지 찾아봅시다.

gdb에서 main함수를 확인해보니, main+13위치에서 rand함수를 호출하는게 보입니다. main+18에 breakpoint를 걸고 값을 확인해봅시다.

이렇게 실행하고 eax 레지스터 값을 확인해보니, 0xdeadbeef(1804289383)라는 값이 들어있는걸 볼 수 있습니다. 그렇다면 0xdeadbeef0xdeadbeef를 xor연산하면 key를 구할 수 있겠죠.

3039230856라는 결과가 나옵니다. 이 값을 random을 실행시키고 입력해보면

이렇게 flag가 나옵니다.

This post is licensed under CC BY 4.0 by the author.