본문 바로가기
Write-up/dreamhack.io

[Dreamhack.io] rev-basic-3

by 새달아 2022. 1. 17.

dreamhack.io의 Wargame rev-basic-3 문제이다.

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

 

rev-basic-3

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

dreamhack.io

#문제분석

 

문제 정보는 다음과 같이 나와있다.

 

입력받은 문자열을 검증하는 함수를 찾아내면 flag를 얻을 수 있을 것으로 추측!

 

#문제풀이

우선 문자열 참조를 이용하여 메인함수를 찾았다.

해당 부분이 문자열을 검증하여 Correct 혹은 Wrong을 출력한다.

<chall3.sub_7FF7CDC51000>함수에서 해당 문자열을 검증하는 듯 하니 안으로 들어가 보겠다.

해당 함수를 그래프로 변환시키면...

여기서 알 수 있는 것은...

  • 해당 함수는 0x0부터 0x18번째까지 반복하는 반복문.
  • <chall3.00007FF7CDC51024>부분이 우리가 원하는 문자열을 검증하는 부분이라는 것.

그래서 저 부분을 잘 살펴보면 flag를 얻을 수 있겠다고 생각...

movsxd rax, dword ptr ss:[rsp] // 인덱스가 저장된 [rsp]의 값을 rax로 전달.
lea rcx, qword ptr ds:[7FF7CDC53000] // 비교할 문자열이 저장된 배열의 주소를 rcx에 전달.
movzx eax, byte ptr ds:[rcx+rax] // 인덱스 번호에 맞는 비교할 문자를 eax에 전달.
movsxd rcx, dword ptr ss:[rsp] // rcx를 인덱스로 초기화.
mov rdx, qword ptr ss:[rsp+20] // 사용자가 입력한 문자열을 rdx에 전달.
movzx ecx, byte ptr ds:[rdx+rcx] // 인덱스에 해당하는 입력 문자를 ecx에 전달.
xor ecx, dword ptr ss:[rsp] // ecx와 인덱스를 xor 연산.
mov edx, dword ptr ss:[rsp] // edx를 인덱스로 초기화.
lea ecx, qword ptr ds:[rcx+rdx*2] // ecx를 인덱스*2 만큼 증가.
cmp eax, ecx // eax와 ecx 비교.

우선 비교할 문자열이 저장된 배열의 주소([7FF7CDC53000])를 덤프로 따라가보면...

이렇게 친절하게 16진수 값으로 나와있다.

위 부분에 해당하는 계산을 코드로 표현하면 다음과 같다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int i;
	char dump[24] = {73, 96, 103, 116, 99, 103, 66, 102, 128, 120, 105, 105, 123, 153, 109, 136, 104, 148, 159, 141, 77, 165, 157, 69};
	char flag[24];

	for (i = 0; i < 0x18; i++)
	{
		dump[i] = (flag[i]^i) + (2*i);
	}
    
	return 0;
}

이것을 이제 역계산해주면...

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
	int i;
	char dump[24] = {73, 96, 103, 116, 99, 103, 66, 102, 128, 120, 105, 105, 123, 153, 109, 136, 104, 148, 159, 141, 77, 165, 157, 69};
	char flag[24];

	for (i = 0; i < 0x18; i++)
	{
		flag[i] = ((dump[i]-(2*i))^i);
	}

	printf("%s", flag);

	return 0;
}
I_am_X0_xo_Xor_eXcit1ng

쨘! flag를 얻을 수 있다.

'Write-up > dreamhack.io' 카테고리의 다른 글

[Dreamhack.io] rev-basic-5  (0) 2022.02.21
[Dreamhack.io] rev-basic-4  (0) 2022.01.17
[Dreamhack.io] rev-basic-2  (0) 2022.01.11
[Dreamhack.io] welcome  (1) 2021.08.09
[Dreamhack.io] file-download-1  (3) 2021.08.02