본문 바로가기

5. 방학 활동/Write UP

[2023.02.02] 워게임&CTF 스터디 1팀 문제풀이(리버싱)]

※ 관련 개념은 방학활동 / 개념정리를 참고해주세요 ※

 

해당 문제들은 X64dbg, Ollydbg(올리디버거) 또는 HXD를 사용하였습니다.

 

# Dreamhack REV-BASIC-1

 

[파일 분석]

'문자열 참조 찾기'를 통해 correct 문자열 찾기

1) input 함수를 통해 flag 값을 입력하면 'chall1.7FF6956813B6' 함수에서 입력 값 비교한 후, Correct나 Wrong 메시지 출력

→ 해당 함수 따라가기 (test 위의 call 부분 더블클릭)

 

1) 문자 하나하나에 대해 비교하여 수행함을 알 수 있음

각 문자열을 다 합치면 플래그 값이 나온다.


# Dreamhack REV-BASIC-3

 

[파일 분석]

'문자열 참조 찾기'를 통해 correct 문자열 찾기

1) input 함수를 통해 flag 값을 입력하면  'chall3.7FF6CBF01000' 함수에서 입력 값 비교한 후, correct나 wrong 메시지 출력

→ 해당 함수 따라가기 (call 부분 더블클릭)

 

◇ 어셈블리어에서는 16진수를 사용하기 때문에 숫자들을 해석하거나, 이용할 때는 프로그래밍 계산기를 이용하거나, 10진수로 바꿔서 사용해야 한다.

 

1) [cmp rax, 18] : 사용자 입력 값 0x18번 비교

→ 0x18(16)=24(10)

2) [lea ecx, qword ptr ds:[rcx+rdx*2]]

사용자 입력값 비교 수행

3) [lea rcx, qword ptr ds:[7FF6C4AD3000]]

 7FF6C4AD3000주소에 rcx 값 저장

 

따라서, 해당 주소를 따라가야한다. (아래 덤프 쪽에서 찾기 (Ctrl+G)) (아래 사진 참고)

 

1) 사용자의 입력 값을 연산하여 rcx 값과 비교하기

연산과정을 역연산(XOR)하여 flag 값 도출

 

- 16진수 값

49 60 67 74 63 67 42 66 80 78 69 69 7B 99 6D 88 68 94 9F 8D 4D A5 9D 45

 

- 10진수 값

I`gtcgBf.xii{.m.  h...M¥.E

 

[XOR 값 구하기]

☆ XOR 구하는 코드 짜보기

- (input[i]^i)+(i*2)=str[i]  : 기본 연산식
- (input[i]^i)=str[i]-(i*2)  : 양변에 –(i*2) 추가
- input[i]=(str[i]-(i*2))^I 양변에 ^i 추가 => 역연산

# Basic RCE L02

 

[파일 분석]

1) 왼쪽의 16진수들을 오른쪽에서 아스키코드로 변환한 값을 나타냄

 

변환된 값을 보다 보면, 'yeah, you did it' 뒤에 정답이 나오는 것을 볼 수 있다.


# Basic RCE L04

 

[실행 화면]

파일을 다운 받아서 실행해보면, cmd창이 열리면서 '정상'이 계속 출력됨

 

[파일 분석]

실행했을 떄 1초마다 '정상' 등의 글이 출력되기 때문에 함수가 사용되었다고 생각되어 '함수 검색'을 해보았다.

 

'Sleep'와 'IsDebuggerPresent'가 있는 걸 볼 수 있다.

 

더블 클릭해서 함수의 위치로 이동하면 'timeout'을 이용해 1초 후에 함수를 호출하는 것을 알 수 있다.

따라서, 함수의 이름인 'IsDebuggerPresent'가 답인 것을 알 수 있다.


# Dreamhack Reversing Basic Challenge #0

 

[파일 분석]

문자열 참조 기능을 통해 'correct'를 찾았다.

 

input을 받은 후에 맞으면 correct, 틀리면 wrong을 출력한다.

 

함수를 따라가다 보면, flag로 보이는 문자열을 찾을 수 있다.