1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #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; } | cs |
코드를 보면 알겠지만 xor코드는 문자의 아스키코드 값을 홀수면 -1 짝수면 +1 해준다.
mistake를 실행시켜보면 실행이 된다.
그런데 신기한 점은 입력을 두번받는다.
input password : 가 출력되기 전과 후
연산자 우선순위라는 힌트를 보면 첫번째 조건문에서 사용자의 의도대로 흘러가고 있지 않은 것을 알 수 있다.
fd에 값이 대입되고 비교되어야 하지만 <의 우선순위가 =보다 높으므로
fd에는 (양수 < 0) 거짓 즉, 0의 값이 들어가게 된다.
read에서 fd가 0이면 stdin, 표준입출력으로 입력을 받는다.
따라서 우리가 password와 password2를 둘다 입력해주는 것이다.
적당한 알파벳을 찾아서 인접한 것을 같이 넣어주면 된다.
exploit
'정보보안 > pwnable.kr' 카테고리의 다른 글
[pwnable.kr] simple login (0) | 2018.11.15 |
---|---|
[pwnable.kr] shellshock (0) | 2018.11.09 |
[pwnable.kr] leg (0) | 2018.11.08 |
[pwnable.kr] input (0) | 2018.11.08 |
[pwnable.kr] random (0) | 2018.11.08 |