문제 : 

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


hint : operator priority


ssh mistake@pwnable.kr -p2222 (pw:guest)


mistake.c를 읽어보았다.


#include <stdio.h>

#include <fcntl.h>             fcntl.h헤더에 대한 글 http://www.joinc.co.kr/w/Site/system_programing/File/Fcntl 


#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){ ..**여기서 우선순위로 password를 열수있다. open(~)<0 이 false이므로 fd=false=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];            .pw_buf[11]

int len;

if(!(len=read(fd,pw_buf,PW_LEN) > 0)){  read는 정상실행시 읽은 바이트수 반환이지만, fd=0이면 입력을 받게 된다. 즉 len=~코드는 scanf(%s pw) 

printf("read error\n");

close(fd);

return 0;

}


char pw_buf2[PW_LEN+1];    .pw_buf2[11]

printf("input password : ");

scanf("%10s", pw_buf2);


// xor your input

xor(pw_buf2, 10);        .인풋비트을 1과 xor


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;

}


문제에서 단순하게 생각하라고 한다. 결국 첫번째 10글자 인풋은 pwbuf1에 두번째 10글자 인풋은 pwbuf2에 저장된다. xor연산이있으므로 첫번째 10글자에 1을 xor한 값을 두번째 인풋으로 넣어주면된다.






'war game > pwnable.kr' 카테고리의 다른 글

pwnable.kr cmd1 1pt  (0) 2016.10.11
pwnable.kr lotto 2pt  (0) 2016.10.11
pwnable.kr blackjack 1pt  (0) 2016.10.11
pwnable.kr coin1 6pt  (0) 2016.10.11
pwnable.kr shellshock 1pt  (0) 2016.10.11

+ Recent posts