소스 코드
#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()는 seed값에 변화를 주지 않으면 실행마다 같은 값을 반환한다.
main()을 disassemble한 결과이다
random = rand(); // random value!
해당 코드는 <main+18>에 해당한다.
따라서 <main+21>에 break point를 걸고 random 변수의 값을 확인해보자
random이라는 변수가 위치한 rbp-4의 값이 0x6b8b4567임을 알 수 있다.
앞서 말했듯이, rand()는 seed값에 변화를 주지 않는 이상 실행마다 같은 값을 반환하므로, 실행마다 같은 값이 변수 random에 저장되게 된다.
따라서 우리는
a ^ b = c
a ^ c = b라는 xor의 계산 성질을 이용해서
0x6b8b4567 ^ 0xdeadbeef 의 결과값을 key로 주면 flag를 얻을 수 있다
'pwnable.kr > Toddler's Bottle' 카테고리의 다른 글
passcode (0) | 2023.08.03 |
---|---|
flag (0) | 2023.08.03 |
bof (1) | 2023.06.14 |
collision (0) | 2023.06.14 |
fd (0) | 2023.06.14 |