Write-ups/pwnable.xyz

misalignment - pwnable.xyz

dolphinlmg 2020. 2. 11. 22:04

Prob Info


Prob Info
Checksec

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [rsp+10h] [rbp-A0h]
  _QWORD v5[3]; // [rsp+18h] [rbp-98h]
  __int64 v6; // [rsp+30h] [rbp-80h]
  __int64 v7; // [rsp+38h] [rbp-78h]
  __int64 v8; // [rsp+40h] [rbp-70h]
  unsigned __int64 v9; // [rsp+A8h] [rbp-8h]

  v9 = __readfsqword(0x28u);
  setup(*(_QWORD *)&argc, argv, envp);
  memset(&s, 0, 0x98uLL);
  *(_QWORD *)((char *)v5 + 7) = 0xDEADBEEFLL;
  while ( (unsigned int)_isoc99_scanf("%ld %ld %ld", &v6, &v7, &v8) == 3 && v8 <= 9 && v8 >= -7 )
  {
    v5[v8 + 6] = v6 + v7;
    printf("Result: %ld\n", v5[v8 + 6]);
  }
  if ( *(_QWORD *)((char *)v5 + 7) == 0xB000000B5LL )
    win();
  return 0;
}

이 문제에서 눈에 띄는 곳은 (_QWORD *)((char *)v5 + 7) 부분이다.

문제 이름답게 8바이트가 아니라 7바이트만 더해 초기화, 검사를 한다. 거기에 v5[v8 + 6] = v6 + v7; 이라는 이상한 곳을 while문으로 계속 값을 쓸 수 있게 해준다. 이를 이용해 값을 두번 써주면 된다.