来自buu上的红帽杯的试题
easy re
放入了ida进行分析,打开后shift+f12进行关键字的查找,找到了主函数
1 | signed __int64 sub_4009C6() |
可以看到第一次的异或
1 | if ( v2 == 36 ) |
一共和36个字符进行比较,跟输入的v17的进行比较,需要输入的v53[i]^i等于上面有的v17到v52可以写出脚本
1 | #include<stdio.h> |
得出来Info:The first four chars are `flag`得出来了一个信息,然后继续向下看
1 | memset(&v56, 0,64uLL); |
1 | .rodata:00000000004A23A8 aVm0wd2vhuxhtwg db 'Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xV' |
不难看出是经过了10次的base64,变成了如下的密文,所以本人直接在网上解密了10次,emmm,之后会写个分析base64和解密base64的exp的
得出来是一个看雪的网址:https://bbs.pediy.com/thread-254172.htm
shift+f7发现在.fini还存在一个函数,里面存放的是程序运行main函数之后所运行的函数,而.init是在main函数之前的
1 | unsigned __int64 sub_400D35() |
进行分析,一共是两次异或,可以看出来v6=v3且102为f 103为g推断为上面的提示字符串flag 和内存中给的数据反向解密
1 | #include<stdio.h> |
xx
打开ida,shift+12找到了主函数
1 | int __fastcall sub_1400011A0(__int64 a1, __int64 a2) |
刚开始判断了字符串的长度为19
v5为qwertyuiopasdfghjklzxcvbnm1234567890的首地址,这里猜测v9为密钥一共是4位的和code有关,v12为v5字符串的长度36,v10为v9在v5中的位置相当于个数组,v13等于36,v4与v8与v9的密钥有关系,在v4的末尾加了\0,进行了一个取字符的一个循环,可以看到这个Golden ratio知道是TEA算法的分支
1 | _BYTE *__fastcall sub_140001AB0(__int64 a1, unsigned __int64 a2, unsigned __int8 *a3, unsigned __int64 *a4) |
取输入的前4个字符作为xxtea加密的密钥之后进行xxtea加密,接着进行位置置换操作,然后又进行了以3个为一组的异或,由于没见过什么xxtea的算法(这里还是vct师傅咔嚓咔嚓告诉我的这个算法)于是学习了一下(在这个题结束的时候写了一下)
1 | v17 = Size; |
我们需要解出来在xxtea加密后的那一串数值
00000060E7AFFB28 CE BC 40 6B 7C 3A 95 C0 EF 9B 20 20 91 F7 02 35
00000060E7AFFB38 23 18 02 C8 E7 56 56 FA
1 | #include<stdio.h> |
进行xxtea解密代码
1 | #include <stdio.h> |
TEA系列(微型加密算法)
特征
含有Golden Ratio=0x9E3779B9
密钥长度为16byte(128位)
TEA
1 |
|
XTEA
1 |
|
XXTEA
1 |
|
TEA in CTF
例题:Tea相关
认清三种TEA加密
解密代码
1 |
|
childRE
放入ida中,shift+f12找到了主函数
1 | signed __int64 sub_140001610() |
UnDecorateSymbolName函数反修饰指定已修饰的 C++ 符号名,使用方法:
1 | DWORD WINAPI UnDecorateSymbolName( |
DecoratedName [输入]已修饰的 C++ 符号名。此名称能以始终为问号 (?) 的首字符鉴别。UnDecoratedName [输出]指向字符串缓冲区的指针,该缓冲区接收未修饰的名字。UndecoratedLength [输入]UnDecoratedName 缓冲区的大小,为字符数。Flags [输入]用于反修饰已修饰名称的方式的选项。此参数能为零或更多个下列值。
1 | do |
可以看到v10对应了两个地址0x140003478与0x140003438与0x1400033A0进行了比较所以以可反写出来
1 | #include<stdio.h> |
得出来被反修饰的字符串根据vct师傅给的一个网址将 result的值作为参数放入函数UnDecorateSymbolName,这是MSVC++中关于名称解析的一个函数,目前没有找到它的“反函数”,也就是说这里求逆需要选手自行了解名称粉碎的规则,从而求逆。学习链接 https://www.cnblogs.com/victor-ma/p/4184806.html
得到?My_Aut0_PWN@R0Pxx@@AAEPADPAE@Z
1 | #include<stdio.h> |
Z0@tRAEyuP@xAAA?M_A0_WNPx@@EPDP然后md5进行加密一下