swpuctf—re1

re1其实是一个对二进制上的运算,就是将每个字节的二进制分为三部分——高位0+1、低位0与中间值,并记录下三部分各自的大小,再以四字节为一组进行重新填充得出验证码
在这里插入图片描述
如上图示例,00111100被分为三部分后

高位:001
中位:111
低位: 00

这时将进行重新组合再拼接,生成两组数,既高位组与低位组拼接位一组,中间位为一组

组一:111
组二:00100

记录下所有数据并生成结构体

	typedef struct _Data_Structure
	{
   
		char g_flag[4];			//flag
		byte num[4];			//中间位大小
		byte high_num[4];		//高位大小
		byte low_num[4];		//低位大小
		byte mod[4];			//组一
		byte merge[4];			//组二
	}Data_Structure, * PData_Structure;

相信师傅们都知道flag的格式是^swpuctf\{\w{4}\-\w{4}\-\w{4}\-\w{4}\-\w{4}\},将每四位设置为一组进行了上述分解后进行最后的填充操作
申请一个40byte空间,同样分为两部分,其中低20字节存放重组后的flag,高20字节存放高低位大小
在这里插入图片描述
将mod填充在高位,merge填充在低位,重新组合成新的一组四字节
在这里插入图片描述
将高低位各自大小重新组合为一字节
在写逆算法的时候就可以通过从20位大小段中提取出各个字节高低位大小,再结合20位数据段中高位填充mod与低位填充merge的特点还原flag
推荐师傅们在解题的时候,找到结构体位置,通过观察二进制的变化,更能理清思路、发现规律

int main()
{
   
	byte ptable[40] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值