陇原战疫2021网络安全大赛
陇原战”疫”2021网络安全大赛
最后还加了一道周末打的DASCTF比赛的re题目
findme
RC4加密
定位加密函数
在main函数之中是主逻辑
通过里面比较的函数定位到对应的位置,发现是引用了strcmp这个函数
可以看到这个函数可能被另外一个函数改动了,定位到这个函数,这一看到这个函数把strcmp指引到了另外一个函数
RC4算法
S盒的生成
它的S盒是利用用户输入的密钥生成S盒
利用密钥流进行加密的操作
RC4加密的函数
S盒的生成
S盒的生成的函数:sub_40164C((int)v9, (int)v7, v4);
对输入进行加密的函数:sub_401767((int)v8, (int)v6, v10);
所以将内存之中需要解密的数据dump出来
密文
需要解密的对象是:
1 | [0xb7,0x52,0x85,0xc1,0x90,0xe9,0x07,0xb8,0xe4,0x1a,0xc3,0xbd,0x1d,0x8e,0x85,0x46,0x00,0x21,0x44,0xaf,0xef,0x70,0x32,0xb5,0x11,0xc6] |
密钥
密钥是引用该函数输入的参数:
1 | SETCTF2021 |
和密文进行异或的数组
输入的字符串和图中的数进行异或运算就得到加密的结果,所以我们可以输入26个字符(这里输入的是flag{11111111111111111111}),得到加密的结果
利用这个加密的结果和输入的字符串对应进行异或运算,再和最后对比结果进行异或运算,就能够得到正确的flag
假flag异或运算得到的结果
脚本
1 | obj = [ 0x82, 0x7B, 0xB0, 0xE5, 0xBF, 0x9E, 0x4D, 0xDD, 0xBD, 0x1A, |
所以最后的flag是 SETCTF{Th1s_i5_E2_5tRcm9!}
这里如果使用RC4解密的问题是,最后对比的加密结果不能转换成char类型
power
这是一个arm汇编源文件
arm文件的编译
在linux之中使用 arm-linux-gnueabi-as power -o power.o 将其编译为elf文件,然后拖入ida32之中即可找到下面这段代码
1 | arm-linux-gnueabi-as power -o power.o |
AES加密
得到的代码我们能够看出这里使用的是AES加密 ,从图中标记的地方知道,虽然这个地方用的函数是cbc加密模式,但是从循环语句,每次加密16个字符(128位),把32个字符的输入分成了前16个和后16个字符各为一组数据,这样的加密模式显示是ECB模式
从上面我们能够知道加密的结果 hex类型的数据:1030a9254d44937bed312da03d2db9adbec5762c2eca7b5853e489d2a140427b
密钥是16字节的字符串:this_is_a_key!!!
偏移量是:this_is_a_key!!!
AES解密
故用在线解密软件得到解密的结果是:
最后的flag是 flag{y0u_found_the_aes_12113112}
EasyRE_Revenge
通过字符串定位到关键代码
先对输入的长度进行判断(32),再对输入进行变换
将跳转到另外一个函数,但是发现这个函数要去花指令之后才能反编译
加密输入,和加密结果进行对比的对象
1 | 0x42, 0xB0, 0xE8, 0xEE, 0x6C, 0xEE, 0xD0, 0x57, 0x32, 0x4B, |
Eat_something
得到了一个页面,这里关键代码再wasm文件之中
wasm文件:
wasm 是 WebAssembly 的二进制文件,包含二进制字节码。 写网站基本上是用 JavaScript, 当 JavaScript 速度不够快时,某个模块就可以用 C/C++ 编写,再编译成 wasm,供 JS 调用
页面网络之中得到wasm文件,感觉源文件是类似于字节码的东西
wasm文件的编译
将wasm文件转换成.o文件
使用[该文章](wasm一键转c - 『原创发布区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn)之中提供的软件将wasm的文件转换成.o格式的文件
定位关键函数
将文件放入到ida之中,关注它反编译得到的函数名称
定位到有特别含义的函数名称,定位到_w2c_checkright这个函数
密文
定位到w2c_memory 偏移为1024赋值的函数
提取出其中的数据
1 | enc = [0x86, 0x8B, 0xAA, 0x85, 0xAC, 0x89, 0xF0, 0xAF, 0xD8, 0x69, |
脚本
1 | enc = [0x86, 0x8B, 0xAA, 0x85, 0xAC, 0x89, 0xF0, 0xAF, 0xD8, 0x69, |
最后的flag是CETCTF{Th0nk_Y0u_DocTOr51}
easyre-DACTF2022
用PE打开发现是ASpack的壳,使用Stripper脱壳(工具在 看雪论坛的工具之中搜ASpack,其中有脱该壳的工具,也有手动脱壳的方法)
将脱壳得到的文件放入到ida32之中
主程序
首先判断了长度 和 前六个字符
判断的输入的主逻辑函数
动态提取dword_492940数组的过程
下断点
按照基本的要求,字符串的长度是42,前六个字符是DASCTF,构造输入
然后提取数据:
dword_492940:
1 | [0x38,0x78,0xdd,0xe8,0x00,0xaf,0xbf,0x3a,0x6b,0xfb,0xb8,0x0c,0x85,0x35,0x5c,0xad,0xe6,0x00,0xe0,0x8a,0x1d,0xbd,0x46,0xd2,0x2b,0x00,0x15,0x24,0xc6,0xad,0xa1,0xc9,0x7b,0x12,0x28,0x00,0x05,0x00,0x72,0x3e,0x10,0xa1,0x00,0x00] |
最后对比的数据:
1 | [0xC3,0x80,0xD5,0xF2,0x9B,0x30,0x0B,0xB4,0x55,0xDE,0x22,0x83,0x2f,0x97,0xB8,0x20,0x1D,0x74,0xd1,1,0x73,0x1A,0xB2,0xc8,0xc5,0x74,0xc0,0x5B,0xf7,0xF,0xD3,1,0x55,0xB2,0xA4,0xAE,0x7B,0xAC,0x5c,0x56,0xbc,0x23] |
脚本
1 | para = [0x38,0x78,0xdd,0xe8,0x00,0xaf,0xbf,0x3a,0x6b,0xfb,0xb8,0x0c,0x85,0x35,0x5c,0xad,0xe6,0x00,0xe0,0x8a,0x1d,0xbd,0x46,0xd2,0x2b,0x00,0x15,0x24,0xc6,0xad,0xa1,0xc9,0x7b,0x12,0x28,0x00,0x05,0x00,0x72,0x3e,0x10,0xa1,0x00,0x00] |
最后的flag:DASCTF{Welc0me-t0-j01n-SU-l0ve-suyug1eg1e}
参考文章: