문제 :
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 |