签到完了就一个小题,本身不繁杂但是有点长。

先是要求输入一个串然后逐位与0x1f异或后检查密钥是否正确

char __cdecl sub_401A70(char *Str, char *Str1)
{char v3; // [esp+0h] [ebp-E4h]signed int i; // [esp+D0h] [ebp-14h]signed int v5; // [esp+DCh] [ebp-8h]__CheckForDebuggerJustMyCode(&unk_40B027);v5 = strlen(Str);for ( i = 0; i < v5; ++i )Str1[i] += Str[i] ^ 0x1F;if ( !strcmp(Str1, "DH~mqqvqxB^||zll@Jq~jkwpmvez{") )c_printf("充值成功.\n", v3);elsec_printf("Error!\n", v3);return *Str1;
}

然后开始处理这个密钥:

先循环密钥到256位长

int __cdecl sub_401800(int a1, int a2, int a3)
{int result; // eaxint j; // [esp+D0h] [ebp-14h]int i; // [esp+DCh] [ebp-8h]result = __CheckForDebuggerJustMyCode(&unk_40B027);if ( a3 <= 256 ){for ( i = 0; i < 256; ++i ){*(_BYTE *)(i + a1) = *(_BYTE *)(a2 + i % a3);result = i + 1;}}if ( a3 > 256 )    //后边没用,不够256{for ( j = 0; j < 256; ++j ){*(_BYTE *)(j + a1) = *(_BYTE *)(j + a2);result = j + 1;}}return result;
}

再生成第2个密钥(值为0-255)

int __cdecl sub_401780(int a1)
{int result; // eaxint i; // [esp+D0h] [ebp-8h]result = __CheckForDebuggerJustMyCode(&unk_40B027);for ( i = 0; i < 256; ++i ){*(_BYTE *)(i + a1) = i;result = i + 1;}return result;
}

根据第1个密钥将第2个密钥位置交换后作为解密密钥

int __cdecl sub_4018E0(int a1, int a2)
{int result; // eaxint i; // [esp+D0h] [ebp-2Ch]char v4; // [esp+EBh] [ebp-11h]int v5; // [esp+F4h] [ebp-8h]result = __CheckForDebuggerJustMyCode(&unk_40B027);v5 = 0;for ( i = 0; i < 256; ++i ){v5 = (*(unsigned __int8 *)(i + a2) + v5 + *(unsigned __int8 *)(i + a1)) % 256;v4 = *(_BYTE *)(i + a1);*(_BYTE *)(i + a1) = *(_BYTE *)(v5 + a1);*(_BYTE *)(v5 + a1) = v4;result = i + 1;}return result;
}

最后次读入的flag用密钥加密后存入enflag.txt文件。由于这里只对处理后的密钥与flag作异或运算,所以加密与解密相同,可直接用来解密

int __cdecl sub_4015E0(int a1, FILE *in_file, FILE *out_file)
{int result; // eaxchar v4; // [esp+103h] [ebp-35h]char i; // [esp+11Bh] [ebp-1Dh]int v6; // [esp+124h] [ebp-14h]int v7; // [esp+130h] [ebp-8h]__CheckForDebuggerJustMyCode(&unk_40B027);v7 = 0;v6 = 0;for ( i = fgetc(in_file); ; i = fgetc(in_file) ){result = i;if ( i == -1 )break;v7 = (v7 + 1) % 256;v6 = (v6 + *(unsigned __int8 *)(v7 + a1)) % 256;v4 = *(_BYTE *)(v7 + a1);*(_BYTE *)(v7 + a1) = *(_BYTE *)(v6 + a1);*(_BYTE *)(v6 + a1) = v4;fputc(*(_BYTE *)((*(unsigned __int8 *)(v6 + a1) + *(unsigned __int8 *)(v7 + a1)) % 256 + a1) ^ i, out_file);}return result;
}

先求出密钥:

str1 = b"DH~mqqvqxB^||zll@Jq~jkwpmvez{"
str0 = b''
for i in str1:str0 +=bytes([i^0x1f])
print(str0)

再将enflag.txt文件更名为flag.txt后运行一次程序即可。

做出你的选择:
1.充钱
2.退出
1请输入您的密钥:[Warnning]Access_Unauthorized
充值成功.加密成功!
您的充值金额不足。C:\ctf.show.reverse\re2>type enflag.txt
flag{RC4&->ENc0d3F1le}

生成的enflag.txt文件即为flag

或者用自己重写一遍程序。

[ctf.show.reverse] re2相关推荐

  1. [ctf.show.reverse] 红包六

    下来是个压缩包,解开后一个原码,解码后是notflag,发现压缩包有5k大而解出的java文件只有1k,显然包里还有内容未解出 用010打开包发现有两个EzJar.class文件,手工切出解压 imp ...

  2. [ctf.show.reverse] 吃鸡杯 ezmore,有手就行,EzAutoRe

    ezmore 动调的题,跟进去在4019d6下断点看比较情况得到neft输入后得到flag组成提示 有手就行 一上来就猜入口是_main然后解到一个fake s2 = [99,23,113,2,106 ...

  3. [ctf.show.reverse] 月饼杯 re1_西北望乡、re2_归心、re3_若无月

    re1_西北望乡 主程序很容易看明白,格式是flag{....}长45,然后把3,6,13,36拿出来作为系数,这些字符每5个一组分别乘系数后的和给定了.然后就是怎么解了. if ( strlen(f ...

  4. [ctf.show.reverse] 来一个派森,好好学习天天向上

    来一个派森 根据名字来看是一个编译成exe的python程序, 用py \tools\pyinstxtractor.py checkme.exe 将其解包, 然后将struct文件头部E3前的部分插入 ...

  5. XCTF-攻防世界CTF平台-Reverse逆向类——52、handcrafted-pyc(Python的pyc文件逆向)

    下载题目附件之后,查看附件52: 发现它就是一个Python代码文件 #!/usr/bin/env python # -*- coding: utf-8 -*-import marshal, zlib ...

  6. [ctf.show.reverse] 吃瓜杯 签层饼,Tea_tube_pot

    签层饼 真有一千层函数呀,沿着输入存入的两个变量找,找到3个函数: 主函数给出了flag的组织方式, check1说number2<882408, check2说number1 = number ...

  7. [ctf.show.reverse] re3

    逻辑很简单,但用python写的话由于python没有长度限制,直接用会有些问题需要解决.所以用gdb跟一下. v7 = 0x50;v8 = 0xFAE3;v9 = 0xD7D3F7B;v10 = 0 ...

  8. XCTF-攻防世界CTF平台-Reverse逆向类——56、tar-tar-binks(Mac平台下的64位动态链接共享库.dylib逆向)

    目录标题 一.解压缩 二.查看文件 三.分析程序 四.程序主要逻辑: 五.逆向思路: 步骤一: 步骤二: 六.解密代码: 题目提供了两个文件flag.tar和libarchive.dylib 一.解压 ...

  9. XCTF-攻防世界CTF平台-Reverse逆向类——57、re5-packed-movement(linux32位ELF文件、movfuscator代码混淆)

    目录标题 方法一:搜索字节序列 方法二:IDC脚本 方法三:Python脚本: 方法四:bgrep工具 先查看文件信息:   是linux下的32位ELF文件,且被加了UPX的壳   下载最新版的UP ...

最新文章

  1. Git使用汇总之暂存区工作区撤销和删除
  2. java accessablity_java连接access数据库----简单demo
  3. word2007导出pdf带书签
  4. 软件工程:可行性研究
  5. 聚类分析软件测试,基于复杂网络的软件测试路径聚类分析-计算机工程与应用.PDF...
  6. 骁龙855音频解码芯片_小米10、小10 Pro详细对比:骁龙865最强悍5G旗舰手机
  7. Android-深色模式篇
  8. 为什么计算机网络使用数字信号,计算机网络数字电子技术的作用
  9. Anybackup-7.0.8.0系统配置-授权管理
  10. 洛谷 P1008三连击 C语言
  11. 微信图片去除马赛克_照片怎么去水印,去除图片水印的简朴方式,微信公众号引流的21种方法...
  12. Adam优化算法中的指数移动平均
  13. 《程序员十二时辰》,居然是这样的!内容过于真实 ...
  14. 服务器装系统提示获取分区失败,u盘装系统时获取硬盘分区失败怎么办
  15. 美服测试服无法连接验证服务器,美服1.10 test服务器开了,我的一些测试心得
  16. 《腾讯数字生活报告2019》发布,互联网时代新马斯洛需求金字塔预示什么?
  17. Java学习:IT行业是否已经开始饱和或者过剩?
  18. Android 10.0 自定义开机向导app
  19. direct wifi 投屏_direct wifi 投屏_告别Wifi直接投 AOC无线投屏显示器轻松用
  20. 【c#系列】PDF进行操作-浏览、分割、合并、插入、删除(2)

热门文章

  1. python什么为假_python对于真和假的定义
  2. Mybatis从入门到精通二(入门详解)
  3. 会话及会话技术、Cookie对象、Session对象 详解
  4. 如何使用python-docx第三方库,操作读写doc Word文档,快速制作数据报表
  5. 删除对象属性的三种方法
  6. matlab中sym与syms的对比
  7. 技术2---swagger2
  8. swagger2 使用教程
  9. 国家邮政局出马,菜鸟顺丰大战落幕
  10. python异常模块raise的概念以及基本用法