[pwnable.kr] random - 1 pt [Toddler's Bottle]
이번에는 이놈을 잡을 겁니다.
저번과 마찬가지로 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 |