Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

White Security

Random 문제풀이 본문

Wargame Writeups/pwnable.kr

Random 문제풀이

POSIX 2019. 2. 6. 17:53
Daddy, teach me how to use random value in programming!

ssh random@pwnable.kr -p2222 (pw:guest)


C 언어의 랜덤함수에 관한 문제입니다..


#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 값이 

입력한 값과 xor 연산했을 때에 

0xdeadbeef 가 나와야 한다는 조건인데 


결국은 random 값만 알게 되면 끝나는 문제입니다.


srand(time(NULL));


C언어에서 rand 함수를 사용하기 전에는

흔히 srand타임스탬프 값을 사용하여

시드를 주어야 할 필요가 있습니다.


그렇지 않으면 항상 정수 1 을 시드로 사용하여

똑같은 값을 출력하게 되지요.


상세 설명


Dump of assembler code for function main:
   0x00000000004005f4 <+0>:     push   %rbp
   0x00000000004005f5 <+1>:     mov    %rsp,%rbp
   0x00000000004005f8 <+4>:     sub    $0x10,%rsp
   0x00000000004005fc <+8>:     mov    $0x0,%eax
   0x0000000000400601 <+13>:    callq  0x400500 <rand@plt>
   0x0000000000400606 <+18>:    mov    %eax,-0x4(%rbp)
   0x0000000000400609 <+21>:    movl   $0x0,-0x8(%rbp)
   0x0000000000400610 <+28>:    mov    $0x400760,%eax
   0x0000000000400615 <+33>:    lea    -0x8(%rbp),%rdx
   0x0000000000400619 <+37>:    mov    %rdx,%rsi
   0x000000000040061c <+40>:    mov    %rax,%rdi
   0x000000000040061f <+43>:    mov    $0x0,%eax
   0x0000000000400624 <+48>:    callq  0x4004f0 <__isoc99_scanf@plt>
   0x0000000000400629 <+53>:    mov    -0x8(%rbp),%eax
   0x000000000040062c <+56>:    xor    -0x4(%rbp),%eax
   0x000000000040062f <+59>:    cmp    $0xdeadbeef,%eax
   0x0000000000400634 <+64>:    jne    0x400656 <main+98>
   0x0000000000400636 <+66>:    mov    $0x400763,%edi
   0x000000000040063b <+71>:    callq  0x4004c0 <puts@plt>
   0x0000000000400640 <+76>:    mov    $0x400769,%edi
   0x0000000000400645 <+81>:    mov    $0x0,%eax
   0x000000000040064a <+86>:    callq  0x4004d0 <system@plt>
   0x000000000040064f <+91>:    mov    $0x0,%eax
   0x0000000000400654 <+96>:    jmp    0x400665 <main+113>
   0x0000000000400656 <+98>:    mov    $0x400778,%edi
   0x000000000040065b <+103>:   callq  0x4004c0 <puts@plt>
   0x0000000000400660 <+108>:   mov    $0x0,%eax
   0x0000000000400665 <+113>:   leaveq
   0x0000000000400666 <+114>:   retq


따라서 gdb을 사용해

생성되는 값을 확인 한 후에

계산해 사용하면 끝입니다.


시드가 주어지지 않았기에

항상 똑같은 값만 나오니까요


(gdb) x/wa $rbp-4
0x7ffd534b93bc: 0x6b8b4567


>>> 0x6b8b4567 ^ 0xdeadbeef
3039230856


생성된 random 값을 찾아내

xor 연산을 수행하는 것으로 key 값을 얻을 수 있었습니다.


random@ubuntu:~$ ./random
3039230856
Good!
Mommy, I thought libc random is unpredictable...


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

Leg 문제풀이  (0) 2019.02.08
Input 문제풀이  (0) 2019.02.07
Passcode 문제풀이  (0) 2019.02.06
Flag 문제풀이  (0) 2019.02.05
Bof 문제풀이  (0) 2019.02.05
Comments