#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;
}
일단 코드를 보면 xor하는 함수가 하나 보이고 메인에서는 password파일을 열어서 pw_buf에 내용을 저장하는거 같다.
그리고 pw_buf2에 입력을 받고 그 값을 xor함수에 넣는다. 그리고 pw_buf와 pw_buf2의 값을 비교해 플래그를 출력하는 프로그램이라는걸 알 수 있다.
힌트를 보면 연산자 우선순위에 관련된 문제인 걸 알 수 있다.
코드를 다시 잘 살펴보면 뭔가 이상한 부분을 찾을수 있다.
password파일을 open하는 곳이랑 pw_buf에 read로 입력받는 곳이다.
대입 연산자는 비교연산자보다 순위가 낮다.
그래서 if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0) 여기서 fd에는 open에서 리턴되는 fd값이 아닌
0과 먼저 비교한 값이 들어간다. password가 정상적으로 열린다면 양수값이 반환될거니 False가 되어 0이 반환되기때문에 fd에는
0이 들어간다.
fd에 0이 들어가면 read에서 입력을 받을때 우리가 입력하는 값을 받아들일 것이다.
그렇다면 우리는 xor된 값과 xor이 안된값을 연속적으로 넣어주면 플래그를 읽을 수 있을거 같다.
mistake@pwnable:~$ ./mistake
do not bruteforce...
0000000000
input password : 1111111111
Password OK
Mommy, the operator priority always confuses me :(
read에서 입력받을때 0000000000을 입력하고 sleep때문에 잠깐 기다리면 input password: 가 나온다.
이때 우리가 입력한 값의 xor된 값을 넣어주면 플래그가 나온다.
flag: Mommy, the operator priority always confuses me :(
'워게임 > pwnable.kr' 카테고리의 다른 글
blackjack (0) | 2022.02.23 |
---|---|
shellshock (0) | 2022.02.22 |
leg (0) | 2022.02.22 |
input (0) | 2022.02.22 |
random (0) | 2022.02.19 |