http://reversing.kr/challenge.php
< IDA 사용 >
ELF 파일은 간단하게 리눅스의 실행파일이라고 할 수 있다.
따라서 해당 파일을 리눅스에서 실행시킨 후, 랜덤 문자를 넣어보았다.
아무 문자나 넣었더니 Wrong이 출력되는 것을 볼 수 있다.
리눅스에서 실행시켜서 어셈블리어를 확인하려 했는데, 너무 가독성이 떨어져서 exe 파일로 설정해서 IDA로 실행시켰다.
사실 다른 디버거로 실행시키고 싶었는데 다른 디버거로는 열리지가 않는다.
IDA에서 Strings 검색을 통해 힌트가 될 만한 문자열이 있는지 확인해보았더니,
리눅스에서 실행시켰을 때 나왔던 문구인 Reversing.Kr Easy ELF와 wrong, correct를 볼 수 있다.
"Reversing.Kr Easy ELF"를 더블 클릭해서 들어가면 아래와 같은 화면을 볼 수 있고, 이때 문자열 aReversingKrEas를 클릭한 상태로 X를 눌러서 메인 함수로 이동해 보았다.
메인 함수는 위의 사진과 같고, 매우 간단하다.
cmp를 통해 eax가 1이 아니면 wrong으로 점프하는 것을 알 수 있다.
그렇다면 점프하지 않고, 왼쪽으로 가야 하는데(eax=1), 왼쪽 노드에서 80484F7이라는 함수를 호출하고 있다. 해당 함수로 들어가 보았다.
<메인 함수 1번 노드>
첫 번째 노드 중간을 보면 _write / 8048434 / 8048451이라는 함수들을 호출하고 있다.
첫번째 _write는 길이도 짧고 별다른 중요한 내용이 없어서 8048434를 확인해보니 정답을 입력받는 함수인 것을 알 수 있다.
그럼 이제 그다음 함수인 8048451이라는 함수에서 정답과 입력값을 비교할 것이라는 것을 예측할 수 있고,
eax에 1이 담긴 상태로 빠져나와야 한다는 것을 알 수 있다.
해당 함수로 들어가보았다.
위의 그림에서 eax가 1이 되기 위해서는, 모든 분기문에서 점프를 취한 후, 오른쪽 사선 방향으로 진행해야 함을 알 수 있다.
각 노드들을 보면 어떠한 주소 값에서 1byte를 가져와서 eax에 저장하고 연산을 취하는 방식으로 동작하는데, 여기에서 제일 첫 번째 주소인 804A020부터 input이 저장됨을 예측할 수 있었다.
첫번째 노드부터 보면, 21(804A021)에 있는 한 글자를 eax에 저장한 후, eax와 0x31(1)을 비교하고 있다. 이전에 20부터 input이 저장된다고 했으므로,
2번째 글자가 1이 됨을 알 수 있다.
두 번째 노드(맨 위에서 두 번째)에서는
20을 eax에 저장, eax와 0x34 xor연산, 그 결과를 다시 20에 저장하는 방식으로 진행한다.
따라서 정리해보면
20 = 첫 번째 글자 ^ 0x34
22 = 세 번째 글자 ^ 0x32
23 = 네 번째 글자 ^ 0xFFFFFF88
24 = 다섯 번째 글자와 0x58(X) 비교 가 된다.
현재까지 정해진 것은 두 번째 글자는 1, 다섯 번째 글자는 X라는 것이다.
이어서 진행해가면, 아래에서
22과 0X7C 비교
20과 0X78 비교
23과 0XDD 비교
를 하고 있고, 모두 같아야 다음 노드로 진행한다.
다시 정리해보면
첫 번째 글자 ^ 0x34 = 0X78
세 번째 글자 ^ 0x32 = 0X7C
네 번째 글자 ^ 0xFFFFFF88 = 0XDD
가 되어야 하고, 이미 첫 번째와 다섯번째 글자는 알고 있으니, 각각의 글자들이 무엇인지만 확인했다.
첫번째 글자는 L, 세 번째 글자는 N, 네 번째 글자는 U 이므로, 모두 합쳐보면
L1NUX라는 FLAG를 얻을 수 있다.
'Reversing > Reversing.kr' 카테고리의 다른 글
[Reversing.Kr] Auto Hot Key1 풀이 (0) | 2021.07.31 |
---|---|
[Reversing.Kr] C SHOP 풀이 (0) | 2021.07.31 |
[Reversing.Kr] Easy Unpack 풀이 (0) | 2021.07.31 |
[Reversing.Kr] ransomware 풀이 (0) | 2021.07.26 |
[Reversing.Kr] Easy Crack 풀이 (0) | 2021.07.26 |