#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;
}
코드가 아주 간단하다.
랜덤값 하나 받아놓고 특정 값과 베타 논리합을 통해서 키값을 구하는 문제다.
c 좀만 해보면 그냥 보자마자 알 수 있고 사실 몰라도 여러번 하다보면 알아챌 수 밖에 없다.
이 코드에는 난수를 생성할 때 seed가 없다. 때문에 실행할 때 마다 항상 같은 난수가 나온다.
이렇게 말하니까 난수도 아니다. 그냥 어떤 값 하나 놓고 실행 시키는거다.
그럼 이제 그 '어떤 값'을 찾아 내기만 하면 된다.
rbp - 0x4에 저장시키는것 같다. 400609에 bp를 걸고 살펴보겠다.
이렇게 난수(?)가 나온다. 이 몇번을 실행시켜도 이 값이 나온다.
0xdeadbeef에 xor연산을 하면 답이 나온다. 난수가 접속할때마다는 달라지는지 어쩐지 몰라서 그냥 여기까지만 적겠다.
'write-up > pwnable.kr' 카테고리의 다른 글
[toddler's bottle] input (0) | 2018.11.30 |
---|---|
[toddler's bottle] mistake (0) | 2018.11.30 |
[toddler's bottle] passcode (0) | 2018.11.30 |
[toddler's bottle] flag (0) | 2018.11.30 |
[toddler's bottle] bof (0) | 2018.11.30 |