시스템 해킹 & 보안

[5] random - pwnable.kr

ahhyun98 2025. 7. 4. 16:28

 

시스템 해킹 문제들

https://pwnable.kr/

 

https://pwnable.kr/

   there are flag   files corresponding to each challenges (similar to CTF), you need to read it and submit to pwnable.kr to get the corresponding point. in order to read the flag file, you need some skills regarding programming, reverse-engineering, bu

pwnable.kr

 


문제

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

if ((key ^ random) == 0xdeadbeef) {
    system("/bin/cat flag");
}

 

  • 사용자가 입력한 key와 rand() 값이 XOR 연산되어 0xdeadbeef가 되는 조건을 만족해야 한다. 
  • 겉보기엔 랜덤 같지만, rand()는 seed 없이 호출되면 항상 같은 값을 반환한다는 점을 이용한다. 

공격

 

1) rand()는 내부적으로 seed가 고정되어 있으면 항상 동일한 값을 출력한다. 

2) GDB를 이용해 rand() 호출 후 반환값을 확인한다. 

3) key = 0xdeadbeef ^ rand_val 계산 후 입력하면 flag가 출력된다. 

 

$ ssh random@pwnable.kr -p2222
$ gdb ./random
gdb-peda$ b *main+13
gdb-peda$ run
0x400601 <main+13>: call rand@plt
0x400606 <main+18>: mov DWORD PTR [rbp-0x4], eax

 

=> nexti 명령으로 rand() 호출 이후 eax 값을 확인한다.

gdb-peda$ nexti
RAX: 0x6b8b4567

 

 

=> XOR 계산 (A ^ B = C => C ^ B = A)

 

key = 0xdeadbeef ^ 0x6b8b4567 = 3039230856

 

ex)
4455 xor 1122 = 5577
5577 xor 1122 = 4455

key xor random = 0xdeadbeef
0xdeadbeef xor random = key

key=B526FB88
근데 코드를 보면 %d니까 key=3,039,230,856

 

결과

$ ./random
3039230856
Good!
Mommy, I thought libc random is unpredictable...

 

 

 

 

 

이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.

모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.