반응형
<문제의 코드>
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 | #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 |
풀이를 시작해봅시다.
hint가 연산자 우선순위라고 되어있습니다.
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){
printf("can't open password %d\n", fd);
return 0;
}
이 부분을 자세히 봅시다.
if문은 open의 반환 값을 fd에 넣고 그것을 0과 비교를 하는 것인데, 벌써 잘못되었죠? 원래대로라면 if((fd=open@@@@@@@, 400)) < 0 ){} 이 되어야 합니다.
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;
}
이 부분에서도 fd의 값은 반환된 값 0으로 들어가게 되면서 표준 입력을 하게 됩니다.
때문에 이 코드는 원래의 목적( password를 읽어와 pw_buf에 저장) 이 아니라, 저희가 pw_buf 변수에 값을 넣을 수 있도록 되었습니다.
때문에, pw_buf, pw_buf2 모두 우리의 것입니다.
xor 함수를 보면 pw_buf2의 각 인덱스의 xor 1 을 해주고 있습니다.
그럼 정답은 아주 쉽게 나오겠죠 ?
반응형
'[ ★ ]Study > War Game' 카테고리의 다른 글
[Toddler's Bottle] pwnable.kr blackjack 풀이 (0) | 2017.09.15 |
---|---|
[Toddler's Bottle] pwnable.kr shellshock 풀이 (0) | 2017.09.15 |
[Toddler's Bottle] pwnable.kr leg 풀이 (0) | 2017.09.15 |
[Toddler's Bottle] pwnable.kr input 풀이 (0) | 2017.09.13 |
[Toddler's Bottle] pwnable.kr random 풀이 (0) | 2017.08.17 |
댓글