해설
We all make mistakes, let's move on.
(don't take this too seriously, no fancy hacking skill is required at all)
This task is based on real event
Thanks to dhmonkey
ssh로 접속해서 mistake.c 코드를 확인해보면 다음과 같다.
#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;
}
코드는 /home/mistake/password 파일을 읽어들여 pw_buf에 저장하고 사용자로부터 10바이트 입력을 받아 pw_buf2에 저장한다. 이 후 pw_buf2를 바이트마다 1과 xor 연산 한 후, pw_buf와 비교하여 같으면 flag가 출력된다. 코드의 의도는 password 파일의 패스워드를 사용자가 맞추도록 하는것이겠지만, 첫번째 if문에서 연산자 우선순위에 의해 open(~) < 0이 먼저 계산이 되고, 이는 open이 제대로 된 fd 값을 반환할 경우 false가 된다. 그리고 false는 implicit type casting에 의해 0이되어 fd에 저장된다. fd 0은 표준 입력을 의미하므로, 결국에는 코드 의도와 다르게 pw_buf2뿐만 아니라 pw_buf도 사용자로부터 입력을 받게 된다. 따라서 다음과 같이 입력하면 flag가 출력 된다.
'pwn' 카테고리의 다른 글
pwnable.kr - coin1 (0) | 2020.07.16 |
---|---|
pwnable.kr - shellshock (0) | 2020.07.15 |
pwnable.kr - leg (0) | 2020.03.04 |
pwnable.kr - input (0) | 2019.08.26 |
pwnable.kr - passcode (0) | 2019.08.22 |