Correct를 출력하면 되는 문제로 보인다.
 

1. Analysis

일단 ELF파일이니 gdb로 확인하는 문제가 아닐까?

근데 symbol이 없단다. 힘들것같다. 괜히 심볼없는 gdb로 고통받을 바엔 걍 ida라는 현대문물을 쓰자.

int __cdecl main()
{
  write(1, "Reversing.Kr Easy ELF\n\n", 0x17u);
  sub_8048434();
  if ( sub_8048451() )
    sub_80484F7();
  else
    write(1, "Wrong\n", 6u);
  return 0;
}

디컴파일 코드인데 sub_8048451()함수를 통해 뭔가 Wrong이 아닌쪽으로 출력을 한다. 그렇다면 그 함수를 들어가보면 된다.
 

_BOOL4 sub_8048451()
{
  if ( byte_804A021 != 49 )
    return 0;
  byte_804A020 ^= 0x34u;
  byte_804A022 ^= 0x32u;
  byte_804A023 ^= 0x88u;
  if ( byte_804A024 != 88 )
    return 0;
  if ( byte_804A025 )
    return 0;
  if ( byte_804A022 != 124 )
    return 0;
  if ( byte_804A020 == 120 )
    return byte_804A023 == -35;
  return 0;
}

byte_804A020이 정확히 뭔지는 모르겠지만 아마 입력값의 시작점이라고 생각한다. 그리고 그냥 간단한 xor연산을 반복한다. 뭔가 조건문이 복잡할 때는 그냥 그래프로 보는게 훨씬 더 편하다.
 

overview로 보면 이런데 대충 저 조건을 전부 통과해야 Correct로 갈 수 있다는 것이다.
 

왜 오히려 어셈블리어가 더 편한지는 모르겠지만, 위에서부터 보면
 
[804A021] = 0x31
[804A020] ^ 0x34
[804A022] ^ 0x32
[804A023] ^ 0x88
[804A024] = 0x58
[804A025] = 0
 

[804A022] = 0x7C
[804A020] = 0x78
[804A023] = 0xDD
 

2. Solve

바이트 다 뽑아냈으니 순서에 맞춰서 코드를 작성해보자.

key = ''

key += chr(0x78 ^ 0x34)
key += chr(0x31)
key += chr(0x7C ^ 0x32)
key += chr(0xDD ^ 0x88)
key += chr(0x58)
key += '\0'

print(key)

생각보다 너무 쉬워서 어이가 없네

'Security > Reversing' 카테고리의 다른 글

[Reversing.kr] ImagePrc  (0) 2022.08.31
[Reversing.kr] Music Player  (0) 2022.08.31
[Reversing.kr] Easy Keygen  (0) 2022.08.24
[Reversing.kr] Easy Crack  (0) 2022.08.17
Dreamhack secret message  (0) 2022.08.17

+ Recent posts