Write-ups/pwnable.xyz
add - pwnable.xyz
dolphinlmg
2020. 2. 11. 21:52
dProb Info
int __cdecl main(int argc, const char **argv, const char **envp)
{
int result; // eax
__int64 v4; // [rsp+8h] [rbp-78h]
__int64 v5; // [rsp+10h] [rbp-70h]
__int64 v6; // [rsp+18h] [rbp-68h]
__int64 v7[11]; // [rsp+20h] [rbp-60h]
unsigned __int64 v8; // [rsp+78h] [rbp-8h]
v8 = __readfsqword(0x28u);
setup(*(_QWORD *)&argc, argv, envp);
while ( 1 )
{
v4 = 0LL;
v5 = 0LL;
v6 = 0LL;
memset(v7, 0, 0x50uLL);
printf("Input: ", argv, v7);
if ( (unsigned int)__isoc99_scanf("%ld %ld %ld", &v4, &v5, &v6) != 3 )
break;
v7[v6] = v4 + v5;
argv = (const char **)v7[v6];
printf("Result: %ld", argv);
}
result = 0;
__readfsqword(0x28u);
return result;
}
이번 문제도 입력받은 변수로 인덱싱을 하는데 바운더리 체크를 하지 않으므로 OOB를 의심해 볼 수 있다. v7[v6] = v4 + v5 에서 v7의 주소가 [rbp-0x60] 이므로 v7[13] 의 위치에 ret이 위치할 것이다. v6에 13을 넣어주고 나머지 두 값을 더해 win의 주소값으로 만들어주면 된다.