반응형

Daddy, teach me how to use random value in programming!


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




##########################################################################

파파고번역


아빠, 프로그래밍에 랜덤가치를 사용하는 법을 가르쳐줘!


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


#########################################################################



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

}



 0x00000000004005f4 <+0>:     push   rbp

   0x00000000004005f5 <+1>:     mov    rbp,rsp

   0x00000000004005f8 <+4>:     sub    rsp,0x10

   0x00000000004005fc <+8>:     mov    eax,0x0

   0x0000000000400601 <+13>:    call   0x400500 <rand@plt>


   0x0000000000400606 <+18>:    mov    DWORD PTR [rbp-0x4],eax

   0x0000000000400609 <+21>:    mov    DWORD PTR [rbp-0x8],0x0


   0x0000000000400610 <+28>:    mov    eax,0x400760

   0x0000000000400615 <+33>:    lea    rdx,[rbp-0x8]

   0x0000000000400619 <+37>:    mov    rsi,rdx

   0x000000000040061c <+40>:    mov    rdi,rax

   0x000000000040061f <+43>:    mov    eax,0x0

   0x0000000000400624 <+48>:    call   0x4004f0 <__isoc99_scanf@plt>


   0x0000000000400629 <+53>:    mov    eax,DWORD PTR [rbp-0x8]

   0x000000000040062c <+56>:    xor    eax,DWORD PTR [rbp-0x4]

   0x000000000040062f <+59>:    cmp    eax,0xdeadbeef

   0x0000000000400634 <+64>:    jne    0x400656 <main+98>


   0x0000000000400636 <+66>:    mov    edi,0x400763

   0x000000000040063b <+71>:    call   0x4004c0 <puts@plt>


   0x0000000000400640 <+76>:    mov    edi,0x400769

   0x0000000000400645 <+81>:    mov    eax,0x0

   0x000000000040064a <+86>:    call   0x4004d0 <system@plt>


   0x000000000040064f <+91>:    mov    eax,0x0

   0x0000000000400654 <+96>:    jmp    0x400665 <main+113>


   0x0000000000400656 <+98>:    mov    edi,0x400778

   0x000000000040065b <+103>:   call   0x4004c0 <puts@plt>


   0x0000000000400660 <+108>:   mov    eax,0x0

   0x0000000000400665 <+113>:   leave

---Type <return> to continue, or q <return> to quit---

   0x0000000000400666 <+114>:   ret


코드가 매우 간결하다.

key값을 입력받아 key^random값(xor한값)이 0xdeadbeef이면된다.

그런데 rand()함수는 랜덤값을 반환한다?무엇을 입력하더라도 랜덤값이 나올것라고 예측되지만

rand()함수의 취약점에 대해 알아보자.

https://onlywis.tistory.com/4

즉 항상 일정한 값을 가져온다.

이것을 방지하기위해선 srand()함수를 사용하여야한다. srand()또한 시간이 예측될수 있다면 위험하다.





b *main+18로 break point를 지정해 살펴보면 rand함수로 생성된 값을보면

3번의 실행 모두 같은값을 넣는모습을 볼수있다.

(gdb) run

The program being debugged has been started already.

Start it from the beginning? (y or n) y

Starting program: /home/random/random


Breakpoint 2, 0x0000000000400606 in main ()

(gdb) info reg $eax

eax            0x6b8b4567       1804289383

(gdb) run

The program being debugged has been started already.

Start it from the beginning? (y or n) y

Starting program: /home/random/random


Breakpoint 2, 0x0000000000400606 in main ()

(gdb) info reg $eax

eax            0x6b8b4567       1804289383

(gdb) run

The program being debugged has been started already.

Start it from the beginning? (y or n) y

Starting program: /home/random/random


Breakpoint 2, 0x0000000000400606 in main ()

(gdb) info reg $eax

eax            0x6b8b4567       1804289383



eax 값이 항상 0x6b8b4567인것을 알수있다.


이제 입력값^0x6b8b4567=0xdeadbeef인것을 찾으면 되는데

xor은 A^B=C 이고, C^A=B이고, A^C=B 이다


입력값은 0x6b8b4567^0xdeadbeef를 계산해서 넣어주면된다.

>>> 0x6b8b4567^0xdeadbeef

3039230856


./ramdom 로 실행후

3039230856로 입력값을 주어도 되고


파이썬으로 인자값을 넣어주어도 된다.

(python -c 'print "3039230856"') | ./random






반응형

'보안 > pwnable.kr' 카테고리의 다른 글

pwnable.kr passcode  (0) 2020.01.30
pwnable.kr flag  (0) 2020.01.30
pwnable.kr bof  (0) 2020.01.30
pwnable.kr collision  (0) 2019.12.11
pwnable.kr fd  (1) 2019.12.11
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기