getit

使用ida打开,f5反编译main函数
image

分析代码

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char v3; // al
  int i; // [rsp+0h] [rbp-40h]
  int j; // [rsp+4h] [rbp-3Ch]
  FILE *stream; // [rsp+8h] [rbp-38h]
  char filename[24]; // [rsp+10h] [rbp-30h] BYREF
  unsigned __int64 v9; // [rsp+28h] [rbp-18h]

  v9 = __readfsqword(0x28u); //栈保护相关
  //关键:字符串s处理生成t的部分内容
  for ( i = 0; i < strlen(s); ++i )
  {
    if ( (i & 1) != 0 ) //i为奇数
      v3 = 1;
    else  //i为偶数
      v3 = -1;
    *(&t + i + 10) = s[i] + v3; //t的偏移位置赋值
  }
  //文件操作:写入临时文件后删除(干扰项)
  strcpy(filename, "/tmp/flag.txt"); 
  stream = fopen(filename, "w");
  fprintf(stream, "%s\n", u);
  for ( j = 0; j < strlen(&t); ++j )
  {
    fseek(stream, p[j], 0);
    fputc(*(&t + p[j]), stream);
    fseek(stream, 0LL, 0);
    fprintf(stream, "%s\n", u);
  }
  fclose(stream);
  remove(filename);
  return 0;
}

关键在于分析s到t的变换规则,然后还原t

在ida里面选择"Segments"的.data,查看s和t的初始值
image
猜测中间的32个问号是由s经过变换后的内容

根据代码可以看出加密逻辑
i为偶数,s[i]-1
i为奇数,s[i]+1
结果写进t的[i+10]的位置(因为前十个字符已经确定了SharifCTF{)

示例:
s的前两个字符'c6',对应索引的01
i=0(偶数):c的ascll为99-->99-1=98-->b
i=1(奇数):6的ascll为54-->54+1=55-->7

编写脚本

def crack_sharifctf_flag():
    s = "c61b68366edeb7bdce3c6820314b7498"
    t = list("SharifCTF{????????????????????????????????}")
    for i in range(len(s)):
        t[i+10] = chr(ord(s[i]) + (1 if i&1 else -1))
    return ''.join(t)

print(crack_sharifctf_flag())

image

posted @ 2026-03-06 21:02  大雪深埋  阅读(15)  评论(0)    收藏  举报
// 正常配置 window.cnblogsConfig = { links: {}, }; // 友链页配置 window.cnblogsConfig.links.page = [ { title: '友情链接', // 标题 icon: 'icon-lianjie', // iconfont style: 'color: #a78bfa;', links: [ { name: '2_haowen_V', // 昵称 introduction: 'IT技术类博客', // 简介 avatar: 'https://pic.cnblogs.com/face/1334215/20180504110551.png', // 头像 url: 'https://www.hehaowen.com.cn/' // 友链地址 }, ] }, ];