[Dreamhack] Hope Delivery v2.0ย ๐
[Dreamhack] Hope Delivery v2.0ย ๐
[Dreamhack] Hope Delivery v2.0ย ๐
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๋ฅผ ๋ฐ๊พธ์๋ค,,

