본문 바로가기

CTF/Pwnable.xyz

Pwnable.xyz pwnable_add Write up

약간 헷갈렸던 문제이다.

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();
  while ( 1 )
  {
    v4 = 0LL;
    v5 = 0LL;
    v6 = 0LL;
    memset(v7, 0, 80uLL);
    printf("Input: ", argv, v7);
    if ( __isoc99_scanf("%ld %ld %ld", &v4, &v5, &v6) != 3 )
      break;
    v7[v6] = v4 + v5;
    argv = v7[v6];
    printf("Result: %ld", argv);
  }
  result = 0;
  __readfsqword(0x28u);
  return result;
}

일단 우에보면 배열 v7에서 오버플로우가 발생하는것을 쉽게 눈치챌수 있을것이다.

그럼 이 오버플로우를 이용해서 v7[13] 에는 ret가 존재할것이라고 쉽게 예측할수 있을것이다.

 

까나리가 걸려있어도 우리는 ret는 변경할것이므로 딱히 신경쓸필요 없다.

정상적으로 플레그를 획득할수있다.(다른거 그냥 친거는 강제종료 어떻게 시키는지 까먹어서 그럼)

 

'CTF > Pwnable.xyz' 카테고리의 다른 글

Pwnable.xyz pwnable_xor Write up  (0) 2019.11.17
Pwnable.xyz pwnable_misailgnment Write up  (0) 2019.11.09
Pwnable.xyz pwnable_sub Write up  (0) 2019.11.09
Pwnable.xyz pwnable_welcome Write up  (0) 2019.11.09
Pwnable.xyz pwnable_note Write up  (0) 2019.10.21