ssongk
ssongk
ssongk
전체 방문자
오늘
어제

공지사항

  • resources
  • 분류 전체보기 (626)
    • CTF (24)
    • background (79)
      • fuzzing (5)
      • linux (29)
      • linux kernel (15)
      • windows (2)
      • web assembly (1)
      • embedded (0)
      • web (13)
      • crypto (9)
      • mobile (1)
      • AI (1)
      • etc.. (3)
    • write-up(pwn) (171)
      • dreamhack (102)
      • pwn.college (4)
      • pwnable.xyz (51)
      • pwnable.tw (3)
      • pwnable.kr (5)
      • G04T (6)
    • write-up(rev) (32)
      • dreamhack (24)
      • reversing.kr (8)
    • write-up(web) (195)
      • dreamhack (63)
      • LOS (40)
      • webhacking.kr (69)
      • websec.fr (3)
      • wargame.kr (6)
      • webgoat (1)
      • G04T (7)
      • suninatas (6)
    • write-up(crypto) (19)
      • dreamhack (16)
      • G04T (1)
      • suninatas (2)
    • write-up(forensic) (53)
      • dreamhack (5)
      • ctf-d (47)
      • suninatas (1)
    • write-up(misc) (13)
      • dreamhack (12)
      • suninatas (1)
    • development (31)
      • Linux (14)
      • Java (13)
      • Python (1)
      • C (2)
      • TroubleShooting (1)
    • 자격증 (8)
    • 이산수학 (1)
    • 정보보안 (0)
hELLO · Designed By 정상우.
ssongk

ssongk

[reversing.kr] Easy Keygen write-up
write-up(rev)/reversing.kr

[reversing.kr] Easy Keygen write-up

2023. 8. 18. 14:56
ReversingKr KeygenMe


Find the Name when the Serial is 5B134977135E7D13

 

실행해주면 name과 serial을 비교하여 주는데

금방 닫혀버려서 결과가 어떤지도 알기 힘듭니다.

 

IDA로 디컴파일하면 다음과 같습니다.

int __cdecl main(int argc, const char **argv, const char **envp)
{
  signed int v3; // ebp
  int i; // esi
  char v6; // [esp+Ch] [ebp-130h]
  char v7[2]; // [esp+Dh] [ebp-12Fh] BYREF
  char v8[100]; // [esp+10h] [ebp-12Ch] BYREF
  char Buffer[197]; // [esp+74h] [ebp-C8h] BYREF
  __int16 v10; // [esp+139h] [ebp-3h]
  char v11; // [esp+13Bh] [ebp-1h]

  memset(v8, 0, sizeof(v8));
  memset(Buffer, 0, sizeof(Buffer));
  v10 = 0;
  v11 = 0;
  v6 = 0x10;
  qmemcpy(v7, " 0", sizeof(v7));
  sub_4011B9(aInputName);
  scanf("%s", v8);
  v3 = 0;
  for ( i = 0; v3 < (int)strlen(v8); ++i )
  {
    if ( i >= 3 )
      i = 0;
    sprintf(Buffer, "%s%02X", Buffer, v8[v3++] ^ v7[i - 1]);
  }
  memset(v8, 0, sizeof(v8));
  sub_4011B9(aInputSerial);
  scanf("%s", v8);
  if ( !strcmp(v8, Buffer) )
    sub_4011B9(aCorrect);
  else
    sub_4011B9(aWrong);
  return 0;
}

 

sprintf의 결과를 확인하기 위해 디버깅을해보면 다음과 같이 나옵니다.

입력한 값을 v7[-1](V6), v7[0], v7[1]와 XOR 연산하는 순환 구조입니다.

각각의 값은 0x10, 0x20, 0x30입니다.

 

"%s%02X" 형식으로 나오는 것으로 되어 있는데

XOR연산한 hex값을 ascii로 변환시켜줍니다.

 

따라서 주어졌던 시리얼 값인 5B134977135E7D13을

2문자씩 쪼개서 0x10, 0x20, 0x30 순으로 xor 연산 해주면 됩니다.

num = '5B 13 49 77 13 5E 7D 13'
num_li = num.split()
xor_li = [0x10, 0x20, 0x30]
i = 0
for n in num_li:
    if i>=3 :
        i=0
    print(chr(int(n,16)^xor_li[i]),end='')
    i += 1
K3yg3nm3

'write-up(rev) > reversing.kr' 카테고리의 다른 글

[reversing.kr] Replace write-up  (0) 2024.06.01
[reversing.kr] Music Player write-up  (0) 2024.05.31
[reversing.kr] Easy ELF write-up  (0) 2023.08.30
[reversing.kr] Easy Unpack write-up  (0) 2023.08.30
[reversing.kr] Easy Crack write-up  (0) 2023.08.18
    'write-up(rev)/reversing.kr' 카테고리의 다른 글
    • [reversing.kr] Music Player write-up
    • [reversing.kr] Easy ELF write-up
    • [reversing.kr] Easy Unpack write-up
    • [reversing.kr] Easy Crack write-up
    ssongk
    ssongk
    벌레 사냥꾼이 되고 싶어요

    티스토리툴바