#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; }Introduction:
본 문제 에서는 프로그램이 password파일을 읽어 pw_buf에 대입하고, 사용자로 부터 pw_buf2의 값을 입력 받아 비밀번호를 검증하는 문제처럼 보인다. 코드를 보면 password의 값과 XORKEY문자가 xor연산된 결과값을 알아내 입력해야 되는 것 처럼 보이나 실제로 프로그램을 실행해 보면 pw_buf에 들어가는 값은 password문서의 내용이 아니라 사용자로 부터 입력된 값이다.
How to solve:
프로그램에서는 사용자로부터 입력받은 10글자를 xor함수로 보내어 XORKEY와 xor연산을 수행한다. 즉, 프로그램을 실행해 첫 번째 표준입력에 XORKEY0000을 입력하면 이 값은 pw_buf에 저장된다. 이 때 두 번째 표준입력에는 YNSJDX1111를 입력하게 되면 xor함수를 통해 XORKEY ^ YNSJDX1111을 수행한 결과값, "XORKEY0000이 pw_buf2에 저장되고, 이 값은 첫 번째 표준입력을 통해 pw_buf에 저장된 값과 일치하므로 프로그램은 flag의 내용을 출력해준다.
Command line:
mistake@ubuntu:~$ ./mistake
do not bruteforce...
XORKEY0000
input password : YNSJDX1111
Password OK
Mommy, ~!@#$%^&*()_+~!@#$%^&*()_+~!@#$%^&*()_+
Appendix:
'Pwnable.kr' 카테고리의 다른 글
[4pt]input (0) | 2015.08.15 |
---|---|
[3pt]collision (0) | 2015.08.07 |
[1pt]cmd1 (0) | 2015.08.06 |
[1pt]fd (0) | 2015.08.06 |
[5pt]bof (0) | 2015.08.06 |