이번에는 이놈을 잡을 겁니다.


저번과 마찬가지로 1pt



저번에는 Mommy였는데, 이번에는 Daddy한테 배우는 모양


일단 접속.



이번에도 마찬가지로 random에 setuid가 걸려있어서 저 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;
}
cs


코드를 보자. 먼저 rand() 함수를 이용해서 랜덤한 값을 random에 받는다.


그 후 사용자로 부터 key를 입력받고, key와 random값을 XOR하여 이 값이 0xdeadbeef 값이라면 flag를 출력해준다.


rand에 대해 간단히 알아보면...

함수의 원형

   int rand( void );    // 난수의 범위 : 0~RAND_MAX, RAND_MAX는 0x7fff이므로 결국 난수의 범위는 0~32767

   void srand( unsigned int seed );  // rand()의 시드값 설정


그러나 rand()함수만 사용하면 프로그램을 실행할때마다 항상 일정한 난수값이 나오므로(그러므로 난수가 아니다.) 

보통은 srand()와 함께 사용하여 시드값을 설정하여 항상 같은 난수열이 나오지않도록해준다. 

하지만 이 프로그램은 그러고 있지않으므로 항상 똑같은 값이 random에 저장되어 있을 것이다.


그러므로 random값이 무엇인지 알아내어 0xdeadbeef와 xor하면 어떤 key값을 넣어야하는지 알 수 있을것이다.


 
#include <stdio.h>
 
int main(){
        unsigned int random;
        random = rand();        // random value!
 
        unsigned int key=0;
        scanf("%d"&key);
 
        printf("%d\n"0xdeadbeef^random);
        return 0;
}
 
cs


위와 같은 소스를 짜서 어떤 값을 입력하면 되는지 알아내었다.


-1255736440이라는 값이 나오고 이것을 이제 입력해주면 된다.


시작은 Daddy로 하고... 엄마를 찾는거냐..

Mommy, I thought libc random is unpredictable...


libc random값은 예측할수 없는 것이 아니였다...(물론 seed를 준다면 또 모르지만, 그것도 seed값을 안다면 예측할수있다...)



플래그획득! 굿!


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

[pwnable.kr] blackjack - 1 pt  (0) 2018.05.01
[pwnable.kr] cmd1 - 1 pt  (0) 2018.05.01
[pwnable.kr] shellshock - 1 pt  (0) 2018.05.01
[pwnable.kr] mistake - 1 pt  (0) 2018.04.27
[pwnable.kr] fd - 1 pt [Toddler's Bottle]  (0) 2018.04.24

+ Recent posts