Wargame/pwnable.kr

[Pwnable.kr] random

핏디 2021. 7. 22. 12:17
SMALL

[문제]

 


[풀이]

문제에 접속해 파일 목록을 확인하니 random 실행파일과 c코드를 확인할 수 있다.

random.c 파일을 확인하면 다음과 같다.

1 #include <stdio.h>
  2 
  3 int main(){
  4         unsigned int random;
  5         random = rand();        // random value!
  6 
  7         unsigned int key=0;
  8         scanf("%d", &key); //입력 값을 key 변수에 저장
  9 
 10         if( (key ^ random) == 0xdeadbeef ){ //입력 값인 key와 random 값을 xor 연산하여 0xdeadbeef가 나와야 함.
 11                 printf("Good!\n");
 12                 system("/bin/cat flag");
 13                 return 0;
 14         }
 15 
 16         printf("Wrong, maybe you should try 2^32 cases.\n");
 17         return 0;
 18 }
 19

코드를 대략적으로 분석해보면,

5번 코드에서 random 값을 만든 다음 매번 다른 random 값과 사용자의 입력 값을 xor 한 값이 0xdeadbeef 일 경우 flag를 호출하도록 설정되어 있다.

 

그러나 rand함수에서 취약점이 존재하게 된다. rand 함수에서 매번 random값을 출력하기 위해서는 seed 값이 필요하다. 즉, srand(time(NULL))의 형태로 사용해야 하며 단순하게 rand() 형태로 사용될 경우 초기 값만 random 하게 설정되고 이후의 값은 고정된다. 

 

다시 말해,

가장 처음에 rand함수로 어떠한 값 A가 생성됨
-> 다시 random 실행파일을 실행했을 때 새로운 값이 아닌, 고정된 A만 random 값으로 갖게 됨

 

라고 정리해볼 수 있다.

 

그렇다면 random 값을 gdb에서 알 수 있을 것이며, xor 연산의 특징에 따라 어떤 입력 값을 줘야 하는지도 알 수 있다.

 

우선, gdb 실행 전 실행파일을 실행하여 다수의 a를 입력하니 에러 메시지가 출력되었다.

 

이에 gdb를 실행하였고, peda를 사용하기 위해 source /usr/share/peda/peda.py 입력하였다.

 

main 함수를 확인하니 rbp-0x4에 random 값이 존재하고, rbp-0x8에 사용자의 입력 값이 저장될 것을 알 수 있다.

 

rand 함수 호출한 직후인 main+18에서 $rbp-0x4 값을 확인하니 0x6b8b4567이 저장되어 있음을 알 수 있고, 이 값은 random 변수의 값이 된다. 프로그래머는 이 값이 게속 바뀌길 기대했지만, seed 값이 없어 random 값이 고정된다.

 

 

입력 값으로 다수의 1을 입력한 후 $rbp-0x8값을 확인하니, 입력 dec형태로 입력 받은 값을 hex 형태로 저장하는 것을 알 수 있다.

 


따라서, random 값인 0x6b8b4567와 0xdeadbeef를 xor 했을 때 출력되는 값을 입력 값으로 주면 flag를 획득할 수 있겠다.

 

10진수로 3039230856을 입력하면 문제가 해결된다.

xor 연산 특징의 경우 [핵심] 확인할 것.

 

./random 실행 후 해당 값을 입력하면 flag가 출력됨을 확인해볼 수 있다.


[핵심]

rand() 함수

: 랜덤한 숫자를 반환하는 함수로, 0~32767 사이의 값을 반환함.

-rand() 만 사용할 경우, 고정된 값 출력.

-> 프로그램 생성될 때 값이 정해지기 때문

-srand(time(NULL))의 형태로 사용해야 랜덤 값을 획득할 수 있음.

->여기서 s는 seed의 약어로, rand 함수에 사용될 수를 초기화함.

이 초기화를 매개변수로 받는 seed 값을 이용함.

rand 함수는 내부적으로 어떤 srand의 매개변수로 들어온 seed 값과 매칭되는 숫자가 정해지면서 난수를 생성하게 됨.

 

xor 연산

-AND, OR 연산과 함께 비트 연산자로 사용됨.

-주로 암호화에 사용 -비트 값이 같으면 1, 같지 않으면 0을 출력함.

1 ^ 1 -> 0

0 ^ 0 -> 0

1 ^ 0 -> 1

0 ^ 1 -> 1

- 같은 값을 XOR 연산하면 상쇄된다는 특징이 있음.

ex) 0xcafebabe ^ 0xcafebabe = 0 - a ^ b = c 일 때, b = c ^ a 인 성질을 가짐

 

 

*gdb 에서 intel 문법으로 표기하는 법?

1.set disassembly-flavor intel

2. q 작성 시, gdb 종료 후에도 고정!

 

*gdb에서 peda 사용하는 법?

PEDA : Python Exploit Development Assistance for GDB

-> source /usr/share/peda/peda.py

 

LIST

'Wargame > pwnable.kr' 카테고리의 다른 글

[Pwnable.kr] leg  (0) 2021.08.04
[Pwnable.kr] input2  (0) 2021.07.22
[Pwnable.kr] passcode  (0) 2021.06.03
[Pwnable.kr] flag  (0) 2021.06.03
[Pwnable.kr] bof  (0) 2021.06.03