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

[Dreamhack.io] rev-basic-7

by 새달아 2022. 11. 2.

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

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

 

rev-basic-7

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

dreamhack.io

 

#문제분석

이번 문제도 단순한 입력값 검증 문제다.

 

#문제풀이

[main]

해당 부분이 메인함수 영역이며, 딱히 특별한 부분은 없다. 문자열 하나를 받아온다 정도...? 아무튼 test eax, eax 이후의 분기에서 "Correct"와 "Wrong"이 출력되니까 그 위에 있는 <chall.sub_7FF6DFE01000>을 확인해보자.

 

[chall.sub_7FF6DFE01000]

뭐 그렇게 어렵지는 않다. 전체적인 흐름을 보자면...

1. 입력값에 대해 rol연산을 진행한다.

2. 입력값이 맞으면, 점프해서 correct로 간다.

3. rol연산의 반복은 0x1F만큼한다.

 

연산부분을 자세히 살펴보자.

mov eax, dword ptr ss:[rsp]
and eax, 7

[rsp]에는 index로 사용하는 값이 들어가 있고 이를 eax로 넘겨준다. eax를 7과 and 연산을 진행한다.

 


movsxd rcx, dword ptr ss:[rsp]
mov qword ptr ss:[rsp+8], rcx
mov rdx, qword ptr ss:[rsp+20]
movzx ecx, al
mov rax, qword ptr ss:[rsp+8]
movzx eax, byte ptr ds:[rdx+rax]
rol al, cl

ecx에는 인덱스가, eax에는 입력값[i]가 들어가게 된다. 이후 하위 1byte에 대해 rol 연산을 진행하게 되는데...

입력값[i] << (i & 7) 이라고 보면 된다...!

 

movzx eax, al
xor eax, dword ptr ss:[rsp]
movsxd rcx, dword ptr ss:[rsp]
lea rdx, qword ptr ss:[7FF6DFE03000]
movzx ecx, byte ptr ds:[rdx+rcx]
cmp eax, ecx

이후 rol 연산한 결과 값을 인덱스와 xor연산을 진행한다. 비교할 key 값을 rdx에 저장하고 해당 인덱스에 위치한 값을 ecx에 저장한다. 그리고 eax와 ecx가 맞는지 확인!

 

이를 정리하면...

 

{입력값[i] << (i & 7)} ^ i == 비교 key값[i] 이니까... 이를 역연산 해주면 되겠습니다~

 

#include <stdio.h>

int ror(int x, int n) {
    int shift = x >> n;
    int src = x << (8-n);
    src &= 255;
    return shift | src;
}

int main(){
	int key[] = {0x52, 0xDF, 0xB3, 0x60, 0xF1, 0x8B, 0x1C, 0xB5, 0x57, 0xD1, 0x9F, 0x38, 0x4B, 0x29, 0xD9, 0x26, 0x7F, 0xC9, 0xA3, 0xE9, 0x53, 0x18, 0x4F, 0xB8, 0x6A, 0xCB, 0x87, 0x58, 0x5B, 0x39, 0x1E};

	int i, j, flag;
	
	for(i=0; i<0x1F; i++){
		key[i] = key[i] ^ i;
		j = i&7;
		flag = ror(key[i], j);
		printf("%c", flag);
	} 
	
}

여기서 중요한 건 rol과 ror의 코드 작성법인데... 사실 조금만 생각해보면 금방 할 수 있다. 아무튼 실행해주면...

Roll_the_left!_Roll_the_right!

쨘! 쉽게 flag 획득~

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

[Dreamhack.io] patch  (0) 2022.11.09
[Dreamhack.io] Secure Mail  (1) 2022.11.02
[Dreamhack.io] rev-basic-8  (0) 2022.08.31
[Dreamhack.io] Inject ME!!!  (1) 2022.08.30
[Dreamhack.io] rev-basic-1  (0) 2022.08.30