Security/System
[pwnable.kr] Toddler's Bottle - random 문제
bonggang
2019. 10. 2. 03:55
문제
문제풀이
접속
ssh random@pwnable.kr -p2222
코드 확인 및 해석
ls 명령어로 파일 목록 확인 후 cat random.c로 코드 확인
#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;
}
- 코드를 보면 (key^random) == 0xdeadbeef 를 만족하면 flag를 획득할 수 있다.
- rand()를 사용했지만 srand(time(NULL))을 사용한 것은 아니다 = 매번 같은 값이 생성된다.
※ rand() 시 같은 값이 나오는 이유는 시드(seed)를 변경해주지 않았기 때문이다.
- random 변수의 값을 찾아서 0xdeadbeef와 XOR 시킨다면 flag 획득 가능
디버깅
random 변수 값을 찾기 위해 디버깅을 해보자!
- b *main+18: random 변수 위치를 찾기위해 Break Point를 걸어준다.(call rand() 직후)
- rax 값이 rand() 함수를 거친 random 변수의 값이다.
※ rax: 함수 종료 후 반환 시 rax에 저장된 값을 return
계산
- random 변수의 값(0x6b8b4567 = 1804289383
- 0xdeadbeef와 XOR
실행화면