근본 중의 근본 문제다. 너무 반갑다.
사실 다른 어려운 문제들도 시도해봤었는데 손도 못 대겠고 일주일씩 시도해도 감이 안 와서 1단계부터 차근차근 푸는 중이다.
어렵다고 느껴진다면 쉬운 것부터 차근차근 해보면 좋겠다. 솔직히 그동안 해킹이 어렵고 멀게만 느껴졌던게 어려운 것만 푸니까 자존감 떨어지고, 어차피 못 풀꺼 손도 대기 싫어서 멀리 했던 것 같다.
그래도 이렇게 차근차근 해결하다보니 재미도 있고 바닥난 자존감도 점점 채워지고 있다.
2단계 마지막 문제를 풀려고 하니 갑자기 감성적이게 됐다. 문제나 풀자.
int __fastcall main(int argc, const char **argv, const char **envp)
{
char v4[256]; // [rsp+20h] [rbp-118h] BYREF
memset(v4, 0, sizeof(v4));
printf("Input : ");
scanf("%256s", v4);
if ( (unsigned int)check(v4) )
puts("Correct");
else
puts("Wrong");
return 0;
}
__int64 __fastcall sub_140001000(__int64 a1)
{
int i; // [rsp+0h] [rbp-18h]
for ( i = 0; (unsigned __int64)i < 0x18; ++i )
{
if ( *(unsigned __int8 *)(a1 + i + 1) + *(unsigned __int8 *)(a1 + i) != byte_140003000[i] )
return 0LL;
}
return 1LL;
}
unsigned char arr[] =
{
0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1,
0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3,
0xA1, 0x98, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
};
a1[i+1] + a1[i] == arr[i]
그런데 잘 보면
a1[0] + a1[1] = arr[0]
~
a1[23] + a1[24] = arr[23]
인데 arr[23] = 0이다. 그러면 a1[23] = a1[24] = 0
이렇게 설정하고 역으로 계산하면 된다.
arr = [
0xAD, 0xD8, 0xCB, 0xCB, 0x9D, 0x97, 0xCB, 0xC4, 0x92, 0xA1,
0xD2, 0xD7, 0xD2, 0xD6, 0xA8, 0xA5, 0xDC, 0xC7, 0xAD, 0xA3,
0xA1, 0x98, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00
]
flag = [0 for i in range(24)]
flag[22] = arr[22]
for i in range(21, -1, -1):
flag[i] = arr[i] - flag[i+1]
for i in flag:
print(chr(i),end='')