2024-11-12 20:05:18

https://dreamhack.io/wargame/challenges/1364

[datestring

Description Time is gold... but shell is diamond. Flag Format: DH{...}

dreamhack.io](https://dreamhack.io/wargame/challenges/1364)

파일을 다운받으면 따로 주어진 소스코드는 없다.

실행시

./datestring
Calendar v0.1
Year: 2024
Month: 1 
Day: 12
Hour: 19
Minute: 46
Second: 19
Formatted date: Fri Jan 12 19:46:19 2024

상단과 같이 나옴.

먼저 gdb에 넣어봤었는데 flag라는 함수가 있다는 걸 찾음.

flag호출 시 쉘을 취득가능한듯함.

flag호출 조건을 ida로 좀 더 편하게 볼 수 있는데 결론적으로

printf("Formatted date: %s", v16);
  if ( monthminusone == 11 && date_1 == 25 && !v15 && valuezero )
  {
    puts("A Present for Admin!");
    flag("A Present for Admin!");
  }

변수명을 조금 바꿔보면 month: 12, date: 25이고, 처리해야되는 부분은 !v15 이면서 valuezero를 0이 아닌 값으로 바꾸기.

 v15 = (year / -100 + year / 4 + 23 * month / 9 + date + 4 + year / 400) % 7;
  calendar(v16, v11);

v15는 이 부분을 처리해줘야함. 저게 0이 되면 된다.
해석하면 12/25가 일요일인 연도를 찾는 문제다

그런데 아무 연도나 입력하면 valuezero값이 안 덮어져서 플래그를 얻을 수 없다.
calendar를 이용해 버퍼오버플로우를 일으켜서 0이 아니도록 덮어버리면 될 일이다.
따라서 특정 연도라기보단 매우 크면서 12/25가 일요일인 연도 찾기를 하면됨
100000000 이상이면 무관하다.

가장 작은 친구로는

Year: 100000005
Month: 12
Day: 25
Hour: 2
Minute: 2
Second: 2
Formatted date: Sun Dec 25 02:02:02 100000005
A Present for Admin!

가 있겠다.
저 문구가 나오면 쉘을 취득했으니 플래그를 cat 하면 끝