본문 바로가기
CTF/Dreamhack

[Dreamhack] Reversing Basic Challenge #3

by 8희 2024. 4. 6.

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

 

rev-basic-3

Reversing Basic Challenge #3 이 문제는 사용자에게 문자열 입력을 받아 정해진 방법으로 입력값을 검증하여 correct 또는 wrong을 출력하는 프로그램이 주어집니다. 해당 바이너리를 분석하여 correct를 출

dreamhack.io

 

바이너리를 분석하여 correct를 출력하도록 리버싱 해야 되는 문제이다.

 


 

문제 파일을 실행해보면 입력 창이 뜬다.

아무 값이나 입력을 해보면 Wrong이라고 한다.

Correct를 출력해내기 위해서 문제 파일을 x64dbg로 열어봤다.

 

 

 

[마우스 우클릭 > 다음을 찾기 > 모든 모듈 > 문자열 참조]

 문자열 참조를 통해 Correct 문자열을 찾았다.

 

 

Correct 문자열을 사용하는 주소(00007FF7D3021177)로 이동했다.

Input 값을 입력 받고 chall3.7FF750DB1000에서 문자열을 검사한다. 

그리고 검사 이후, 값이 맞으면 Correct로 틀리면 Wrong으로 점프한다.

 

 

7FF750DB1000으로 이동해봤다.

코드를 통해 이 부분이 문자열을 검사하는 부분인 것을 알 수 있다.

 

 

문자열을 검사하는 부분을 정확히 확인하기 위해 

가장 위에 BP를 설정했다. BP를 설정한 후, F9로 프로그램을 실행했다.

 

 

동적 분석을 하기 위해서 임의의 문자열을 입력한 뒤에 F8로 한 줄씩 코드를 계속 실행해봤다.

 

 

xor 연산 전까지 실행하면 RCX에 입력한 문자열이 저장돼 있는 걸 확인할 수 있다.

 

 

xor 연산까지 실행하면 RCX에 입력한 문자열의 첫 번째 값인 8이 들어가고,

RDX에는 입력한 문자열이 전체 다 들어갔다.

 

lea rcx, qword ptr ds:[7FF750DB1053]을 보면

RCX 값은 7FF750DB1053에 저장된다.

 

 

이 부분의 연산을 자세히 살펴 보면

 

RCX와 RSP(반복 수)를 xor 연산한다. RSP는 0부터 시작한다.
그리고 RDX에 RSP(반복 수)를 저장한다.
이후, RCX에 RCX(1의 결과값)+RDX(반복 수)*2를 저장한다.

 

 

앞서 RCX 값이 저장된 주소로 가보면 24개의 문자들이 있다.

이 문자들로 입력한 문자열을 비교한다.

비교 시엔 입력한 문자열을 그대로 비교하는 것이 아니라

xor 연산을 통해 바꿔서 RCX 값과 비교하기 때문에

이 값을 역연산 해야 된다.

 

#include <stdio.h>

int main()
{
	unsigned char rcx[] = { 0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 0x80, 0x78,
		0x69, 0x69, 0x7B, 0x99, 0x6D, 0x88, 0x68, 0x94, 0x9F, 0x8D, 0x4D, 0xA5, 0x9D, 0x45, 0x00};

	for (int i = 0; i < 24; i++)
	{
		printf("%c", ((rcx[i] - (2 * i)) ^ i));
	}

	return 0;

}

 

 

이 코드를 실행했을 때, 출력되는 문자열이 바로 flag이다. 

 

 

DH{I_am_X0_xo_Xor_eXcit1ng}

 


참고 자료

https://velog.io/@ximin/revbasic3

https://mingkang.tistory.com/entry/DreamHack-rev-basic-3-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4

https://blog.naver.com/16_youth/222332761341

 

'CTF > Dreamhack' 카테고리의 다른 글

[Dreamhack] rev-basic-5  (0) 2024.04.28
[Dreamhack] Reversing Basic Challenge #4  (0) 2024.04.10
[Dreamhack] Reversing Basic Challenge #2  (0) 2024.03.30
[Dreamhack] Reversing Basic Challenge #1  (0) 2024.03.23
[Dreamhack] CSRF Advanced  (0) 2023.11.22