[杭州师范大学校赛2023决赛]送你一朵玫瑰花 -- 指令集

may be是一种代码保护手段,用IDA打开文件发现main函数竟然是爆红的,于是刚开始做的时候认为是存在花指令的,但认真看了一下好像不算是花。。。。。

解决方法  --->  所以爆红地址选中按p就好了

然后table看伪代码

简单易懂的代码 比较v8与v9地址存的值及之后固定长度地址存的值(就是v8与v9v10v11v12v13首尾相接的比较),相同就会输出Con。所以我们将v9 -- v13首尾相接(注意端序转换)然后进行逆运算即可。

代码中发现加密函数func_40117E跟进阅读

发现5 个函数,所以本题逻辑比较好理解了。

flag长度为29,每5个字符进行分组采取5种加密方式,循环至结束(附草草草图

于是据此写下脚本

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<stack>
#include<set>
#include<string>
#include<cstring>
#include<list>
#include<stdlib.h>

using namespace std;

unsigned char func1(unsigned char a1)
{
  return a1 ^ 0x19;
}
unsigned char func2(unsigned char a1)
{
  return a1 - 18;
}
unsigned char func3(unsigned char a1)
{
  return a1 + 16;
}
unsigned char func4(unsigned char a1)
{
	char a;
	for (char i = 32 ; i < 127 ; i++)
		{
			if ( (2 * (a1 & 0x7F)) == i)
				a = i; 
				return i;
		}
  //return 2 * (a1 & 0x7F);
}
unsigned char func5(unsigned char a1)
{
	unsigned char a;
	for (int i = 32 ; i < 127 ; i++)
		{
			if (i == (a1 ^ (a1 ^ ~a1) & 0x80))
				a = i;
		}
		return a;
  //return a1 ^ (a1 ^ ~a1) & 0x80;
}
int main ()
{
	unsigned char flag[32]={0};
	unsigned char (*funcs[5])(unsigned char)={func1,func2,func3,func4,func5};
	unsigned char Arglist[]={0x7F, 0x7E, 0x51, 0xCE, 0xFB, 0x4E, 0x7A, 0x24, 0xE8, 0xDF, 
  0x59, 0x71, 0x26, 0xCA, 0xE1, 0x6C, 0x86, 0x21, 0xCC, 0xF5,
  0x28, 0x71, 0x14, 0xD8, 0xEF, 0x6E, 0x77, 0x62, 0xFA};
	for(int i=0;i<29;i++){
		 flag[i] = funcs[i % 5](Arglist[i]);
		 printf("%c",flag[i]);
	}	
}

 脚本的func4存在错误,部分字符输出有问题,因为我太菜了

// flag{Wh4t_@_6eaut1fu1_$1ower}   //好像是不太记得了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值