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 |