약간 헷갈렸던 문제이다.
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();
while ( 1 )
{
v4 = 0LL;
v5 = 0LL;
v6 = 0LL;
memset(v7, 0, 80uLL);
printf("Input: ", argv, v7);
if ( __isoc99_scanf("%ld %ld %ld", &v4, &v5, &v6) != 3 )
break;
v7[v6] = v4 + v5;
argv = v7[v6];
printf("Result: %ld", argv);
}
result = 0;
__readfsqword(0x28u);
return result;
}
일단 우에보면 배열 v7에서 오버플로우가 발생하는것을 쉽게 눈치챌수 있을것이다.
그럼 이 오버플로우를 이용해서 v7[13] 에는 ret가 존재할것이라고 쉽게 예측할수 있을것이다.
까나리가 걸려있어도 우리는 ret는 변경할것이므로 딱히 신경쓸필요 없다.
정상적으로 플레그를 획득할수있다.(다른거 그냥 친거는 강제종료 어떻게 시키는지 까먹어서 그럼)
'CTF > Pwnable.xyz' 카테고리의 다른 글
Pwnable.xyz pwnable_xor Write up (0) | 2019.11.17 |
---|---|
Pwnable.xyz pwnable_misailgnment Write up (0) | 2019.11.09 |
Pwnable.xyz pwnable_sub Write up (0) | 2019.11.09 |
Pwnable.xyz pwnable_welcome Write up (0) | 2019.11.09 |
Pwnable.xyz pwnable_note Write up (0) | 2019.10.21 |