Pwnable/Pwnable.kr

pwnable.kr - 6 - random

KSJ._.seven11 2023. 2. 23. 21:50
#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;
}

 

 

오오 드디어 쉬운 문제인가 !! 싶었다.

 

코드가 너무나도 단순했기에 너무 설레는 마음으로 문제풀기를 시작했다.

 

scanf 를 통해 key 값을 할당 받는다.

 

random 값은 rand(); 함수로 랜덤값을 넣는다.

 

그렇게 Key 값과 random 을 연산하여 참이 되면 플래그를 출력하는 문제다.

 

드림핵에서 canary 강의를 보며 따라했던 방식처럼 임의적으로 바뀌는 랜덤값을 찾은 후 넣으면 되지 않을까 생각을 했다.

 

일단 rand() 함수에서 어떤 형식으로 값들이 이루어지는 찾아봤다.

https://hijuworld.tistory.com/66

 

이걸 보고 선린에서 rand 함수를 통해 풀었던 문제가 떠올랐다.

 

위에 글에서도 나와있지만

 

rand 함수는 한번 지정된 랜덤값이 지속적으로 출력 된다.

 

즉 프로그램을 한번 시작한 이상 몇번을 실행하든 같은 랜덤값이 배정된다.

 

 이를 방지하려면 srand 함수를 사용하면 된다.

 

아무튼 해당 문제의 핵심은 랜덤값은 정해져 있다는 것이다.!

 

gdb를 통해 랜덤값을 뜯어보고 이 값을 가지고 key 와 연산한 결과를 출력하면 될 것이다 !

 

pwndbg를 통해 까보자 !

 

rand 함수 호출후 바로 시행되는 부분이다. 이 부분을 통해 rbp-0x4에 eax 값을 넣는 걸 확인할 수 있다.

 

즉 random 변수는 rbp-0x4에 저장 된다.

 

 

해당부분에 bp를 걸어 까봤다.

 

이는 지정된 랜덤 값이 될 것이다.

 

이후 main 함수에 다른 부분을 보면

 

 

 scanf 함수 호출 후 저장되는 rbp-0x8은 key 값을 나타낼 것이다.

 

위를 보면 eax에 저장된 rbp-0x8 값고 rbp-0x4 가 xor 연산을 한다.

 

xor 연산은 각 비트가 같은 값인지 확인하는 역할을 한다.

 

코드에는

이 부분일 것이다.

 

^가 무슨 연산인지 모르겠다만 나에게는 킹갓짱 Python3가 있다.

 

이를 통해 연산 결과를 출력할 수 있을 것이다.

 

 

라는 값을 얻을 수 있다.

 

해당 값을 넣으면 플래그를 얻을 수 있지 않을까??

 

야호 ! 성공이다ㅏㅏㅏ

 

이번 문제는 굉장히 쉬웠다 !