pwnable.kr mistake write up
2017. 7. 4. 22:37
pwnable.kr mistake write up
H3X0R팀 소속 BoB 6기 ch4n3
#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; }
위 소스는 pwnable.kr의 mistake 문제의 소스이다. 악악! 시험기간인데 pwnable.kr을 풀고있다.
일단 이 문제의 힌트는 operator priority 이다. 연산자 우선순위.
나는 디미고에서 프로그래밍 수행평가를 보면서 대충은 외워놓은 상태였지만, 이 문제에서는 꽤 논리적인 혼란이 왔다.
일단, 결과적으로 말하자면
if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0)
이 부분에서 취약점이 발생한다. > (비교 연산자)가 = (대입 연산자) 보다 우선순위가 높기 때문이다.
/home/mistake/password 파일이 있으니까 open() 함수에서는 양수를 반환한다. (open() 함수의 반환값은 http://pubs.opengroup.org/onlinepubs/009695399/functions/open.html 여기서 확인했다.) 그리고 '양수 < 0' 를 비교하는데 중학교 과정만 이수했다면 이 조건은 false라는 것을 알 것이다. 그리고 fd 에는 0 이라는 value가 들어가게 된다.
pwnable.kr toddler에서 fd 문제에서 풀었듯이, 0은 표준 입력이다. 그래서 우린 read(fd,pw_buf,PW_LEN) 이 부분에서 pw_buf 에 값을 입력할 수 있게 되었다. wow~
따라서 우리는 pw_buf와 pw_buf2 변수 모두 조작할 수 있기 때문에 프로그램의 흐름을 잡을 수 있다.
xor() 함수는 직접 구현해보았다.
그리고 다시 mistake 프로그램을 실행시켜서 얻은 값을 대입해본다~
플래그를 얻었다. 내일 시험인데 기분이 좋다.
'write-ups > pwnable.kr' 카테고리의 다른 글
pwnable.kr blackjack write up (0) | 2017.07.05 |
---|---|
pwnable.kr cmd1 write up (0) | 2017.07.05 |
pwnable.kr random write up (0) | 2017.07.04 |
pwnable.kr passcode write up (0) | 2017.07.04 |
pwnable.kr flag write up (0) | 2017.07.04 |