CTF, War game

[Dreamhack] beginner: baby-bof

mnzy๐ŸŒฑ 2024. 8. 3. 21:33

1. ๋ฌธ์ œ 

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

 

baby-bof

Description Simple pwnable 101 challenge Q. What is Return Address? Q. Explain that why BOF is dangerous.

dreamhack.io

 

Q. What is Return Address?

Q. Explain that why BOF is dangerous.

2. ํ’€์ด

๋ฌธ์ œ์— ๋‘๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์ œ์‹œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณผ ๊ฒƒ์ด๋‹ค. 

๋จผ์ € ๋ฌธ์ œ ์‹คํ–‰ํŒŒ์ผ์„ ida๋ฅผ ํ†ตํ•ด ๋””์Šค์–ด์…ˆ๋ธ” ํ•ด๋ณด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋ณด์—ฌ์ง„๋‹ค. 

 

the main function doesn't call win function (0x40125b)!

win ํ•จ์ˆ˜์˜ ์ฃผ์†Œ์™€ main ํ•จ์ˆ˜๊ฐ€ win ํ•จ์ˆ˜๋ฅผ callํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฌธ์ž์—ด์ด ์ถœ๋ ฅ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„, win ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋ผ๊ณ  ํŒ๋‹จํ•˜์˜€๋‹ค. 

 

๋””์ปดํŒŒ์ผํ•ด๋ณด๋ฉด ๋”์šฑ ์ž์„ธํ•œ ์ฝ”๋“œ๊ฐ€ ๋ณด์ด๋Š”๋ฐ, name์œผ๋กœ 15๊ธ€์ž์˜ string์„ scanf๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ๋ฐ›๊ณ  ๋ฐฐ์—ด์˜ ์ฃผ์†Œ์™€ ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค. ๋˜ํ•œ, hex value๊ฐ’๊ณผ integer count๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„ integer count์˜ ๊ฐœ์ˆ˜๋งŒํผ hex value๊ฐ’์œผ๋กœ ๋ฐ”๊พผ๋‹ค. 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  __int64 v3; // rdx
  __int64 v4; // rdx
  _QWORD v6[2]; // [rsp+0h] [rbp-10h] BYREF

  proc_init(argc, argv, envp);
  printf("the main function doesn't call win function (0x%lx)!\n", win);
  printf("name: ");
  __isoc99_scanf("%15s", v6);
  printf("GM GA GE GV %s!!\n: ", (const char *)v6);
  puts("|  addr\t\t|  value\t\t|");
  for ( idx = 0LL; idx <= 15; ++idx )
    printf("|  %lx\t|  %16lx\t|\n", &v6[idx], v6[idx]);
  printf("hex value: ");
  __isoc99_scanf("%lx%c", &value, v3);
  printf("integer count: ");
  __isoc99_scanf("%d%c", &count, v4);
  for ( idx = 0LL; idx < count; ++idx )
    v6[idx] = value;
  puts("|  addr\t\t|  value\t\t|");
  for ( idx = 0LL; idx <= 15; ++idx )
    printf("|  %lx\t|  %16lx\t|\n", &v6[idx], v6[idx]);
  return 0;
}

 

์‹ค์ œ๋กœ ๋ฌธ์ž์—ด์ด ์ถœ๋ ฅ๋˜๋ฉด์„œ name๊ฐ’์„ ์ž…๋ ฅ๋ฐ›๋„๋ก ํ•˜๊ณ , ์ž…๋ ฅ์„ ํ•ด๋ณด๋ฉด ์Šคํƒ์˜ ์ฃผ์†Œ์™€ ๊ฐ’์ด ํฌํ•จ๋˜์–ด์„œ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

asdf๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ์ž…๋ ฅํ•ด์„œ ์–ด๋–ค์‹์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ฉด, ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์ด ์Šคํƒ์˜ ๊ฐ€์žฅ ์ตœ์ƒ๋‹จ์— ์ €์žฅ๋˜๊ณ  ์žˆ์—ˆ๋‹ค. 

 

+)

 

๊ทธ ๋‹ค์Œ ์‹ค์ œ๋กœ 11๊ฐœ์˜ 1111(์ง€์ •ํ•œ hex๊ฐ’)์ด ์Šคํƒ์— ์ €์žฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, count ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ๊ฐ€ ์ „ํ˜€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์–ด์„œ์„œ ๋” ๋งŽ์€ ๋ฒ”์œ„์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ๋‹ค -> bof ๋ฐœ์ƒ ๊ฐ€๋Šฅ 

 

๋”ฐ๋ผ์„œ bof์ทจ์•ฝ์ ์„ ํ†ตํ•ด ์Šคํƒ์˜ ๊ฐ’์„ 0x40125b์œผ๋กœ ๋ฐ”๊ฟ”๋ฒ„๋ฆฌ๋ฉด  win ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด flag ๊ฐ’์ด ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. 

Q. What is Return Address? ์ฆ‰ main ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ ๋ณ€์กฐํ•˜์—ฌ ์›ํ•˜๋Š” ์ž„์˜์˜ ์ฃผ์†Œ๋กœ ์ด๋™ํ•˜๋„๋ก ๋ณ€์กฐํ•œ ๊ฒƒ์ด๋‹ค. 

Q. Explain that why BOF is dangerous. 

์ด๋ ‡๊ฒŒ bof ์ทจ์•ฝ์ ์€ ์ž„์˜์˜ ํ•จ์ˆ˜๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์œ„ํ—˜ํ•œ ์ทจ์•ฝ์ ์ด๋‹ค.