当前位置: 首页 > news >正文

[网鼎杯 2020 青龙组]jocker

查壳无壳,直接进入IDA看,主函数如下

image-20260325220805297

简而言之,就是输入24个字符,然后再进行下一步的比对,看看其他调用的函数

char *__cdecl wrong(char *Str)
{char *result; // eaxint i; // [esp+Ch] [ebp-4h]for ( i = 0; i <= 23; ++i ){result = &Str[i];if ( (i & 1) != 0 )Str[i] -= i;elseStr[i] ^= i;}return result;
}
int __cdecl omg(char *Str)
{_DWORD dst[24]; // [esp+18h] [ebp-80h] BYREFint i; // [esp+78h] [ebp-20h]int v4; // [esp+7Ch] [ebp-1Ch]v4 = 1;qmemcpy(dst, &src_, sizeof(dst));for ( i = 0; i <= 23; ++i ){if ( Str[i] != dst[i] )v4 = 0;}if ( v4 == 1 )return puts("hahahaha_do_you_find_me?");elsereturn puts("wrong ~~ But seems a little program");
}

此处的encrypt函数静态分析下是不可反编译的

  if ( !VirtualProtect(encrypt, 0xC8u, 4u, &flOldProtect) )exit(1);

VirtualProtect函数的作用就是暂时更改encrypt函数的权限,提升为可写权限,从而实现代码自修改

image-20260325221344852

  for ( i = 0; i <= 186; ++i )*((_BYTE *)encrypt + i) ^= 0x41u;encrypt(Destination);finally(Destination);

这个亦或就是实现代码自修改的核心步骤
然后我们在IDA中动态调试起来,断点下在encrypt(Destination);

image-20260325221610424

看到上面这个情况,直接选中encrypt函数的区域按U取消定义恢复成最原始的十六进制数据,再按C转化为代码,最后按P创建函数

image-20260325222011497

修好后的代码如下

int __cdecl encrypt(char *Destination)
{_DWORD dst[19]; // [esp+1Ch] [ebp-6Ch] BYREFint v3; // [esp+68h] [ebp-20h]int i; // [esp+6Ch] [ebp-1Ch]v3 = 1;qmemcpy(dst, &src__0, sizeof(dst));for ( i = 0; i <= 18; ++i ){if ( (char)(Destination[i] ^ Buffer[i]) != dst[i] ){puts("wrong ~");v3 = 0;exit(0);}}puts("come here");return v3;
}
Buffer[] = "hahahaha_do_you_find_me?"
dst[] = [0xe, 0xd, 0x9, 0x6, 0x13, 0x5, 0x58, 0x56, 0x3e, 0x6, 0xc, 0x3c, 0x1f, 0x57, 0x14, 0x6b, 0x57, 0x59, 0xd]

得到一半flag:

flag{d07abccf8a410c

再找找另外一半flag

下面还有个finally函数,按照上面的步骤修复
修复后:

int __cdecl sub_40159A(char *Destination)
{__time32_t Seed; // eaxchar %tp&:[7]; // [esp+13h] [ebp-15h] BYREF__int16 v4; // [esp+1Ah] [ebp-Eh]int v5; // [esp+1Ch] [ebp-Ch]strcpy(%tp&:, "%tp&:");Seed = time(0);srand(Seed);v5 = rand() % 100;%tp&:[6] = 0;v4 = 0;if ( (%tp&:[(unsigned __int8)%tp&:[5]] != Destination[(unsigned __int8)%tp&:[5]]) == v5 )return puts("Really??? Did you find it?OMG!!!");elsereturn puts("I hide the last part, you will not succeed!!!");
}

这函数多少有些离谱,于是开始猜谜时刻

由于 flag 结尾一定是 "}",所以盲猜 v3 与某个数异或得到剩下的 flag

然后 v3 最后一位是 ":" 也就是 58,58 ^ '}' = 71,大胆猜测每一位都与 71 异或
exp:

ls =[0xe, 0xd, 0x9, 0x6, 0x13, 0x5, 0x58, 0x56, 0x3e, 0x6, 0xc, 0x3c, 0x1f, 0x57, 0x14, 0x6b, 0x57, 0x59, 0xd]
str="hahahaha_do_you_find_me?"
for i in range(len(ls)):print(chr(ls[i]^ord(str[i])),end='')
str2="%tp&:"
for i in range(len(str2)):print(chr(ord(str2[i])^71),end='')

flag:

flag{d07abccf8a410cb37a}
http://www.jsqmd.com/news/535446/

相关文章:

  • 腾讯推出小龙虾 AI,QClaw 零门槛打造你的本地智能助手
  • StructBERT对比实验:传统算法与深度学习的性能差异
  • Python setup.py编译失败?教你用3个命令+2个环境变量+1份诊断清单,10分钟定位97%的ABI/PyConfig/Linker错误
  • 基于ChatTTS .pt模型的AI辅助开发实战:从语音合成到生产环境部署
  • 从下单到发货:拆解一个图书电商系统的后端API调用链(顺序图视角)
  • 【仅开放72小时】MCP本地数据库连接器性能压测报告(QPS提升417%,P99延迟<12ms)及可复用的benchmark工具包
  • SpringBoot集成EasyAnimateV5-7b-zh-InP:电商商品动态展示系统开发
  • Cam2IP技术架构解析:将USB摄像头转变为网络摄像头的深度实践指南
  • SpringBoot实战:高效读取resources目录文件并实现安全下载
  • Windows Defender无法启动系统化解决方案:从诊断到恢复的全方位修复指南
  • leetcode383赎金信-哈希思想
  • Simulink玩转PMSM无感FOC:从IF强拖参数调试到开环切闭环的避坑指南
  • nRF24L01无线通讯模块发送失败排查指南:从引脚冲突到ACK配置
  • 如何解决医疗文档管理3大痛点?Seafile AI知识管理助手让效率提升300%
  • 私域复购机制方法拆解:从判断到落地的完整框架
  • ChatGPT Prompt Engineering实战指南:从原理到开发者最佳实践
  • ComfyUI快速部署:镜像一键启动,免配置玩转AI绘画
  • 如何利用AI技术修复模糊视频:3大实用方案让影像重获新生
  • [x-cmd] 一切 Web、桌面应用和本地工具皆可 CLI -opencli
  • 从DETR到TrackFormer:一文读懂Transformer在目标跟踪中的进化之路
  • VideoAgentTrek-ScreenFilter助力企业信息安全:自动过滤屏幕录像中的代码与文档泄露
  • cdh的hbase启动正常,无法list表
  • 20260325紫题训练 - Link
  • PlayIntegrityFix终极指南:2025年解决Android设备认证失败的完整方案
  • comsol 固体氧化物燃料电池仿真 考虑热应力的固体氧化物电池单体仿真 单流道非等温固体氧化...
  • 街边书店扎堆开,想赚钱别只卖书 靠卖座位和体验破局-佛山鼎策创局破局增长咨询
  • 计算机组成原理
  • LeetCode1170题解:预处理+二分查找
  • Airbnb算法面试高频题90天从入门到精通备战指南
  • DeepSeek-R1-Distill-Qwen-1.5B环境配置:vllm服务启动参数详解