pwnable.kr - mistake
2018. 8. 20. 08:37ㆍWarGame/pwnable.kr
pwnable.kr mistake문제입니다.
먼저 소스코드부터 확인해보겠습니다.
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 51 | #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 |
문제의 이름이 mistake인만큼 어디에선가 실수가 일어났을것입니다.
이 문제의 핵심은 산술연산입이다. "="이 가장 우선순위가 낮다는 점을 이용하면
1.if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0){ 이부분과
2. if(!(len=read(fd,pw_buf,PW_LEN) > 0)){ 이부분은 그냥 생략하고 지나가게됩니다 따라서.
모든 보호기법? 을 제치고 생각해도됩니다.
password1을 아무거나 넣어주고 그것에 xor 1을 한 값을 password2에 넣어주면 됩니다.
11111111
00000000
다음과 같이 말이죠.
'WarGame > pwnable.kr' 카테고리의 다른 글
pwnable.kr - shellshock (0) | 2018.08.23 |
---|---|
pwnable.kr - leg (0) | 2018.08.22 |
pwnable.kr blukat (0) | 2018.08.19 |
pwnable.kr - coin1 (0) | 2018.08.19 |
pwnable.kr - bof (0) | 2018.08.19 |