[Toddler's Bottle]
오늘의 문제는 ssh 주소 하나가 있고, operator priority(연산자 우선순위) 라는 hint가 주어졌다.
ssh 주소를 입력해 문제에 접속했다.
ls -l 명령을 사용해 현재 위치에 있는 모든 파일을 확인해주었다. flag, mistake, mistake.c, password 총 4개의 파일이 있다.
cat mistake.c 명령을 통해 mistake.c 파일의 내용을 확인해보았다. xor 함수와 main함수로 이루어져 있다. 우선 main함수부터 살펴보자!
int fd;
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
printf("can't open password %d\n", fd);
return 0;
}
printf("do not bruteforce...\n");
sleep(time(0)%20);
첫번째 if문에서, open 함수의 반환값인 fd와 0을 비교하는 것 같지만 이는 틀렸다. 힌트에서 말했듯이 연산자 우선순위를 확인해보면, 비교연산자(<)가 산술연산자(=)보다 우선순위가 높다는 사실을 기억해야한다. 즉, fd의 값과 0을 비교하는 것이 아닌, open함수의 반환값과 0을 비교한 뒤, 이를 fd에 넣어주는 것이다.
위 코드가 실행될 때, open 함수에서 파일이 정상적으로 열리게 되므로 양수를 반환하게 되며, 0보다 작지 않기 때문에 fd 값은 false를 의미하는 0이 들어가게 된다.
그 후 "do not bruteforce...\n" 메세지가 출력되고 sleep 함수가 실행된다.
char pw_buf[PW_LEN+1];
int len;
if(!(len=read(fd,pw_buf,PW_LEN) > 0)){
printf("read error\n");
close(fd);
return 0;
}
두번째 if문도 마찬가지다. 현재 fd에 0이 들어가 있는 상태인데, fd=0이면 stdin을 의미한다. 즉, 사용자로부터 입력값을 받는다. 이 입력값은 pw_buf에 들어가게 되고, 정상적으로 들어가기만 하면 두번째 if문은 통과다.
char pw_buf2[PW_LEN+1];
printf("input password : ");
scanf("%10s", pw_buf2);
그 다음 scanf를 통해 pw_buf2 값을 입력한다.
.
// xor your input
xor(pw_buf2, 10);
if(!strncmp(pw_buf, pw_buf2, PW_LEN)){
printf("Password OK\n");
system("/bin/cat flag\n");
}
else{
printf("Wrong Password\n");
}
close(fd);
return 0;
그 다음, xor 함수를 실행한다. 세번째 if문에서, pw_buf의 내용과 pw_buf2의 내용이 같은지 확인한다. 같으면 if문이 실행되면서 flag 파일을 열람할 수 있게 된다. pw_buf와 pw_buf2 모두 우리가 설정할 수 있고, PW_LEN = 10이다. pw_buf와 pw_buf2를 xor한 값이 같기만 하면 된다!
#define XORKEY 1
void xor(char* s, int len){
int i;
for(i=0; i<len; i++){
s[i] ^= XORKEY;
}
}
xor 함수를 확인해보면, 주어진 크기만큼의 배열에 1을 집어넣는다. ^는 xor 연산을 의미한다.
그냥 pw_buf와 pw_buf2 둘 중 하나에는 0만, 하나에는 1만 집어넣으면 xor 연산이 맞기 때문에 간단하게 문제가 끝난다.
flag를 입력해주면 정답!!
flag: Mommy, the operator priority always confuses me :(
'포너블(pwnable) > CTF(pwnable.kr)' 카테고리의 다른 글
[Toddler's Bottle] blackjack 문제풀이 (0) | 2021.05.07 |
---|---|
[Toddler's Bottle] coin1 (0) | 2021.05.06 |
[Toddler's Bottle] leg 문제풀이 (0) | 2021.04.28 |
[Toddler's Bottle] input 문제풀이 (0) | 2021.04.07 |
[Toddler's Bottle] random 문제풀이 (0) | 2021.04.05 |
댓글