首页
社区
课程
招聘
[原创]南邮ctf逆向你大概需要一个优秀的mac
发表于: 2019-2-19 10:29 5687

[原创]南邮ctf逆向你大概需要一个优秀的mac

2019-2-19 10:29
5687
这里只能用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编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (3)
雪    币: 327
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
牛逼
2019-2-21 12:10
0
雪    币: 8447
活跃值: (5041)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
3
谢谢大神,解决了
最后于 2019-2-22 12:08 被v0id_编辑 ,原因:
2019-2-21 12:53
0
雪    币: 7285
活跃值: (780)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
4
2019-2-21 16:36
0
游客
登录 | 注册 方可回帖
返回
//