rev-basic-9_BOOL8 __fastcall sub_140001000(const char *buf){ int i; // [rsp+20h] [rbp-18h] int len; // [rsp+24h] [rbp-14h] len = strlen(buf); if ( (len + 1) % 8 ) return 0i64; for ( i = 0; i buf 길이가 8의 배수여야 한다.buf를 8자리씩 sub_1400010A0()로 검증한다.sub_1400010A0()이 실행된 후, buf[i] == &unk_140004000 조건이 충족해야 한다.sub_1400010A0() 가 실행된 후의 buf가 [그림]의 데이터와 일치하면 된다. 다음으로 sub_1400010A0()를 분석해보자.__int64 _..
rev-basic-8__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i a1[i] * -5 == byte_140003000[i] 을 만족하는 a1[i] 를 구하는 문제다. 단순한 방법은 a1[i] == byte_140003000[i] / -5 를 연산해서 a1[i]를 구하는 것이다. 그러나 단순하게 생각해서 구현하면 a1[i] 을 구할 수 없다.이유는 if문을 보면 a1[i] * -5 연산 후에 (unsigned __int8)로 형변환을 수행하기 때문이다.즉, 형변환까지 고려해서 a1[i]을 구해야한다. 역연산으로 byte_140003000[i]부터 a1[i]를..
rev-basic-7__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i a1[i]과 (i&7)을 ROL 연산ROL 연산 결과를 i와 xor 연산결과를 byte_140003000[i]와 비교 핵심으로 알아야 하는 키워드는 ROL 연산이다. ○ ROL쉽게 설명하면 left shift 연산이랑 비슷한데, 연산 수행 후에 기존 8자리를 벗어나게 되는 비트는 오른쪽 맨 끝 자리로 돌아오는 형태의 연산이다.shitf 연산인데 큐처럼 동작하는 shift 연산이라고 비유하면 될 것 같다. XOR 연산의 경우는 양변을 i로 XOR 연산해주면 되기 때문에 쉽게 해결할 수 있다. ..
rev-basic-6__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i if문을 보면 byte_140003020[] 과 byte_140003000[] 를 비교하는 것을 확인할 수 있다.byte_140003020[a1[i]] == byte_140003000[i] 조건을 만족해야한다. 요약하면 다음과 같이 설명할 수 있다.byte_140003020[] 중에서 byte_140003000[i]와 같은 값에 대한 인덱스를 구하고 a1[i]로 넣어주면 flag다. 인덱스 값을 맞춰주기 위해서 byte_140003020[] 과 byte_140003000[] 의 데이터를 확인..
rev-basic-5_int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i if문을 보면 인자로 받은 a1을 byte_140003000[i]와 비교한다.i가 -1 일 때, a1[i+1] + a1[i] = byte_140003000[i] 가 성립하는 경우에만 flag이다.byte_140003000[i]을 확인하고 a1[i+1] + a1[i] = byte_140003000[i] 라는 조건이 성립하는 flag를 구해보자. 다음은 byte_140003000[32]다..data:0000000140003000 ; unsigned __int8 byte_140003000[32].d..
rev-basic-4__int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i > 4)) != byte_140003000[i] ) return 0i64; } return 1i64;}if문 조건으로 a1에 대한 검증을 수행한다. 조건을 해석하면 다음과 같다.(16 * a1[i]) ^ (a1[i] >> 4) == byte_140003000[i]16*a1[i] 과 a1[i] >> 4 를 서로 OR 연산한 결과를 생성한다. 앞서 생성한 결과와 byte_140003000[i]가 동일한 경우의 a1[i]이 flag다. 즉, flag를 구하는 방법의 핵심은 16*a1[..