White Security
Random 문제풀이 본문
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