Post

[Dreamhack] Hope Delivery v2.0ย ๐Ÿ’Œ

[Dreamhack] Hope Delivery v2.0ย ๐Ÿ’Œ

[Dreamhack] Hope Delivery v2.0ย ๐Ÿ’Œ

alt text

alt text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
if ( access("/tmp/hope_list", 0) == -1 )
  {
    puts("Error occured! Please call service administrator.");
    exit(-1);
  }
  stream = fopen("/tmp/hope_list/name.txt", "r");
  if ( !stream )
  {
    puts("name.txt does not exist.");
    puts("creating..");
    sleep(1u);
    stream = fopen("/tmp/hope_list/name.txt", "w");
    fclose(stream);
    puts("process complete!\n\n");
  }
  while ( 1 )
  {
    rb = fgetc(stream);
    if ( rb == -1 )
      break;
    if ( rb == 10 )
      ++line_cnt;
  }
  fclose(stream);
  puts("Load old essays...");
  stream = fopen("/tmp/hope_list/name.txt", "r");
  for ( i = 0; i < line_cnt; ++i )
  {
    memset(buf, 0, 0x21uLL);
    fgets(buf, 0x22, stream);
    buf[strcspn(buf, "\n")] = 0;
    sprintf(filename, "/tmp/hope_list/%s", buf);
    fd_lst = (__int64)fopen(filename, "r");
    if ( !fd_lst )
    {
      fclose(stream);
      puts("???????");
      remove_file("/tmp/hope_list", 1u);
      exit(-1);
    }
    v0 = mem_cnt;
    encryp_name[v0] = malloc(0x21uLL);
    v1 = mem_cnt++;
    strcpy((char *)encryp_name[v1], buf);
  }
  sleep(1u);
  return puts("Done!\n");

์‹คํ–‰ ๋  ๋•Œ init ํ•จ์ˆ˜์•ˆ์— dir ์ฒดํฌ๊ฐ€ ์ง„ํ–‰๋˜์–ด ๊ธฐ์กด์˜ essay๋“ค์ด ์ €์žฅ๋œ ๊ฒฝ๋กœ๋“ค์˜ ๋‚ด์šฉ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

give_hope๋ฅผ ์„ ํƒํ•˜๋ฉด ๋ฐ›๋Š” ์‚ฌ๋žŒ๊ณผ essay๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
memset(receiver, 0, 0x80uLL);
  if ( mem_cnt > 29 )
  {
    puts("Memories are full!");
    exit(0);
  }
  puts("\nQ1. Who receives this HOPE? (max length - 128bytes)");
  printf("Your Input: ");
  __isoc99_scanf(" %128s", receiver);
  encrypte_recev(receiver, encrypted);
  sprintf(path, "/tmp/hope_list/%s", encrypted);
  stream = fopen(path, "r");
  if ( stream )
  {
    puts("\nYou already sent essay to this person.");
    puts("Would you like to send new one?");
    puts("If yes, you lose recent log.");
    printf("Your Input[Y/N]: ");
    __isoc99_scanf(" %c", &yn);
    if ( yn != 'Y' && yn != 'y' )
    {
      if ( yn == 'N' || yn == 'n' )
        puts("Okay, back to menu.\n\n");
      else
        puts("Invalid choice!\n\n");
      return;
    }
    chk = 1;
  }
  puts("\nQ2. What type do you want to send?");
  puts("1. Essay Writing");
  puts("2. Dots ASCII ART (under construction..)");
  printf("Your Input: ");
  __isoc99_scanf("%1d", &chose);
  if ( chose == 1 )
  {
    if ( !chk )
    {
      recv_len = strlen(receiver);
      idx = mem_cnt;
      recev_arr[idx] = (char *)malloc(recv_len + 1);
      v2 = strlen(receiver);
      snprintf(recev_arr[mem_cnt], v2 + 1, receiver);// format ์—†์Œ
      stream = fopen("/tmp/hope_list/name.txt", "a");
      fputs(encrypted, stream);
      fputc(10, stream);
      fclose(stream);
      v3 = mem_cnt;
      encryp_name[v3] = malloc(0x21uLL);
      v4 = mem_cnt++;
      strcpy((char *)encryp_name[v4], encrypted);
    }
    stream = fopen(path, "w");
    puts("\n\nWrite your essay here. (type \"end\" to save)");
    getchar();
    while ( 1 )
    {
      fgets(buf, 256, stdin);
      if ( !strcmp(buf, "end\n") )
        break;
      fputs(buf, stream);
    }
    fclose(stream);
    puts("\nSend complete and your essay is saved in our pocket.");
    puts("You can check with show menu.\n\n");
  }

๋ณด๋‚ด๋Š” ์‚ฌ๋žŒ ์ด๋ฆ„์„ recve_arr์— ์ €์žฅ์„ ํ•œ ํ›„ md5๋กœ ํ•ด์‰ฌ๊ฐ’์„ ์–ป๋Š”๋‹ค. ์ด ํ•ด์‰ฌ๊ฐ’์„ name.txt์— ์ €์žฅ ํ›„ ๊ฒฝ๋กœ๋กœ ๋งŒ๋“ค์–ด ์—์„ธ์ด๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ €์žฅํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if ( mem_cnt )
  {
    printf("\n[!] To protect your privacy, receiver name will be obscured.");
    for ( i = 0; i < mem_cnt; ++i )
    {
      printf("\n[ESSAY No.%d]\n", (unsigned int)i);
      memset(buf, 0, 0x64uLL);
      sprintf((char *)buf, "/tmp/hope_list/%s", (const char *)encryp_name[i]);
      stream = fopen((const char *)buf, "r");
      if ( !stream )
      {
        puts("DO NOT HACK!");
        puts("All of logs are automatically deleted soon..");
        sleep(1u);
        delet_file();
        exit(0);
      }
      while ( fgets(data, 256, stream) )
        printf("%s", data);
      fclose(stream);
      putchar(10);
    }
    puts("\n[END]\n");
  }

show_essay๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ €์žฅ๋œ essay ๋งŒํผ ์•”ํ˜ธํ™”๋œ ํ•ด์‰ฌ ๊ฐ’ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์ฝ์–ด ์˜จ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  if ( mem_cnt )
  {
    if ( delete_once )
    {
      puts("\nYou can delete logs only once.\n\n");
    }
    else
    {
      puts("\nDelete old files...");
      sleep(1u);
      for ( i = 0; i < mem_cnt; ++i )
      {
        if ( recev_arr[i] )
          printf("[!] Delete (to %s)\n", recev_arr[i]);
      }
      sleep(1u);
      remove_file("/tmp/hope_list", 1u);        // rm -rf?
      puts("Creating name.txt ..");
      sleep(1u);
      stream = fopen("/tmp/hope_list/name.txt", "w");
      fclose(stream);
      puts("Complete.\n\n");
      mem_cnt = 0;
      ++delete_once;
    }
  }
  else
  {
    puts("\nhope_list is empty.\n\n");
  }
}

delete๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์‹คํ–‰ํ•˜์—ฌ ์ž‘์„ฑํ•œ recev_arr๋ฅผ ์ฝ์–ด ์˜จ๋‹ค. ๊ทธ๋ฆฌ๊ณ  hope_list ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์˜ ํŒŒ์ผ ์‚ญ์ œ ํ›„ ๋‹ค์‹œ ์„ธํŒ…์„ ํ•œ๋‹ค.

1
 snprintf(recev_arr[mem_cnt], v2 + 1, receiver);// format ์—†์Œ

๋จผ์ € snprintf์˜ ์ธ์ž ์ค‘ format ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— fsb๋กœ libc, codebase, canary leak์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

stack ์ค‘ stack ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š” ์ฃผ์†Œ๊ฐ€ ์žˆ์–ด์„œ double fsb๋ฅผ ์ด์šฉํ•˜์—ฌ ์Šคํƒ์— libc ๊ฐ’์„ ๋งŒ๋“ค์–ด ์ค€ํ›„ fsb๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด leak์„ ํ•œ๋‹ค.

๋‹ค๋ฅธ์‚ฌ๋žŒ๋“ค์€ hook ์„ ๋ฐ”๊พผ๋ถ„๋“ค๋„ ์žˆ์ง€๋งŒ ๋‚˜๋Š” libc_got๋ฅผ ๋ฐ”๊พธ์—ˆ๋‹ค,,

This post is licensed under CC BY 4.0 by the author.