-
-
[原创]第六题 Repwn
-
2019-3-25 15:06 3378
-
第六题
这个题是我蒙混过关的,本来有两关,但是做了一关就被放行了= =
函数总体为:
int sub_4014C0() { unsigned int v0; // ebx sub_4044B0(); v0 = 0; v3 = 0x7F79745E; v4 = 0x2B704C63; v5 = 1630229319; v6 = 1194152263; v7 = 1198270550; v8 = 695827786; v9 = 1397178665; v10 = 6644011; strcpy(Str, "Ansome_Is_Wrong"); while ( v0 < strlen((const char *)&v3) ) *((_BYTE *)&v3 + v0++) ^= 0x18u; puts("Please Input Your Key_ Now!"); scanf("%s", &v11); if ( sub_4012F0((int)&v11) ) { sub_401460(&v11); system("pause"); } else { puts(Str); } return 0; }
跟进,得知第9位到第20为是X1Y0uN3tG00d,
signed int __cdecl sub_4012F0(int a1) { while ( *((_BYTE *)&v4 + v2) == *(_BYTE *)(v1 + a1) ) { ++v2; ++v1; if ( v2 > 11 ) { result = 1; if ( *(_BYTE *)(a1 + 20) == 0x48 ) return result; return 0; } } return 0; }
继续往下跟
signed int __cdecl sub_4013B0(int a1) { int v1; // ebx int v2; // ecx int v3; // esi signed int result; // eax sub_401380(a1); v1 = dword_40802C + 1000 * dword_408020 + 100 * dword_408024 + 10 * dword_408028; v2 = dword_408034 + 10 * dword_408030; v3 = dword_40803C + 10 * dword_408038; if ( 2 * (v1 + v2) != 4040 || 3 * v2 / 2 + 100 * v3 != 115 ) goto LABEL_2; result = 1; if ( v1 - 110 * v3 != 1900 ) { printf("Key_Is_Wrong,Please_Input_Again!"); LABEL_2: result = 0; } return result; }
得知前八位可以为20101001,这其实有很多个解满足,所以这也是这道题争论非常狂躁的原因,而我刚好捡个漏。= =
最后四位是一个栈溢出,只要溢出到0x401BF0即可,得出最后四位为HaCk,所以第一步的flag为20101001X1Y0uN3tG00dHaCk。
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。
赞赏
他的文章
看原图