발자취

[Reverse Engineering] #07-4. rev-basic-3 풀이 본문

Dreamhack Study/Reverse Engineering

[Reverse Engineering] #07-4. rev-basic-3 풀이

해린 2024. 7. 1. 03:16

본 게시물은 Dreamhack의 Reverse Engineering 로드맵 과정을 학습한 기록이다.

 

#01. 서론

1. 서론

https://dreamhack.io/wargame/challenges/17

위 링크의 워게임을 풀이한다.

 

이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어진다. 이 프로그램을 분석하여 알맞은 문자열을 찾아 입력해 주면 된다!

 

 

#02. 분석 및 설계

1. 정적 분석

파일을 로드한다.

 

 

main 함수

단축키 F5를 눌러 main 함수를 디컴파일했다.

이전에 풀었던 rev-basic-1과 별 다를 게 없는 구조이다.

"Input: " 문자열을 출력하고, 변수 v4에 사용자 입력 문자열을 저장하는 구조이다.

 

sub_140001000 함수가 사용자 입력 문자열과 알맞은 문자열을 비교하는 역할일 것이기 때문에 이 함수를 디컴파일하여 분석해 보도록 하겠다.

 

 

sub_140001000

반복문을 0x18회, 즉 24회를 돌면서 if문을 통해 배열을 검사한다.

(0x18을 클릭한 뒤, 단축키 h를 누르면 10진수로 바꿀 수 있다.)

 

if문의 조건이 성립하면 0을, 성립하지 않으면 1을 반환하는데 우리는 "Correct" 문자열을 출력하기 위해서는 1을 반환받아야 한다. 따라서, if문 내의 조건이 성립하지 않아야 한다는 것을 알 수 있다.

 

byte_140003000[i]!= (i ^ *(unsigned __ini8 *)(a1 + i) + 2 * i이 성립하지 않기 위해서는

i ^ *(unsigned __ini8 *)(a1 + i) + 2 * i 값이 byte_140003000[i]와 동일해야 한다.

 

 

byte_140003000 배열

 

위 코드에서 해당 배열을 더블클릭하면 위와 같은 화면을 볼 수 있다.

 

Hex View를 통하면 좀 더 보기 편하다.

 

이 부분이 선택된 상태에서 Shift + E 단축키를 누르면 해당 데이터를 해석하기 편한 형태로 익스포트 할 수 있다.

hex string (spaced)를 사용해 익스포트 후, Python3의 bytes.fromhex 함수를 사용해 bytes 형태로 다시 불러오는 방법을 사용한다.

 

 

#03. 역연산

1. 역연산

24바이트의 사용자 입력값이 a1일 때, i ^ *(unsigned __ini8 *)(a1 + i) + 2 * i의 결과가 익스포트 한 24바이트의 데이터와 일치해야 한다.

 

이때, *(unsigned __ini8 *)(a1 + i)는 a1 배열의 맨 앞 주소에 unsigned __ini8 * 형으로 i 만큼의 인덱스만큼을 더해 해당 주소의 바이트를 가져오기 때문에, a1[i]로 해석해도 된다고 한다!

 

따라서 결론적으로, a1[i] == (data[i] - 2 * i) ^ i를 만족시켜야 하는 것이다.

 

 

data = bytes.fromhex("49 60 67 74 63 67 42 66 80 78 69 69 7B 99 6D 88 68 94 9F 8D 4D A5 9D 45 00 00 00 00 00 00 00 00")
data = data[:24]

result = []

for i in range(24):
    # i ^ a1[i] + 2 * i == data[i]
    tmp = data[i] - 2 * i
    tmp = tmp % 256

    # i ^ a1[i] = tmp
    a1_i = tmp ^ i

    result.append(a1_i)

result = bytes(result)

print(result)

해당 과정을 진행하는 Python 코드이다.

 

python3 chall3.py
b'I_am_X0_xo_Xor_eXcit1ng\x00'

실행 결과는 위와 같다.

 

프로그램을 실행하여 해당 문자열을 입력해 보면 "Correct"가 나오는 것을 확인할 수 있다.

 

드림핵 워게임 페이지에 플래그를 적어 넣으면

 

정답이라고 나온다!

 

 


역연산 과정이 마냥 쉽지만은 않게 느껴졌다.

능숙하게 풀이할 수 있을 때까지 열심히 공부해보자!