[SUCTF2019]hardcpp

前言

又遇到ollvm了

解混淆

可以直接用angr运行脚本去除除控制流平坦化,最好在ancoda等管理环境里面安装angr不然问题很多
https://github.com/Pure-T/deflat
去除前
[SUCTF2019]hardcpp_第1张图片
去除后,它将多余的直接nop了
[SUCTF2019]hardcpp_第2张图片

分析

主要加密区域位于匿名函数这一块,虽然也有些混淆但影响不大
[SUCTF2019]hardcpp_第3张图片
func中的字符串为s[0]的md5加密,看了其它师傅的wp才知道也可以采用直接爆破
[SUCTF2019]hardcpp_第4张图片
看着多,上下两块一样的,只是下一部分用于验证

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}

你可能感兴趣的:(逆向,buu)