[Dreamhack] rev-basic-8

김성진·2022년 8월 10일
0

Dreamhack_Reversing

목록 보기
9/13

📒 Description


📒 C code

📖 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));
  sub_1400011B0("Input : ", argv, envp);
  sub_140001210("%256s", v4);
  if ( (unsigned int)sub_140001000(v4) )
    puts("Correct");
  else
    puts("Wrong");
  return 0;
}

📖 sub_140001000

__int64 __fastcall sub_140001000(__int64 a1)
{
  int i; // [rsp+0h] [rbp-18h]

  for ( i = 0; (unsigned __int64)i < 0x15; ++i )
  {
    if ( (unsigned __int8)(-5 * *(_BYTE *)(a1 + i)) != byte_140003000[i] )
      return 0i64;
  }
  return 1i64;
}

어우 이건 뭘까.... -5를 곱하기는 하는데 unsigned int 형태로 가져오므로 0xFB를 곱한다고 생각하면 될까 ?


📒 Exploit

#include <stdio.h>
int byte32[32] = {172, 243, 12, 37, 163, 16, 183, 37, 22, 198, 183, 188, 7, 37, 2, 213, 198, 17, 7, 197, 0,0,0,0,0,0,0,0,0,0,0,0};

int main(){
    for(int i=0; i<21; i++){
        for(int j=0; j<256; j++){
            if((255&(251*j)) == byte32[i]){
                printf("%c", j);
                break;
            }
        }
    }
    printf("\n");
    return 0;
}

그냥 브루트 포싱으로 풀었다 .... 플래그가 어질어질하다 ㅎㅎ
참고로 251을 곱하는 건 4바이트 형태이므로 꼭 꼭 type casting을 해주어야 한다.

profile
Today I Learned

0개의 댓글