Yozzang의 해킹일기 💻
article thumbnail
Published 2022. 7. 4. 00:27
Pwnable (6. random) Wargame/Pwnable
728x90

이번 포스트에서는 Pwnable의 random 문제에 대해 다루겠다.

 


문제 코드는 다음과 같다.

#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;
}

## 문제 해석 :

해당 문제의 코드를 살펴보니 key값과 random값의 XOR 연산 값이 0xdeadbeef가 되어야 해결할 수 있는 것으로 보인다.

또한 random값이 일정하게 생성된다는 사실도 알 수 있다. random값을 매번 다르게 생성하려면 srand(time(NULL))을 써야 하기 때문이다.

## 문제 풀이 :

먼저 random 값을 알아낸 다음에 XOR 연산을 통해 Key값을 알아내면 된다.

main()

먼저 main함수를 디스어셈블 해보면 빨간 박스가 random 함수가 생성된 시점임을 알 수 있다. 그럼 빨간 박스의 다음 줄인+18에다가 break를 걸고 random 값을 알아내보겠다.

빨간 네모 박스 rax의 값인 0x6b8b4567이 random 값임을 확인할 수 있다. 이를 0xdeadbeef와 XOR하면 다음과 같다.

Key

## 최종 결과 : 

### 공격문 : 3039230856

### 실행 결과 :

공격 실행

Flag = Mommy, I thought libc random is unpredictable...

'Wargame > Pwnable' 카테고리의 다른 글

Pwnable (8. leg)  (0) 2022.07.06
Pwnable (7. input)  (0) 2022.07.05
Pwnable (5. passcode)  (0) 2022.07.03
Pwnable (4. flag)  (0) 2022.07.02
Pwnable (3. bof)  (0) 2022.06.22
profile

Yozzang의 해킹일기 💻

@요짱

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!