#include <stdio.h>
#include <fcntl.h>
#define PW_LEN 10
#define XORKEY 1
void xor(char* s, int len){
int i;
for(i=0; i<len; i++){
s[i] ^= XORKEY;
}
}
int main(int argc, char* argv[]){
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);
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;
}
char pw_buf2[PW_LEN+1];
printf("input password : ");
scanf("%10s", 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;
}
fd를 할당할 때 괄호를 사용하지 않았으므로 open이 사이에 있고
양쪽의 = 과 < 가 순서대로가 아닌 우선순위에 의해서 진행된다.
그리고 <가 더 높은 우선순위를 가지고 있다.
실제로 파일 오픈이 실패하지 않는 이상 open의 리턴 값은 fd값이고, 이는 당연히 양수이므로
양수 < 0은 false를 리턴하고, fd = 0의 식이 진행된다.
그리고 다시 대입 연산자의 리턴값은 대입하는 값 (여기서는 0)이 되므로
if(0)이라 if문은 실행되지 않는다.
그렇게, 실제로 파일이 열리지 않고도 열린 것 처럼 보이고,
read 함수에서 fd는 0 즉, 표준 입력으로부터 데이터를 받고,
이후에 pw_buf2도 scanf를 통해서 표준 입력으로부터 값을 전달 받으니
두 값을 XOR 연산 생각해서 입력하면 exploit.
'Pwnable.kr' 카테고리의 다른 글
Pwnable.kr [coin1] (0) | 2019.05.01 |
---|---|
Pwnable.kr [shellshock] (0) | 2019.05.01 |
Pwnable.kr [leg] (0) | 2019.05.01 |
Pwnable.kr [input] (0) | 2019.04.30 |
Pwnable.kr [random] (0) | 2019.04.29 |