본문 바로가기

Reversing/Reversing.kr

[Reversing.Kr] Easy ELF 풀이

http://reversing.kr/challenge.php

 

Reversing.Kr

Copyright © 2012-2021 Gogil All Right Reserved.

reversing.kr


< IDA 사용 >

 

ELF 파일은 간단하게 리눅스의 실행파일이라고 할 수 있다.

따라서 해당 파일을 리눅스에서 실행시킨 후, 랜덤 문자를 넣어보았다.

아무 문자나 넣었더니 Wrong이 출력되는 것을 볼 수 있다.

 

리눅스에서 실행시켜서 어셈블리어를 확인하려 했는데, 너무 가독성이 떨어져서 exe 파일로 설정해서 IDA로 실행시켰다.

사실 다른 디버거로 실행시키고 싶었는데 다른 디버거로는 열리지가 않는다.

 

IDA에서 Strings 검색을 통해 힌트가 될 만한 문자열이 있는지 확인해보았더니,

리눅스에서 실행시켰을 때 나왔던 문구인 Reversing.Kr Easy ELF와 wrong, correct를 볼 수 있다.

 

"Reversing.Kr Easy ELF"를 더블 클릭해서 들어가면 아래와 같은 화면을 볼 수 있고, 이때 문자열 aReversingKrEas를 클릭한 상태로 X를 눌러서 메인 함수로 이동해 보았다.

 

"aReversingKrEas"

 

메인 함수는 위의 사진과 같고, 매우 간단하다.

cmp를 통해 eax가 1이 아니면 wrong으로 점프하는 것을 알 수 있다.

그렇다면 점프하지 않고, 왼쪽으로 가야 하는데(eax=1), 왼쪽 노드에서 80484F7이라는 함수를 호출하고 있다. 해당 함수로 들어가 보았다.

해당 함수는 correct를 출력하는 함수였다. 따라서 메인함수의 첫번째 노드를 확인하면 될 것 같다.

 

<메인 함수 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