본문 바로가기

Hacking/DreamHack

r-xor-t

리버싱 문제

코드 분석

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int k; // [rsp+4h] [rbp-Ch]
  int j; // [rsp+8h] [rbp-8h]
  int i; // [rsp+Ch] [rbp-4h]

  puts("Input: ");
  __isoc99_scanf("%s", input);
  if ( strlen(input) == 64 )
  {
    for ( i = 0; i <= 63; ++i )
      rot[i] = (input[i] + 13) & 0x7F;
    result[0] = byte_40DF;
    for ( j = 1; j <= 62; ++j )
      result[j] = rot[63 - j];
    byte_413F = rot[0];
    for ( k = 0; k <= 64; ++k )
      result2[k] = result[k] ^ 3;
  }
  if ( !strncmp(result2, "C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q", 0x40uLL) )
  {
    puts("\nNice!");
    printf("Flag is DH{%s}\n", input);
  }
  return 0;
}

 - input 64자

 - rot[i] 값은 input에 13 씩 더해주면 (시저 암호화) 127을 넘을 수 없다.

 - rot[i] 를 뒤집어 result[i]를 만들고

 - result[i] 를 ^ 3 하여, result2[i] 를 만든다

 

Solver

#!/usr/bin/env python3
# solv.py

cmp_str = 'C@qpl==Bppl@<=pG<>@l>@Blsp<@l@AArqmGr=B@A>q@@B=GEsmC@ArBmAGlA=@q'


# xor 3
list = list()
for char in cmp_str:
    char = ord(char) ^ 3
    list.append(chr(char))

# xor 두번 해주어, result[i]로 만든다.

xor = ''.join(str(s) for s in list)
print(xor)
print('\n')

# 문자열 역순으로 나열
result = xor[::-1]

# 역순으로 나열하여, rot[i]를 만든다.

print(result)
print('\n')

# rot 역연산
list.clear()
for ch in result:
    ch = ((ord(ch) - 13) % 127)
    list.append(chr(ch))
    
# 13 마이너스 해주고 %127로 &127을 보정해준다.

input_val = ''.join(str(s) for s in list)

print('Correct input value is: ', input_val)

 

Solver는 해답으로 이해했지만, 

사실 이해 안되는 것은

result[0] 과 rot[0]의 존재

 

대강 해당 값들이 result[0], result[63]의 고정 값이고,

고정 값은 xor과 역연산에 영향을 받지 않는다는 것을 알아라~! 인것으로 보인다.

 

'Hacking > DreamHack' 카테고리의 다른 글

Period (pwnable)  (0) 2025.04.02
Movie time table (WEB)  (0) 2025.04.01
[CodeEngn] Malware L08  (1) 2024.09.04
Dream Gallery  (0) 2024.09.04
Additional calculator  (0) 2024.09.04