์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

Dreamhack CTF Season 7 Round #6 (๐ŸŒฑDiv2) flag printer write up

REVERSING/Dreamhack

by koharin 2025. 3. 30. 13:42

๋ณธ๋ฌธ

728x90
๋ฐ˜์‘ํ˜•

ํ’€์ด

unsigned __int64 __fastcall sub_1437(char *a1)
{
  int v2; // eax
  unsigned int v4; // [rsp+18h] [rbp-38h]
  int i; // [rsp+1Ch] [rbp-34h]
  const char *s1; // [rsp+20h] [rbp-30h]
  char *v7; // [rsp+28h] [rbp-28h]
  char s2[5]; // [rsp+33h] [rbp-1Dh] BYREF
  unsigned __int64 v9; // [rsp+38h] [rbp-18h]

  v9 = __readfsqword(0x28u);
  v4 = 0;
  a1[strcspn(a1, "\n")] = 0;
  s1 = strtok(a1, " ");
  while ( s1 )
  {
    if ( !strcmp(s1, "print") )
      return (unsigned __int64)v4 << 32;
    if ( !strcmp(s1, "id") )
      return ((unsigned __int64)v4 << 32) | 1;
    if ( !strcmp(s1, "help") )
      return ((unsigned __int64)v4 << 32) | 2;
    v7 = strdup(s1);
    for ( i = 0; v7[i]; ++i )
    {
      v2 = i;
      v7[v2] ^= 0x42u;
    }
    strcpy(s2, "&-17");
    if ( strcmp(v7, s2) )
    {
      free(v7);
      return ((unsigned __int64)v4 << 32) | 0xFFFFFFFF;
    }
    v4 = 1;
    s1 = strtok(0LL, " ");
    free(v7);
  }
  return ((unsigned __int64)v4 << 32) | 0xFFFFFFFF;
}


- sub_1437 ํ•จ์ˆ˜์—์„œ s์—์„œ strtok ํ•จ์ˆ˜๋กœ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•จ. 
- print, id, help๊ฐ€ ์•„๋‹ ๋•Œ, ์ž…๋ ฅ ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž^0x42 ๊ฒฐ๊ณผ๊ฐ€ "&-17"๊ณผ ๋™์ผํ•œ ๊ฒฝ์šฐ v4=1๋กœ ์„ค์ •๋จ.

void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
  __int64 v3; // rax
  char s[72]; // [rsp+10h] [rbp-50h] BYREF
  unsigned __int64 v5; // [rsp+58h] [rbp-8h]

  v5 = __readfsqword(0x28u);
  sub_13A9(a1, a2, a3);
  sub_140E();
  while ( 1 )
  {
    while ( 1 )
    {
      printf("> ");
      fgets(s, 64, stdin);
      v3 = sub_1437(s);
      if ( (_DWORD)v3 != 2 )
        break;
      sub_1749();
    }
    if ( (int)v3 > 2 )
    {
LABEL_10:
      puts("Invalid Command!");
    }
    else if ( (_DWORD)v3 )
    {
      if ( (_DWORD)v3 != 1 )
        goto LABEL_10;
      sub_1711(HIDWORD(v3));
    }
    else
    {
      sub_1673(HIDWORD(v3));
    }
  }
}


- ์ดํ›„ main ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด 2์ธ ๊ฒฝ์šฐ์—” ์ถœ๋ ฅ์„, 2 ์ด์ƒ์ธ ๊ฒฝ์šฐ Invalid Command๋ฅผ, 1์ธ ๊ฒฝ์šฐ id๋ฅผ ์ถœ๋ ฅํ•จ. ์ด์™ธ์˜ ๊ฒฝ์šฐ์—”, ์˜ˆ๋ฅผ ๋“ค๋ฉด 0์ธ ๊ฒฝ์šฐ์—” sub_1673 ํ•จ์ˆ˜๋กœ ๋ถ„๊ธฐํ•จ

int __fastcall sub_1673(int a1)
{
  const char *v1; // rax
  char i; // al
  FILE *stream; // [rsp+48h] [rbp-8h]

  if ( a1 )
    v1 = "./flag";
  else
    v1 = "./art";
  stream = fopen(v1, "r");
  for ( i = getc(stream); i != -1; i = getc(stream) )
    putchar(i);
  fclose(stream);
  return putchar(10);
}

- ์ด๋•Œ ์ฐธ์ด๋ฉด flag๋ฅผ, ์•„๋‹ˆ๋ฉด art๋ฅผ ์ถœ๋ ฅํ•จ. ๋”ฐ๋ผ์„œ ํ”Œ๋ž˜๊ทธ ํ•จ์ˆ˜๋กœ ์ง„์ž…ํ–ˆ๋‹ค ํ•ด๋„ 0์ด๋ฉด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ๋ชปํ•จ(์ž…๋ ฅ ์ฒ˜๋ฆฌ์—์„œ ๊ทธ๋ƒฅ v4=0์ธ ์ƒํƒœ์—์„œ print๋ฅผ ์ฃผ๋Š” ๊ฒฝ์šฐ)
- ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด v7^0x42๋ฅผ ๊ตฌํ•ด์„œ v4=1(0x0000000000000001)๋กœ ๋งŒ๋“ค๊ณ , ์ดํ›„ print๋กœ ์ธํ•ด 1<<32๋ฅผ ํ•˜๋ฉด 
0x0000000100000000์ด ๋˜์–ด ํ”Œ๋ž˜๊ทธ ํ•จ์ˆ˜๋กœ์˜ ๋ถ„๊ธฐ ์กฐ๊ฑด๊ณผ(ํ•˜์œ„๊ฐ€ 0์ด๋ฏ€๋กœ) ํ”Œ๋ž˜๊ทธ ์ถœ๋ ฅ ์กฐ๊ฑด(์ƒ์œ„ 4๋ฐ”์ดํŠธ๊ฐ€ 1์ž„)์„ ๋งŒ์กฑํ•˜์—ฌ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ถœ๋ ฅ๋จ


์ต์Šคํ”Œ๋กœ์ž‡ ์ฝ”๋“œ

from pwn import *

context.log_level='debug'
p = remote('host3.dreamhack.games',21849)

target="&-17"
v7=''.join(chr(ord(c) ^ 0x42) for c in target)
print(f'v7: {v7}')
p.sendlineafter(b'>', v7+" "+"print")

p.interactive()
728x90


๊ฒฐ๊ณผ

728x90
๋ฐ˜์‘ํ˜•

'REVERSING > Dreamhack' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Dreamhack] rev-basic-2  (0) 2021.03.15
[Dreamhack] rev-basic-1  (0) 2021.03.15
[Dreamhack] rev-basic-0  (0) 2021.03.15

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ