文章目录

  • baby.bc
    • 编译
    • ida分析
    • Rc4
      • 初始化
      • 加密
    • Base64变形
    • 结果数组
    • 解密代码:
  • 总结

baby.bc

编译

llc chall.bc -o chall.s


然后把.s(汇编代码搞成可执行程序)在进行编译的时候出现了如下报错:

 gcc -c chall.s -o hello

报错如下:

chall.s: Assembler messages:
chall.s:4: Error: unknown pseudo-op: `.def'
chall.s:5: Error: unknown pseudo-op: `.scl'
chall.s:6: Error: Missing symbol name in directive
chall.s:7: Error: unknown pseudo-op: `.endef'
chall.s:8: Error: expected symbol name
chall.s:9: Error: expected symbol name
chall.s:11: Error: unknown pseudo-op: `.def'
chall.s:12: Error: unknown pseudo-op: `.scl'
chall.s:13: Error: Missing symbol name in directive
chall.s:13: Error: unrecognized symbol type "32"
chall.s:14: Error: unknown pseudo-op: `.endef'
chall.s:30: Error: register save offset not a multiple of 8
chall.s:105: Error: unknown pseudo-op: `.def'
chall.s:106: Error: unknown pseudo-op: `.scl'
chall.s:107: Error: Missing symbol name in directive
chall.s:107: Error: unrecognized symbol type "32"
chall.s:108: Error: unknown pseudo-op: `.endef'
chall.s:122: Error: register save offset not a multiple of 8
chall.s:196: Error: unknown pseudo-op: `.def'
chall.s:197: Error: unknown pseudo-op: `.scl'
chall.s:198: Error: Missing symbol name in directive
chall.s:198: Error: unrecognized symbol type "32"
chall.s:199: Error: unknown pseudo-op: `.endef'
chall.s:331: Error: unknown pseudo-op: `.def'
chall.s:332: Error: unknown pseudo-op: `.scl'
chall.s:333: Error: Missing symbol name in directive
chall.s:333: Error: unrecognized symbol type "32"
chall.s:334: Error: unknown pseudo-op: `.endef'
chall.s:350: Error: register save offset not a multiple of 8
chall.s:352: Error: register save offset not a multiple of 8
chall.s:483: Fatal error: bad .section directive: want a,w,x,M,S,G,T in string

使用windows下的llvm结果成这样,所以的话,还是配了一下linux下的llvm
编译之后称为elf文件,拖进ida查看

ida分析

Rc4

秘钥

unsigned char ida_chars[] =
{0x11, 0x45, 0x14, 0x61, 0x76, 0x61, 0x6C, 0x6F, 0x6E, 0x2C, 0x79, 0x79, 0x64, 0x73
};

初始化

_int64 __fastcall func_114514(__int64 a1, __int64 a2, int a3)
{int s[257]; // [rsp+0h] [rbp-430h] BYREFunsigned int v5; // [rsp+404h] [rbp-2Ch]__int64 v6; // [rsp+408h] [rbp-28h]int v7; // [rsp+410h] [rbp-20h]int v8; // [rsp+414h] [rbp-1Ch]__int64 v9; // [rsp+418h] [rbp-18h]int v10; // [rsp+424h] [rbp-Ch]int i; // [rsp+428h] [rbp-8h]int j; // [rsp+42Ch] [rbp-4h]v9 = a1;v6 = a2;v7 = a3;v10 = 0;memset(s, 0, 0x400uLL);for ( i = 0; i < 256; ++i ){*(_DWORD *)(v9 + 4LL * i) = i;              // 初始化v9数组(状态向量S)s[i] = *(unsigned __int8 *)(v6 + i % v7);   // 使用dest数组初始化是s数组(临时向量T)}for ( j = 0; j < 256; ++j ){v10 = (unsigned __int8)(LOBYTE(s[j]) + *(_BYTE *)(v9 + 4LL * j) + v10);// 取状态向量,临时向量以及 v10和进行低八位处理赋值给v10,v10作为一个下标数组v8 = *(_DWORD *)(v9 + 4LL * j);             // v8为临时变量*(_DWORD *)(v9 + 4LL * j) = *(_DWORD *)(v9 + 4LL * v10);*(_DWORD *)(v9 + 4LL * v10) = v8;}return v5;
}

加密

_int64 __fastcall func_1919810(__int64 a1, __int64 a2, int a3)
{unsigned int v4; // [rsp+0h] [rbp-2Ch]int i; // [rsp+1Ch] [rbp-10h]int v6; // [rsp+20h] [rbp-Ch]int v7; // [rsp+24h] [rbp-8h]unsigned __int8 v8; // [rsp+2Bh] [rbp-1h]v7 = 0;LOBYTE(v6) = 0;for ( i = 0; i < a3; ++i ){v7 = (v7 + 1) % 256;v6 = (unsigned __int8)(*(_BYTE *)(a1 + 4LL * v7) + v6);v8 = *(_DWORD *)(a1 + 4LL * v7);*(_DWORD *)(a1 + 4LL * v7) = *(_DWORD *)(a1 + 4LL * v6);*(_DWORD *)(a1 + 4LL * v6) = v8;*(_BYTE *)(a2 + i) ^= *(_BYTE *)(a1 + 4LL * (unsigned __int8)(*(_BYTE *)(a1 + 4LL * v6) + *(_BYTE *)(a1 + 4LL * v7)));}return v4;
}

Base64变形

这个变形是属于什么变形呢,它直接算出下标,利用下标进行减法(也就是说没有拿着下标去找base64数组取值)

_int64 __fastcall HSencode(__int64 a1, int a2, __int64 a3)
{unsigned int v4; // [rsp+0h] [rbp-28h]int v5; // [rsp+4h] [rbp-24h]int v6; // [rsp+20h] [rbp-8h]int v7; // [rsp+24h] [rbp-4h]if ( a2 % 3 )v5 = 4 * (a2 / 3 + 1);elsev5 = 4 * (a2 / 3);v7 = 0;v6 = 0;while ( v7 < v5 - 2 ){*(_BYTE *)(a3 + v7) = (((int)*(unsigned __int8 *)(a1 + v6) >> 2) & 0x3F) + 0x3D;*(_BYTE *)(a3 + v7 + 1) = (((int)*(unsigned __int8 *)(a1 + v6 + 1) >> 4) & 0xF | (16 * (*(_BYTE *)(a1 + v6) & 3)))+ 61;*(_BYTE *)(a3 + v7 + 2) = (((int)*(unsigned __int8 *)(a1 + v6 + 2) >> 6) & 3 | (4 * (*(_BYTE *)(a1 + v6 + 1) & 0xF)))+ 61;*(_BYTE *)(a3 + v7 + 3) = (*(_BYTE *)(a1 + v6 + 2) & 0x3F) + 61;v6 += 3;v7 += 4;}if ( a2 % 3 == 1 ){*(_BYTE *)(a3 + v7 - 2) = '=';}else if ( a2 % 3 != 2 ){return v4;}*(_BYTE *)(a3 + v7 - 1) = '=';return v4;
}

结果数组

unsigned char bytes_114514[] =
{0x40, 0x42, 0x64, 0x78, 0x52, 0x54, 0x62, 0x52, 0x42, 0x62, 0x6A, 0x49, 0x56, 0x66, 0x60, 0x50, 0x45, 0x79, 0x71, 0x65, 0x5E, 0x5C, 0x5E, 0x5C, 0x7C, 0x63, 0x63, 0x7C, 0x4A, 0x52, 0x75, 0x62, 0x61, 0x47, 0x4C, 0x79, 0x74, 0x48, 0x65, 0x52, 0x49, 0x40, 0x6A, 0x67, 0x4E, 0x65, 0x67, 0x48, 0x55, 0x5B, 0x4D, 0x79, 0x79, 0x5D, 0x3D, 0x3D
};

我们需要把结果减去0x3D,然后拿着下标取出base64数据,然后进行base64解码,紧接着再进行RC4解密

解密代码:

#include <iostream>
#include<Windows.h>
using namespace std;
void rc4_init(unsigned char* s, unsigned char* key, unsigned long Len)
{int i = 0, j = 0;char k[256] = { 0 };unsigned char tmp = 0;for (i = 0; i < 256; i++){s[i] = i;k[i] = key[i % Len];}for (i = 0; i < 256; i++){j = (j + s[i] + k[i]) % 256;tmp = s[i];s[i] = s[j];//交换s[i]和s[j]s[j] = tmp;}
}void rc4_crypt(unsigned char* s, unsigned char* Data, unsigned long Len)
{int i = 0, j = 0, t = 0;unsigned long k = 0;unsigned char tmp;for (k = 0; k < Len; k++){i = (i + 1) % 256;j = (j + s[i]) % 256;tmp = s[i];s[i] = s[j];//交换s[x]和s[y]s[j] = tmp;t = (s[i] + s[j]) % 256;Data[k] ^= s[t];}
}int main()
{const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";unsigned char ida_charsa[] ={0x40, 0x42, 0x64, 0x78, 0x52, 0x54, 0x62, 0x52, 0x42, 0x62,0x6A, 0x49, 0x56, 0x66, 0x60, 0x50, 0x45, 0x79, 0x71, 0x65,0x5E, 0x5C, 0x5E, 0x5C, 0x7C, 0x63, 0x63, 0x7C, 0x4A, 0x52,0x75, 0x62, 0x61, 0x47, 0x4C, 0x79, 0x74, 0x48, 0x65, 0x52,0x49, 0x40, 0x6A, 0x67, 0x4E, 0x65, 0x67, 0x48, 0x55, 0x5B,0x4D, 0x79, 0x79, 0x5D};for (int i = 0; i < 54; i++) {char c = base[ida_charsa[i] - 0x3D];cout << c;}unsigned char ida_chars[] ={0x0C,0x59,0xFB,0x55,0x79,0x55,0x16,0x5B,0x4C,0x66,0x98,0xD3,0x23,0xCD,0x28,0x85,0xF8,0x5F,0xFE,0x69,0xBF,0x35,0x5E,0x25,0x90,0xA3,0xFC,0xDC,0xBA,0x15,0x30,0x3B,0x6A,0x46,0x8A,0x8B,0x61,0xE4,0x3C,0xF2 };char key[256] = { 0x11, 0x45, 0x14, 0x61, 0x76, 0x61, 0x6C, 0x6F, 0x6E, 0x2C,0x79, 0x79, 0x64, 0x73 };unsigned char s[256] = { 0 },s2[256] = { 0 };rc4_init(s, (unsigned char*)key, strlen(key));for (int i = 0; i < 256; i++)//用s2[i]暂时保留经过初始化的s[i],很重要的!!!{s2[i] = s[i];}cout << endl;rc4_crypt(s2, (unsigned char*)ida_chars, 40);for (int i = 0; i < 40; i++) {cout << char(ida_chars[i]);}}
DFn7VXlVFltMZpjTI80ohfhf/mm/NV4lkKP83LoVMDtqRoqLYeQ88g

总结

  1. RC4
  2. 改版base64
  3. linux系统的llvm

MoeCTF 2021Re部分------baby_bc相关推荐

  1. MoeCTF 2021Re部分------大佬请喝咖啡,A_game

    文章目录 大佬请喝咖啡 反编译 解释\u: z3解码 A_game 数独题: 这里判断行数据是1~9: 这里判断列数据是1~9: 9*9数独阵分为9个3*3方阵,每个方阵数据1~9 进行异或magic ...

  2. MoeCTF 2021Re部分------PE

    文章目录 ida分析 算出秘钥 解密脚本 总结 ida分析 这个题呢,目的是用附件异或一串秘钥得出一个exe,然后运行exe即可得出flag,然后秘钥主要藏在PE文件头中 算出秘钥 说实话,这题有点脑 ...

  3. MoeCTF 2021Re部分------ez(递归转循环)

    文章目录 ida 分析 总结 ida for ( i = 0; i <= 75; ++i ){Character = fuck(i * i) ^ flag[i];putchar(Characte ...

  4. MoeCTF 2021Re部分------Midpython.exe

    文章目录 Midpython.exe marshal和dis库配合: 手动改为py 解密脚本 总结: Midpython.exe python代码写成的exe,进行反编译,先搞成pyc,然后把pyc反 ...

  5. MoeCTF 2021Re部分------time2go

    文章目录 time2go keypatch使用 main_fun2(后一半) 总结: time2go keypatch使用 (ida中的keypatch插件)考点主要是玩keypatch,把sleep ...

  6. MoeCTF 2021Re部分------RedC4Bomb

    文章目录 去花后 keys(key) init(key, v9, (int)key); 脚本 总结: 去花后 只需要管是三个函数keys(key) init(key, v9, (int)key); e ...

  7. MoeCTF 2021Re部分------Algorithm_revenge

    文章目录 ida分析 脚本分析 生成map地图 数据累加 提醒:绝对不是取出每行最大值相加(特别注意当前元素的上行元素的左中右这个限制),然后把所在列坐标进行存储 挑出50行最大值列坐标 总结 ida ...

  8. 【moeCTF题解-0x01】Reverse

    title: [moeCTF题解-0x01]Reverse categories: CTF moeCTF tags: CTF [moeCTF题解-0x01]Reverse 一个全新的领域 [moeCT ...

  9. 【moeCTF题解-0x04】Crypto

    title: [moeCTF题解-0x04]Crypto categories: CTF moeCTF tags: CTF Python Crypto [moeCTF题解-0x04]Crypto 有多 ...

最新文章

  1. 计算项目中的代码行数:Count the Lines of Code (LOC)
  2. 高防御服务器与高防御IP之间的关系
  3. 每天一道LeetCode-----买卖商品问题,计算最大利润,分别有一次交易,两次交易,多次交易的情况
  4. 数据基本类型以及相关举例
  5. @aspect注解_Spring自定义注解玩法大全,从入门到放弃
  6. Python菜鸟入门:day03运算符
  7. r语言 四格画图_R绘图基础(一)
  8. Goland的常用快捷键
  9. Ubuntu下安装php7.1的gd,mysql,pdo_mysql扩展库
  10. 万能启动利器FbinstTool引导工具教程
  11. C语言编程题必须运行吗,全国计算机二级c语言的的操作题一定要运行吗?
  12. C#通过WebBrowser对网页截图
  13. 树莓派 网络附加存储NAS系统和USB外接硬盘文件服务器
  14. 360木马公司之流氓本色
  15. python实现千牛客服自动回复语_千牛客服自动回复话术
  16. OpenCV——PS 滤镜, 浮雕效果
  17. python面向对象练习——飞机大战
  18. 小猪的Python学习之旅 —— 14.项目实战:抓取豆瓣音乐Top 250数据存到Excel中
  19. 拐道交叉的css3动画,CSS3图片翻转动画技术详解
  20. python打卡以及Linux自动运行python文件

热门文章

  1. 7000更换控制器电源步骤_恒温恒湿试验箱几大故障的检查步骤及解决方法说明...
  2. ML:MLOps系列讲解之《MLOps原则—迭代增量过程/自动化/持续部署/版本控制/实验跟踪/测试/监控/“ML成绩”系统/可再现性/松散耦合架构(模块化)/基于ML的软件交付指标等》解读
  3. Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略
  4. 成功解决ModuleNotFoundError: No module named 'keras_retinanet'
  5. DL之DNN:利用MultiLayerNet模型【6*100+ReLU+SGD】对Mnist数据集训练来理解过拟合现象
  6. 成功解决gensim\utils.py:1209: UserWarning: detected Windows; aliasing chunkize to chunkize_serial warn
  7. RK3288 添加USB转虚拟串口设备
  8. vaddin使用技巧
  9. php获取上传多个文件缺失
  10. ogre3D学习基础10 -- 键盘控制与鼠标控制(直接控制)