Write-ups/pwnable.xyz

add - pwnable.xyz

dolphinlmg 2020. 2. 11. 21:52

dProb Info


Prob Info
Checksec

 

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int result; // eax
  __int64 v4; // [rsp+8h] [rbp-78h]
  __int64 v5; // [rsp+10h] [rbp-70h]
  __int64 v6; // [rsp+18h] [rbp-68h]
  __int64 v7[11]; // [rsp+20h] [rbp-60h]
  unsigned __int64 v8; // [rsp+78h] [rbp-8h]

  v8 = __readfsqword(0x28u);
  setup(*(_QWORD *)&argc, argv, envp);
  while ( 1 )
  {
    v4 = 0LL;
    v5 = 0LL;
    v6 = 0LL;
    memset(v7, 0, 0x50uLL);
    printf("Input: ", argv, v7);
    if ( (unsigned int)__isoc99_scanf("%ld %ld %ld", &v4, &v5, &v6) != 3 )
      break;
    v7[v6] = v4 + v5;
    argv = (const char **)v7[v6];
    printf("Result: %ld", argv);
  }
  result = 0;
  __readfsqword(0x28u);
  return result;
}

이번 문제도 입력받은 변수로 인덱싱을 하는데 바운더리 체크를 하지 않으므로 OOB를 의심해 볼 수 있다. v7[v6] = v4 + v5 에서 v7의 주소가 [rbp-0x60] 이므로 v7[13] 의 위치에 ret이 위치할 것이다. v6에 13을 넣어주고 나머지 두 값을 더해 win의 주소값으로 만들어주면 된다.