728x90
반응형
1. intro
2. code 및 분석
2.1. code
2.1.1. main
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4[256]; // [rsp+20h] [rbp-118h] BYREF
memset(v4, 0, sizeof(v4));
printf("Input : ", argv, envp);
scanf("%256s", v4);
if ( check(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
2.1.2. check
__int64 __fastcall check(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; i < 0x18; ++i )
{
if ( password[i] != (i ^ *(a1 + i)) + 2 * i )
return '\0';
}
return '\x01';
}
2.2. 분석
함수명을 조금 보기 쉽게 해놨다.
요약하면, 값을 받아들인 후 password 변수의 값과 받아들인 값의 연산 값을 비교해서 같으면 1을 return하고 correct를 출력해 줄 것이다.
이런 문제는 그냥
if ( password[i] != (i ^ *(a1 + i)) + 2 * i )
부분에 브레이크를 걸고, 최종적으로 어떤 값과 비교하는지 보면 답이 나올거다.
이런 식으로 말이다.
또는 password 부분은 이미 프로그램에 저장된 값이기에 해당 메모리의 값을 보면 된다.
00007FF615FF3000 49 60 67 74 63 67 42 66 80 78 69 69 7B 99 6D 88 I`gtcgBf.xii{.m.
00007FF615FF3010 68 94 9F 8D 4D A5 9D 45 00 00 00 00 00 00 00 00 h...M..E........
결국 연산된 값이 이 값과 같아야하니 역으로 연산이 가능하다.
어릴때 배웠던 것처럼, 공식을 반대로 넘겨보자.
3. exploit
파이썬으로 간단히 코딩하여 풀었다.
p = [0x49,0x60,0x67,0x74,0x63,0x67,0x42,0x66,0x80,0x78,0x69,0x69,0x7B,0x99,0x6D,0x88,0x68,0x94,0x9F,0x8D,0x4D,0xA5,0x9D,0x45]
d = ''
for i in range(len(p)):
d += chr((p[i] - 2*i)^i)
print(d)
728x90
반응형
'Wargame > Dreamhack' 카테고리의 다른 글
rev-basic-4 (0) | 2023.01.22 |
---|---|
rev-basic-2 (0) | 2023.01.19 |
patch (0) | 2023.01.19 |
Holymoly (0) | 2023.01.12 |
rev-basic-0 (0) | 2023.01.06 |