CTF/리버싱

[RiftCTF] Reversing 0x0002 - 리버싱 / IDA

SecurityMan 2022. 3. 30. 08:30

아주조금 복잡한 리버싱 문제

 

대회가 끝나고 풀어서 캡쳐가 원활하지 않다.

 

 

chall2.elf 파일이 주어진다.

 

elf파일은 Executable and Linkable 의 약자로 보통 리눅스에서 실행되는 파일이다.

 

리눅스의 exe 파일이라고 생각하면 된다.

 

 

이런식으로 실행이 가능하다.

 

./chall.elf 라고 입력하면 실행이 된다.

 

프로그램을 실행하면 passwd > 라는 창이 나오면서 비밀번호를 입력하라고 한다.

 

이 문제의 의도는 이 비밀번호를 알아내는 것이다.

 

 

IDA 라는 디스어셈블러를 이용해 해당 파일을 열어본다.

 

main 함수를 보면 비밀번호가 맞으면 "Correct Password..."

 

틀리면 "Wrong Password..." 을 프린트한다는것을 알 수 있다.

 

해당 그래프가 있는 화면에서 F5를 눌러주면 수도코드로 디컴파일 해준다.

 

 

디컴파일 메인함수를 살펴보면 위와 같다.

 

if 문으로 sub_1165 함수를 실행한 결과에 따라서 Wrong Password / Correct Password 출력값이 달라진다.

 

sub_1165를 더블클릭해서 해당 함수로 들어가본다.

 

sub_1165 함수는 입력값으로 a1(배열), a2(배열) ,a3를 받아온다.

 

그리고 나서 v4 라는 변수를 선언한 뒤

 

for 문으로 i 값을 0부터 차례로 증가시키면서

 

a1[i] 와 0x55 를 XOR 연산하고, 나온 결과값을 a2[i]와 다시한번 XOR 한 뒤 v4를 리턴한다.

(^ 는 XOR 연산 기호이다.)

 

 

다시한번 main 함수를 살펴보자.

 

sub_1165 함수는 s, &unk_2030, 37 세가지 값을 입력으로 받는다.

 

여기서 s는 사용자의 입력값이 저장된다. s가 sub_1165 함수 내부에서 a1 역할을 한다.

 

다음은 unk_2030 이라는 배열이 온다. 프로그램에 이미 저장되어 있는 값으로 함수 내부에서 a2 역할을 한다.

 

세번째 37은 unk_2030 배열의 길이로 함수 내부에서 a3 역할을 한다.

 

unk_2030 안에 어떤 내용이 있는지 살펴보기 위해 더블클릭해본다.

 

 

unk_2030 안에 들어있는 내용이다. 정확히 37개의 값이 있다.

 

0x27, 0x3C, 0x33 순서대로 들어있는것이다. 숫자 뒤에 있는 h는 16진수라는것을 의미한다.

 

사용자가 만약에 1234를 입력했을 경우

 

1 ^ 0x55 ^ 0x27
2 ^ 0x55 ^ 0x3c
3 ^ 0x55 ^ 0x33
4 ^ 0x55 ^ 0x21

이런식으로 연산을 하게 될 것이다.

 

그럼 이제 비밀번호를 유추해 낼 수 있다.

 

unk_2030에 저장된 값을 맨 처음부터 하나씩 가져와서 0x55 와 XOR을 한다면

 

비밀번호를 획득할 수 있을것이다.

 

unk_2030 = '\x27\x3c\x33\x21\x16\x01\x13\x2e\x21\x27\x61\x36\x3c\x3b\x32\x0a\x31\x65\x66\x26\x3b\x21\x0a\x22\x65\x27\x3e\x0a\x34\x3b\x2c\x18\x65\x27\x66\x66\x28'

key = 0x55

flag = ''

for i in range(len(unk_2030)):
    flag += chr(ord(unk_2030[i]) ^ key)

print(flag)

 

Python 을 이용해서 이렇게 코드를 짜면 된다.

 

unk_2030 배열을 그대로 가져다 쓰고,

 

key 값은 0x55로 세팅해 준 뒤

 

flag 라는 빈 변수를 하나 선언한다.

 

for 문을 이용해 unk_2030 에서 하나씩 값을 가져와 0x55와 XOR 한 뒤, flag 변수에 저장한다.

 

마지막으로 완성된 flag 변수를 출력해주면 끝이다.

 

 

코드를 실행시키면 플래그를 획득할 수 있다.

반응형