본문 바로가기

RVS

Reversing.kr 11번 문제(Easy ELF)

Easy_ELF 파일은 리눅스 실행 파일인 elf 파일이다. 윈도우의 PE 파일과 같은 존재이다.

IDA는 ELF 파일 분석을 제공한다. 따라서, IDA를 통해 Easy_ELF 파일 분석을 수행해보았다.

 

파일을 IDA로 열어보면 시작 부분이 (그림 1)과 같다.

main으로 가기 위해서 .text:08048397의 offset main을 클릭해보자.

그림 1

(그림 2)는 main 함수 내부의 코드이다.

08048253B에서 "Reversing.Kr Easy ELF\n\n" 문자를 write 함수를 통해 쓴 후에, 바로 아래에서 sub_8048434와 sub_8048451 함수를 호출한다.

 

그리고, sub_8048451 리턴 값이 eax에 저장되고, 0804854A에서 eax와 1을 비교한 후에 같지 않으면, loc_804855B로 점프한다. 아래 그림에서 볼 수 있듯이 loc_804855B는 "Wrong"을 출력한다.

점프하지 않는다면 084854F의 loc_804855B 함수를 호출한다.

여기서 우리는 Wrong을 출력하는 함수로는 들어가지 말아야겠다는 것만 알겠다.

 

sub_8048434와 sub_8048451 함수를 차례로 살펴보자.

그림 2

 

(그림 3)은 sub_8048434 함수 내부이다. ___isoc99_scanf 결과를 리턴하는 것으로 보인다.

대충.. 입력받은 input 값을 출력하는 것 같다.

 

그림 3

(그림 4)는 sub_8048451 함수를 그래프화한 것이다. sub_8048434 함수를 통해 출력한 input 값을 비교하는 문이다.

우리는 위 (그림 2)에서 sub_8048451 함수 리턴 값이 0이면 'Wrong' 출력하는 것을 살펴보았다. 

그렇다면 sub_8048451 함수가 1을 리턴하도록 해야한다.

 

그림 4

 

 

위 (그림 4)에서 맨 마지막 조건문까지 수행하게 되면 아래 (그림 5)에서 볼 수 있듯이 eax에 1이 세팅되는 것을 볼 수 있다.

우리는 마지막 조건문까지 수행될 수 있는 입력 값이 필요하다. 위의 조건문들을 차례로 살펴보자.

그림 5

 

아래 (그림 6)은 첫 번째와 두 번째 조건문이 보인다.

먼저 가장 위의 첫 번째 조건문은 byte_80A4021의 값과 31h를 비교한다. 31h는 아스키로 '1'을 의미한다.

위 (그림 4)에서 우리는 byte_804A020부터 사용자 입력 값이 저장되는 것을 확인하였다.

그렇다면 byte_80A4021에는 두 번째 문자인듯하다.

그럼 첫 번째 조건으로 두 번째 문자는 '1'이어야 한다.

 

두 번째 조건문은 ds:byte_804A020으로 첫 번째 문자이다. 해당 조건문은 다음과 같은 연산을 수행한다.

첫 번째 문자와 34h와 xor

세 번째 문자와 32h와 xor

네 번째 문자와 0FFFFFF88h와 xor

다섯 번째 문자와 58h 값과 같은지 비교(58h는 아스키 코드로 'X' )

이렇게 두 번째 조건으로 다섯 번째 문자가 'X'여야 한다.

그림 6

 

아래 (그림 7)에서 조건문을 계속해서 살펴보자.

loc_80484BA에서는 세 번째 글자와 7Ch 인지를 확인한다.

loc_80484CC에서는 첫 번째 글자와 78h 인지를 확인한다.

앞서 위 (그림 6)에서 세 번째와 첫 번째 글자는 각각 34h, 32h와 xor 한 후의 글자이다.

그림 7

 

마지막으로 (그림 8)의 loc_80484DE에서는 네 번째 글자가 0DDh 인지를 확인한다.

네 번째 글자는 위 (그림 6)에서 0FFFFFF88h와 xor되었었다.

 

그림 8

 

정리해보면 각 input 문자들은 아래와 같아야 한다.

input[0] xor 34h =78h

input[1] = 1

input[2] xor 32h =7Ch

input[3] xor 0FFFFFF88h = 0DDh

input[4] = X

 

그렇다면 input[0], input[2], input[3]을 입력 값을 구하기 위해서는 아래와 같이 역으로 계산하면 된다.

input[0] = 78h xor 34h 

input[2] = 7Ch xor 32h 

input[3] = 0DDh xor 088h

 

아래 파이썬 코드를 통해 결과를 구해보자.

input=""

input_0= 0x78 ^ 0x34
input+=chr(input_0)

input_1=1
input+=str(input_1)

input_2=0x7C ^ 0x32
input+=chr(input_2)

input_3= 0xDD ^ 0x88
input+=chr(input_3)

input_4='X'
input+=str(input_4)

print(input)

 

결과는 아래와 (그림 9)와 같다.

그림 9

'RVS' 카테고리의 다른 글

Reversing.kr 10번 문제 (Twist1)  (0) 2020.03.30
Reversing.kr 13번 문제 (AutoHotkey1)  (0) 2020.03.20
Reversing.kr 7번 문제 (Position)  (0) 2020.03.19
Reversing.kr 9번 문제(Ransomware)  (0) 2020.03.16
UPX Manual Unpacking  (0) 2020.03.12