前言
又遇到ollvm了
解混淆
可以直接用angr运行脚本去除除控制流平坦化,最好在ancoda等管理环境里面安装angr不然问题很多
https://github.com/Pure-T/deflat
去除前
去除后,它将多余的直接nop了
分析
主要加密区域位于匿名函数这一块,虽然也有些混淆但影响不大
func中的字符串为s[0]的md5加密,看了其它师傅的wp才知道也可以采用直接爆破
看着多,上下两块一样的,只是下一部分用于验证
lambda 函数是一个匿名函数(即,没有名称定义),它可以接受任意数量的参数,但与普通函数不同,它只计算并返回一个表达式。 lambda 函数包括三个元素: 关键字lambda:与普通函数中def 类似 参数:支持传递位置和关键字参数,与普通函数一样
wp
#include"stdio.h"
int main(){
unsigned int enc[] =
{
0xF3, 0x2E, 0x18, 0x36, 0xE1, 0x4C, 0x22, 0xD1, 0xF9, 0x8C,
0x40, 0x76, 0xF4, 0x0E, 0x00, 0x05, 0xA3, 0x90, 0x0E, 0xA5
};
int key=0;
int s[20]={0};
//s[i-1]%7 +s[i]) ^(((s[i-1]^18) *3 +2))
//s[i] =(enc[i-1]^(((s[i-1]^18) *3 +2)))-s[i-1]%7
for(int k=0;k<128;k++){
s[0] =k;
for(int i=1;i<21;i++){
s[i] =(enc[i-1]^((s[i-1]^18) *3 +2))-s[i-1]%7&0xff; //&0xff因为原类型是字符类型,找半天才发现是这
putchar(s[i-1]);
}
putchar(s[20]);
putchar('\n');
}
return 0;
}
flag{mY-CurR1ed_Fns}