swpuctf—re1

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

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

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

组一:111
组二:00100

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

	typedef struct _Data_Structure{char g_flag[4];			//flagbyte 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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部