-
-
[原创]南邮ctf逆向你大概需要一个优秀的mac
-
发表于:
2019-2-19 10:29
5686
-
这里只能用ida对文件进行分析。shift+f12进行关键字符串搜索,定位到函数处发现事一个check代码,用来进行检查,那么肯定存在上层调用,这里我们跳转到上层调用,查看是哪里对这里进行了调用。
int check()
{
signed int i; // [rsp+Ch] [rbp-F4h]
int v2[58]; // [rsp+10h] [rbp-F0h]
memcpy(v2, &unk_100000ED0, 0xE0uLL);
for ( i = 0; i < 56; ++i )
{
if ( input[i] != v2[i] )
{
puts((const char *)err);
exit(0);
}
}
return puts(success);
}
回到上层函数发现了一系列的调用
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4; // [rsp+40h] [rbp-70h]
__int64 v5; // [rsp+A8h] [rbp-8h]
memset(input, 0, 0x64uLL);
memset(&v4, 0, 0x64uLL);
scanf("%s", &v4);
if ( strlen(&v4) != 56 ) //字符串长度
{
puts((const char *)err);
exit(0);
}
__strcpy_chk(input, &v4, 100LL);//将输入的字符串copy到对应的字符串
func1(input); //对输入的字符串进行了简单的异或操作
xfun1();
xfun2();
xfun3();
xfun4();
xfun5();
check();
if ( __stack_chk_guard != v5 )
__stack_chk_fail();
return 0;
}
func1函数
__int64 __fastcall func1(__int64 a1)
{
__int64 result; // rax
signed int i; // [rsp+0h] [rbp-Ch]
for ( i = 0; i < 57; ++i )
{
*(_BYTE *)(a1 + i) ^= 0xDEu;//对字符串进行了简单的异或操作
result = (unsigned int)(i + 1);
}
return result;
}
func2函数
ar *xfun2()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[10];//从第十个字符开始操作
for ( i = 0; i < 10; ++i )
{
input[i + 10] ^= 0xBEu;
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func3
char *xfun3()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[20];
for ( i = 0; i < 10; ++i )
{
input[i + 20] ^= 0xEFu;//从第20个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
func4
char *xfun4()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[30];
for ( i = 0; i < 10; ++i )
{
input[i + 30] ^= 0xABu;//从第30个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func5
char *xfun5()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[40];
for ( i = 0; i < 16; ++i )
{
input[i + 40] ^= 0xEFu;//从第40个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
最后执行check函数
int check()
{
signed int i; // [rsp+Ch] [rbp-F4h]
int v2[58]; // [rsp+10h] [rbp-F0h]
memcpy(v2, &unk_100000ED0, 0xE0uLL);
for ( i = 0; i < 56; ++i )
{
if ( input[i] != v2[i] )
{
puts((const char *)err);
exit(0);
}
}
return puts(success);
}
回到上层函数发现了一系列的调用
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4; // [rsp+40h] [rbp-70h]
__int64 v5; // [rsp+A8h] [rbp-8h]
memset(input, 0, 0x64uLL);
memset(&v4, 0, 0x64uLL);
scanf("%s", &v4);
if ( strlen(&v4) != 56 ) //字符串长度
{
puts((const char *)err);
exit(0);
}
__strcpy_chk(input, &v4, 100LL);//将输入的字符串copy到对应的字符串
func1(input); //对输入的字符串进行了简单的异或操作
xfun1();
xfun2();
xfun3();
xfun4();
xfun5();
check();
if ( __stack_chk_guard != v5 )
__stack_chk_fail();
return 0;
}
func1函数
__int64 __fastcall func1(__int64 a1)
{
__int64 result; // rax
signed int i; // [rsp+0h] [rbp-Ch]
for ( i = 0; i < 57; ++i )
{
*(_BYTE *)(a1 + i) ^= 0xDEu;//对字符串进行了简单的异或操作
result = (unsigned int)(i + 1);
}
return result;
}
func2函数
ar *xfun2()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[10];//从第十个字符开始操作
for ( i = 0; i < 10; ++i )
{
input[i + 10] ^= 0xBEu;
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func3
char *xfun3()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[20];
for ( i = 0; i < 10; ++i )
{
input[i + 20] ^= 0xEFu;//从第20个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
func4
char *xfun4()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[30];
for ( i = 0; i < 10; ++i )
{
input[i + 30] ^= 0xABu;//从第30个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func5
char *xfun5()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[40];
for ( i = 0; i < 16; ++i )
{
input[i + 40] ^= 0xEFu;//从第40个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
最后执行check函数
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v4; // [rsp+40h] [rbp-70h]
__int64 v5; // [rsp+A8h] [rbp-8h]
memset(input, 0, 0x64uLL);
memset(&v4, 0, 0x64uLL);
scanf("%s", &v4);
if ( strlen(&v4) != 56 ) //字符串长度
{
puts((const char *)err);
exit(0);
}
__strcpy_chk(input, &v4, 100LL);//将输入的字符串copy到对应的字符串
func1(input); //对输入的字符串进行了简单的异或操作
xfun1();
xfun2();
xfun3();
xfun4();
xfun5();
check();
if ( __stack_chk_guard != v5 )
__stack_chk_fail();
return 0;
}
func1函数
__int64 __fastcall func1(__int64 a1)
{
__int64 result; // rax
signed int i; // [rsp+0h] [rbp-Ch]
for ( i = 0; i < 57; ++i )
{
*(_BYTE *)(a1 + i) ^= 0xDEu;//对字符串进行了简单的异或操作
result = (unsigned int)(i + 1);
}
return result;
}
func2函数
ar *xfun2()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[10];//从第十个字符开始操作
for ( i = 0; i < 10; ++i )
{
input[i + 10] ^= 0xBEu;
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func3
char *xfun3()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[20];
for ( i = 0; i < 10; ++i )
{
input[i + 20] ^= 0xEFu;//从第20个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
func4
char *xfun4()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[30];
for ( i = 0; i < 10; ++i )
{
input[i + 30] ^= 0xABu;//从第30个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func5
char *xfun5()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[40];
for ( i = 0; i < 16; ++i )
{
input[i + 40] ^= 0xEFu;//从第40个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
最后执行check函数
__int64 __fastcall func1(__int64 a1)
{
__int64 result; // rax
signed int i; // [rsp+0h] [rbp-Ch]
for ( i = 0; i < 57; ++i )
{
*(_BYTE *)(a1 + i) ^= 0xDEu;//对字符串进行了简单的异或操作
result = (unsigned int)(i + 1);
}
return result;
}
func2函数
ar *xfun2()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[10];//从第十个字符开始操作
for ( i = 0; i < 10; ++i )
{
input[i + 10] ^= 0xBEu;
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func3
char *xfun3()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[20];
for ( i = 0; i < 10; ++i )
{
input[i + 20] ^= 0xEFu;//从第20个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
func4
char *xfun4()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[30];
for ( i = 0; i < 10; ++i )
{
input[i + 30] ^= 0xABu;//从第30个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func5
char *xfun5()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[40];
for ( i = 0; i < 16; ++i )
{
input[i + 40] ^= 0xEFu;//从第40个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
最后执行check函数
ar *xfun2()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[10];//从第十个字符开始操作
for ( i = 0; i < 10; ++i )
{
input[i + 10] ^= 0xBEu;
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func3
char *xfun3()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[20];
for ( i = 0; i < 10; ++i )
{
input[i + 20] ^= 0xEFu;//从第20个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
func4
char *xfun4()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[30];
for ( i = 0; i < 10; ++i )
{
input[i + 30] ^= 0xABu;//从第30个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func5
char *xfun5()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[40];
for ( i = 0; i < 16; ++i )
{
input[i + 40] ^= 0xEFu;//从第40个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
最后执行check函数
char *xfun3()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[20];
for ( i = 0; i < 10; ++i )
{
input[i + 20] ^= 0xEFu;//从第20个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
func4
char *xfun4()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[30];
for ( i = 0; i < 10; ++i )
{
input[i + 30] ^= 0xABu;//从第30个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func5
char *xfun5()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[40];
for ( i = 0; i < 16; ++i )
{
input[i + 40] ^= 0xEFu;//从第40个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
最后执行check函数
char *xfun4()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[30];
for ( i = 0; i < 10; ++i )
{
input[i + 30] ^= 0xABu;//从第30个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
func5
char *xfun5()
{
char *result; // rax
signed int i; // [rsp+Ch] [rbp-4h]
result = &input[40];
for ( i = 0; i < 16; ++i )
{
input[i + 40] ^= 0xEFu;//从第40个字符开始操作
result = (char *)(unsigned int)(i + 1);
}
return result;
}
最后执行check函数
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-2-19 11:23
被wwzzww编辑
,原因: