[Dreamhack] rev-basic-5

chrmqgozj·2025년 2월 13일

DreamHack

목록 보기
33/39

근본 중의 근본 문제다. 너무 반갑다.
사실 다른 어려운 문제들도 시도해봤었는데 손도 못 대겠고 일주일씩 시도해도 감이 안 와서 1단계부터 차근차근 푸는 중이다.
어렵다고 느껴진다면 쉬운 것부터 차근차근 해보면 좋겠다. 솔직히 그동안 해킹이 어렵고 멀게만 느껴졌던게 어려운 것만 푸니까 자존감 떨어지고, 어차피 못 풀꺼 손도 대기 싫어서 멀리 했던 것 같다.
그래도 이렇게 차근차근 해결하다보니 재미도 있고 바닥난 자존감도 점점 채워지고 있다.
2단계 마지막 문제를 풀려고 하니 갑자기 감성적이게 됐다. 문제나 풀자.

  1. main
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;
}
  1. check
__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
이렇게 설정하고 역으로 계산하면 된다.

  1. exploit.py
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='')

0개의 댓글