2018. 1. 15. 10:18, 워게임/Pwnable.kr
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 | /* mistake.c */ 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 |
코드를 대충 읽으면 /home/mistake/password와 입력한 값을 비교하는 것으로 생각할 수 있지만 연산자 우선순위 때문에 의도한대로 동작하지 않습니다. 5번 줄 fd=open("/home/mistake/password",O_RDONLY,0400) < 0 에서 부등호가 등호보다 우선순위가 높으므로 fd에는 0이 저장됩니다. 0은 표준 입력이므로 의도한대로 /home/mistake/password를 읽어오는게 아니라 표준 입력을 읽어서 pw_buf에 저장합니다. 그러므로 ASCII CODE 상에서 최하위비트가 다른 아무 문자열이나 대입하면 password를 얻을 수 있습니다.(000000000 / 11111111 or BBBBBBBBB / CCCCCCCCC ...)
|
'워게임 > Pwnable.kr' 카테고리의 다른 글
[Pwnable.kr] blackjack (0) | 2018.01.15 |
---|---|
[Pwnable.kr] coin1 (3) | 2018.01.15 |
[Pwnable.kr] shellshock (0) | 2018.01.15 |
[Pwnable.kr] leg (0) | 2018.01.15 |
[Pwnable.kr] input (0) | 2018.01.15 |
[Pwnable.kr] random (0) | 2018.01.15 |
Comments