Easy_ELF 파일은 리눅스 실행 파일인 elf 파일이다. 윈도우의 PE 파일과 같은 존재이다.
IDA는 ELF 파일 분석을 제공한다. 따라서, IDA를 통해 Easy_ELF 파일 분석을 수행해보았다.
파일을 IDA로 열어보면 시작 부분이 (그림 1)과 같다.
main으로 가기 위해서 .text:08048397의 offset main을 클릭해보자.
(그림 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 함수를 차례로 살펴보자.
(그림 3)은 sub_8048434 함수 내부이다. ___isoc99_scanf 결과를 리턴하는 것으로 보인다.
대충.. 입력받은 input 값을 출력하는 것 같다.
(그림 4)는 sub_8048451 함수를 그래프화한 것이다. sub_8048434 함수를 통해 출력한 input 값을 비교하는 문이다.
우리는 위 (그림 2)에서 sub_8048451 함수 리턴 값이 0이면 'Wrong' 출력하는 것을 살펴보았다.
그렇다면 sub_8048451 함수가 1을 리턴하도록 해야한다.
위 (그림 4)에서 맨 마지막 조건문까지 수행하게 되면 아래 (그림 5)에서 볼 수 있듯이 eax에 1이 세팅되는 것을 볼 수 있다.
우리는 마지막 조건문까지 수행될 수 있는 입력 값이 필요하다. 위의 조건문들을 차례로 살펴보자.
아래 (그림 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'여야 한다.
아래 (그림 7)에서 조건문을 계속해서 살펴보자.
loc_80484BA에서는 세 번째 글자와 7Ch 인지를 확인한다.
loc_80484CC에서는 첫 번째 글자와 78h 인지를 확인한다.
앞서 위 (그림 6)에서 세 번째와 첫 번째 글자는 각각 34h, 32h와 xor 한 후의 글자이다.
마지막으로 (그림 8)의 loc_80484DE에서는 네 번째 글자가 0DDh 인지를 확인한다.
네 번째 글자는 위 (그림 6)에서 0FFFFFF88h와 xor되었었다.
정리해보면 각 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)와 같다.
'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 |