v6 = __readfsqword(0x28u); s = malloc(0x20uLL); v4 = malloc(0x40uLL); memset(s, 0, 0x20uLL); memset(v4, 0, 0x40uLL); do { printf("[+] Enter the index of this appointment (0-7): "); fflush(stdout); __isoc99_scanf("%d", &idx); // oob getchar(); } while ( idx > 7 ); addr = (&appointments + 16 * idx); printf("[+] Enter a date and time (YYYY-MM-DD HH:MM:SS): "); fflush(stdout); fgets(s, 30, stdin); value = date_to_timestamp(s); *addr = value; // 원하는 주소에 원하는 값 쓰기 가능 printf("[+] Converted to UNIX timestamp using local timezone: %ld\n", *addr); printf("[+] Enter an associated message (place, people, notes...): "); fflush(stdout); fgets(v4, 62, stdin); addr[1] = v4; free(s); return v6 - __readfsqword(0x28u); }
idx가 int 자료형을 가지고 있기 때문에 oob가 발생한다. 이 인덱스를 가지고 addr 변수 위로 접근할 수 있다. 위에는 got들이 자리잡고 있는데 원하는 곳에 접근해서 원하는 값을 쓸 수 있다. system("/bin/sh")를 호출하는 함수를 정의해놨기 때문에 이 함수 주소를 쓰면 될 듯 하다.
이때 주의해야할 점이 쓰고 싶은 주소 값을 YYYY-MM-DD HH:MM:SS 형식으로 만들어서 입력해야 date_to_timestamp 함수를 거쳐 정상적인 주소 값을 쓸 수 있게 된다. 그래서 ida에서 date_to_timestamp 함수 구현을 보고 c로 재작성하였다.