
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 |