Dreamhack | rev-basic-4 풀이

ximin·2023년 2월 1일
0

Dreamhack

목록 보기
5/6

rev-basic-4

앞의 rev-basic 문제들과 비슷한 유형의 문제이다.
문제 파일을 다운로드 하면 exe파일이 있는 것을 확인할 수 있다.
압축 해제 후 x64dbg로 파일을 열어본다.
문자열 참조를 통해 correct 문자열을 찾아서 이동한다.
Input값을 받고, chall4.7FF620951000에서 문자열을 검사한다는 것을 추측할 수 있다.
해당 주소로 이동한다.
해당 주소로 이동하면, 위와 같은 코드가 있는것을 확인할 수 있다.
가장 위에 BP를 설정해주고, F9을 통해 프로그램을 실행시켜본다.
프로그램을 실행시키고, 임의의 값 'asdf'를 입력해준다.
입력을 하면, 위에서 설정한 BP에 멈추는 것을 확인할 수 있다.
F8을 통해 'sar' 명령어 직전까지 실행시켜본다.
'sar'명령어 전까지 실행시킨 뒤의 모습이다.
RAX에는 입력한 문자열의 첫 번째 값,
RCX에는 입력한 문자열 전체가 들어가있는 것을 확인할 수 있다.
여기서 'sar' 명령어는 비트를 오른쪽으로 이동시키는 명령어이다.
sar 명령어까지 실행시켜본다.
sar 명령어까지 실행하면, RAX에 저장된 비트가 오른쪽으로 밀린 것을 확인할 수 있다.
이를 통해, RAX에는 입력값의 앞 비트가 저장된다.
다음으로, 'shl'명령어 전까지 실행시켜본다.
'shl'명령어 전까지 실행시킨 뒤의 모습이다.
이번에는 RCX에 입력한 문자열의 첫 번째 값이 들어가 있는것을 확인할 수 있다.
'shl'명령어는 'sar'명령어와 반대로 비트를 왼쪽으로 이동시키는 명령어이다.
shl 명령어까지 실행시켜본다.
shl 명령어까지 실행하면, RCX의 비트가 왼쪽으로 밀린 것을 확인할 수 있다.
여기서 and 명령어까지 실행해본다.
and명령어까지 실행한 모습이다.
0xF0과 and연산을 진행해서, 결과적으로 원래의 첫 번째 자리의 수가 두번째 자리에 저장되었다.
그 뒤에 or명령어까지 실행하면, RAX에 RAX와 RCX를 or연산한 결과가 저장된다.
이제 cmp명령어 전까지 실행해본다.
위와 같이, 7FF620953000주소에 저장된 문자를 RCX에 불러오고,
RAX와 비교한다.
여기서 RAX에 들어가는 값이 24가 되도록 해야하는데, RAX는 입력값의 앖 뒤 값이 바뀐채로 저장되는 것을 확인할 수 있다.
EX : A(0x61)입력 => RAX에 0x16저장됨
이러한 규칙이 있기 때문에, RCX에 들어가는 값의 앞 뒤를 바꿈으로써 flag를 구할 수 있다.
flag를 구하기 위한 코드를 c언어로 작성한다.

#include <cstdio>
int main() {
	int aa[100] = { 0x24, 0x27, 0x13, 0xC6, 0xC6, 0x13, 0x16,
				   0xE6, 0x47, 0xF5, 0x26, 0x96, 0x47, 0xF5,
				   0x46, 0x27, 0x13, 0x26, 0x26, 0xC6, 0x56,
				   0xF5, 0xC3, 0xC3, 0xF5, 0xE3, 0xE3 };//RCX에 들어가는 값
	for (int i = 0; i < 27; i++) {
		int num = aa[i];
		printf("%c", (num % 0x10 * 0x10 + num / 0x10)); //flag 출력
	}
}

배열 aa에는 7FF620953000주소에 저장된 문자들이 위치한다.
위 코드를 실행시켜서 flag를 구할 수 있다.FLAG : Br1ll1antbit_dr1bble<<_>>

profile
Insta

0개의 댓글