[Dreamhack] Recover

chrmqgozj·2025년 1월 24일

DreamHack

목록 보기
14/39

워게임, 특히 리버싱 하면서 스트레스를 너무 많이 받아서... 계속 미루고 미루다가 영원히 피할 수는 없으니까 쉬운 거라도 차근차근해보려고 한다.
원래 백준 5문제씩 풀었는데 격일로 알고리즘 공부 하루, 해킹 공부 하루 이렇게 하려고 한다.

  1. main
__int64 __fastcall main(int a1, char **a2, char **a3)
{
  char ptr; // [rsp+Bh] [rbp-25h] BYREF
  int v5; // [rsp+Ch] [rbp-24h]
  _BYTE *v6; // [rsp+10h] [rbp-20h]
  FILE *stream; // [rsp+18h] [rbp-18h]
  FILE *s; // [rsp+20h] [rbp-10h]
  unsigned __int64 v9; // [rsp+28h] [rbp-8h]

  v9 = __readfsqword(0x28u);
  v6 = &unk_2004;
  stream = fopen("flag.png", "rb");
  if ( !stream )
  {
    puts("fopen() error");
    exit(1);
  }
  s = fopen("encrypted", "wb");
  if ( !s )
  {
    puts("fopen() error");
    fclose(stream);
    exit(1);
  }
  v5 = 0;
  while ( fread(&ptr, 1uLL, 1uLL, stream) == 1 )
  {
    ptr ^= v6[v5 % 4];
    ptr += 19;
    fwrite(&ptr, 1uLL, 1uLL, s);
    ++v5;
  }
  fclose(stream);
  fclose(s);
  return 0LL;
}

flag.png를 열고 1바이트씩 읽어온다. 연산을 거친 후에 encrypted에 작성한다.
flag.png를 복구하는 것이 목표다.

  1. 암호화 과정
arr = [0xDE, 0xAD, 0xBE, 0xEF]

for i in range(len(flag)):
	s[i] = flag[i] ^ arr[i%4] + 19
  1. 복호화 과정
arr = [0xDE, 0xAD, 0xBE, 0xEF]

for i in range(len(flag)):
	flag[i] = (s[i] - 19) ^ arr[i%4]
  1. exploit.py
arr = [0xDE, 0xAD, 0xBE, 0xEF]

flag = open('D:\\code\\dh\\rev\\recover\\flag.png', 'wb')
encrypt = open('D:\\code\\dh\\rev\\recover\\encrypted', 'rb')

data = encrypt.read()

for i in range(len(data)):
    b = ((data[i]-19) ^ arr[i%4]) & 0xff
    flag.write(b.to_bytes(1, byteorder='little'))

-> DH{9a89d702b9}

0개의 댓글