힌트로 연산자 우선순위가 주어졌습니다.
홈에는 평소와 다르게 password라는 파일도 있습니다.
소스파일을 살펴보겠습니다.
#include#include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i 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"); }
소스코드 의도대로라면 /home/mistake/password 파일에서 10바이트 받아와 pw_buf 배열에 입력하고,
사용자로부터 입력받은 10바이트를 pw_buf배열에 입력한 후
1과 xor연산을 해 pw_buf와 같으면 /bin/flag를 출력할 수 있도록 쉘을 딸 수 있습니다.
하지만 /home/mistake/password 파일을 권한이 없어서 읽을 수 없으므로 gdb를 이용해 풀으려고 했으나
이 방법으로 풀리지 않았습니다.
hint인 연산자 우선순위를 key word로 코드를 자세히 살펴보면
open함수와 read함수가 있는 곳이 약간 이상하다는것을 확인할 수 있습니다.
먼저 open함수가 있는 라인에서 if문을 보면 = 과 < 이 같이 있는데 이 둘의 우선순위는 <이 높습니다.
우선순위를 따져서 코드를 읽으면 open함수는 양수를 반환하고 양수 < 0 이 되므로 fd에는 false가 입력됩니다.
read함수가 있는 부분도 마찬가지로 우선순위가 의도한바와 다르게 되어있습니다.
근데 전에 fd에는 false가 입력되었고 이 값은 파일디스크립터 0이됩니다.
결국 사용자가 입력한 값을 읽어들입니다.
그럼 미리 xor될 값을 알게되므로 먼저 1111111111 을 입력합니다. 이 값은 pw_buf배열에 들어갈 것 입니다.
두번째로 (어떠한 값) XOR 1 = 1111111111 이란 식이 성립하므로
(어떠한 값) = 1111111111 XOR 1 = 0000000000 이므로 두번째입력에는 0000000000을 입력합니다.
'Wargame > pwnable.kr' 카테고리의 다른 글
pwnable.kr coin1 (0) | 2018.02.19 |
---|---|
[pwnable.kr] shellshock 1p (0) | 2016.08.20 |
[pwnable.kr] uaf 8p (0) | 2016.08.15 |
[pnwable.kr] random 1pt (0) | 2016.07.29 |
[pwnable.kr] passcode 10p (0) | 2016.07.29 |