-
J-U-M-P - pwnable.xyzWrite-ups/pwnable.xyz 2020. 2. 13. 19:56
Prob Info
Prob Info Checksec int __cdecl main(int argc, const char **argv, const char **envp) { unsigned __int8 v3; // [rsp+2Fh] [rbp-11h] __int64 v4; // [rsp+30h] [rbp-10h] void *v5; // [rsp+38h] [rbp-8h] setup(); v4 = gen_canary(); puts("Jump jump\nThe Mac Dad will make you jump jump\nDaddy Mac will make you jump jump\nThe Daddy makes you J-U-M-P\n"); v5 = &loc_BA0; while ( 1 ) { print_menu(); printf("> ", argv); v3 = read_int8(); switch ( v3 ) { case 2u: v5 = (void *)(signed int)((unsigned int)v5 ^ v3); break; case 3u: argv = (const char **)environ; printf("%p\n", environ); break; case 1u: if ( v4 == canary ) JUMPOUT(__CS__, v5); break; default: puts("Invalid"); break; } } }
이 문제는 특이하게 카나리를 직접 생성하고 main함수 내에서만 사용한다. 아래 read_int8 함수에는 카나리를 사용하지 않아 1byte bof가 일어난다.
int read_int8() { char buf; // [rsp+0h] [rbp-20h] read(0, &buf, 0x21uLL); return atoi(&buf); }
이 경우 sfp를 덮어 main함수의 rbp를 수정할 수 있다. 3번 메뉴에서 environ을 leak해주기 때문에 적절히 변수들을 변경할 수 있다.
v3를 v5로 인식하게 하기 위해 rbp를 9만큼 더해 올려주고 win함수의 하위 1바이트로 덮어주면 함수가 변경된다.
1번 메뉴를 사용하기에는 카나리의 위치도 변경되었기에 다시 원래 rbp의 값으로 변경해준 후 1번 메뉴를 이용해 플래그를 얻을 수 있다.
'Write-ups > pwnable.xyz' 카테고리의 다른 글
UAF - pwnable.xyz (0) 2020.02.13 iape - pwnable.xyz (0) 2020.02.13 SUS - pwnable.xyz (0) 2020.02.13 fspoo - pwnable.xyz (0) 2020.02.13 Game - pwnable.xyz (0) 2020.02.12