발자취
[Reverse Engineering] #07-4. rev-basic-3 풀이 본문
[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"가 나오는 것을 확인할 수 있다.

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

정답이라고 나온다!

역연산 과정이 마냥 쉽지만은 않게 느껴졌다.
능숙하게 풀이할 수 있을 때까지 열심히 공부해보자!
'Dreamhack Study > Reverse Engineering' 카테고리의 다른 글
| [Reverse Engineering] #07-3. patch 풀이 (0) | 2024.07.01 |
|---|---|
| [Reverse Engineering] #07-2. rev-basic-1 풀이 (0) | 2024.06.28 |
| [Reverse Engineering] #07-1. rev-basic-0 풀이 (0) | 2024.06.28 |
| [Reverse Engineering] #06-2. IDA 실습 (0) | 2024.06.25 |
| [Reverse Engineering] #06-1. Tools: IDA 이론 (0) | 2024.06.25 |