add 문제입니다.
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, 0x50uLL);
printf("Input: ", argv, v7);
if ( (unsigned int)__isoc99_scanf((__int64)"%ld %ld %ld", (__int64)&v4, (__int64)&v5, (__int64)&v6) != 3 )
// scanf로 3개의 인자 값을 받아오고, 정상적인 3개 인자가 들어오지 않으면 실행
break;
v7[v6] = v4 + v5; // v4와 v5를 더한 값을 v7 배열의 v6번째 자리에 입력
argv = (const char **)v7[v6];
printf("Result: %ld", argv);
}
result = 0;
__readfsqword(0x28u);
return result;
}
main 함수입니다.
그리고 찾아보니 win 함수도 있습니다.
그냥 일로 ret 주소를 바꾸라는거같네요.
v7[v6]인걸 보니 v6의 값을 바꿔서 ret주소에 가도록 하고? 그 값을 저 win 함수의 주소로 바꿔버리면 될 것 같습니다.
배열의 크기가 11개니, 11개 공간 + sfp + ret로 해서 v6가 13이면 될 것 같네요.
그리고? 이동할 주소를 gdb를 통해 찾아봅시다.
0x400822 라고 하네요.
이제 이걸 10진수 정수로 입력받으니 변환시켜서 입력해주면 될 것 같습니다.
4196386이네요 ㅎ
이렇게 하고 실행하면?
이렇게 나옵니다!
끄읕
'Hacking-기초 > [PWN] Pwnable.xyz' 카테고리의 다른 글
[PWN] xor (50pts) (0) | 2020.08.01 |
---|---|
[PWN] note (50pts) (0) | 2020.07.30 |
[PWN] misalignment (50pts) (0) | 2020.07.28 |
[PWN] sub (50pts) (0) | 2020.07.28 |
[PWN] Welcome (50pts) (0) | 2020.07.28 |