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 |