2021 SangFor(羊城杯)-Reverse(逆向) BabySmc Write up

前言:新手一枚 能理解到的点我会写的很细 有问题可问 有错地方欢迎提出

0x00 日常查壳

无壳64位

0x01 主函数

先简单介绍一下smc,看了很多文章,意思大概就是自解码程序(运行过程中会有程序专门解数据),这种题动调最方便

分析一下主程序

1085地址和1d00的地址放在这两个地方(后面有用)

然后再经过一个1e30的加密函数

1085和1D00就是这串数据开始和结束的地方

0x02 1E30函数分析

进函数一看

想了解VirtualProtect往下看

这里就是对数据的修改 可以自己把数据拿出来自己改 也可以直接动调 我这边选择直接动调

VirtualProtect函数

0x03 动调

把断点断在解密前 查看变化

选择本地调试器

开始调试后有个输入是接受用户输入的 直接随便输入点进去

这边直接F8单步

因为下面不是代码区域 所以ida会报个错 直接否就可以

发现数据已经改变

然后从上往下 找到第一个retn 右键分析选择段

强制转换

直接F5反编译出

0x04 分析自解码后的程序

从头往下看会知道这是个又臭又长的程序

这种题目就是要做多了才有经验

随便挑一段看 会知道这是base64加密 但多了个异或操作

(没看出来的可以去看看用C写的base64加密脚本)

Buuctf-Reverse FlareOn3-Challenge Write up_水番正文的博客-CSDN博客

再翻翻会看到这个 既然有base64这个应该就是码表

整整齐齐

不难看出这是比较字符串

然后输出yes or no

现在来理一下

1.base64加密

2.修改了码表

3.加密完会有个异或

那么解密顺序就是

1.异或得出原来的数据

2.修改码表得到进行base64解密

0x05 GetFlag

#include <stdio.h>
#include <string.h>

int main(void)
{
	unsigned char key[] = "H>oQn6aqLr{DH6odhdm0dMe`MBo?lRglHtGPOdobDlknejmGI|ghDb<4";
	int data[] =				
	{	
  		0xE4, 0xC4, 0xE7, 0xC7, 0xE6, 0xC6, 0xE1, 0xC1, 0xE0, 0xC0, 
  		0xE3, 0xC3, 0xE2, 0xC2, 0xED, 0xCD, 0xEC, 0xCC, 0xEF, 0xCF, 
  		0xEE, 0xCE, 0xE9, 0xC9, 0xE8, 0xC8, 0xEB, 0xCB, 0xEA, 0xCA, 
  		0xF5, 0xD5, 0xF4, 0xD4, 0xF7, 0xD7, 0xF6, 0xD6, 0xF1, 0xD1, 
  		0xF0, 0xD0, 0xF3, 0xD3, 0xF2, 0xD2, 0xFD, 0xDD, 0xFC, 0xDC, 
  		0xFF, 0xDF, 0x95, 0x9C, 0x9D, 0x92, 0x93, 0x90, 0x91, 0x96, 
  		0x97, 0x94, 0x8A, 0x8E
	};
	int xr[] = {0xA6, 0xA3, 0xA9, 0xAC};
	int i, j;
	unsigned int v3;
	int flag[100] = {0};
	
	for(i = 0; i < 56; i++)
	{
		key[i] ^= xr[i % 4];
//		printf("%d ",key[i]);	
	}
//	printf("\n");
	for(i = 0; i < 56; i++)	
		for(j = 0; j < 64; j++)
			if(key[i] == data[j])
				{
					key[i] = j;					 
//					printf("%d:%d ",i,j);
					break;
				}
	for(i = 0, j = 0; i < 56; i += 4, j += 3)
	{
		v3 = key[i+3] + (key[i+2] << 6) + (key[i+1] << 12) + (key[i] << 18);
		flag[j] = (v3 >> 16) & 0xFF;
		flag[j+1] = (v3 >> 8) & 0xFF;
		flag[j+2] = v3 & 0xFF;
	}
	
	for(i = 0; i < 100; i++)
		printf("%c",flag[i]); 
	
	return 0;	
} 

自己写的一个解密脚本 这篇文章写了心路历程

Buuctf-Reverse FlareOn3-Challenge Write up_水番正文的博客-CSDN博客

GetFlag!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
羊城杯2020是一场年度的电子竞技赛事,为广大电竞爱好者提供了一个展示技术和激发激情的舞台。今年的羊城杯聚集了来自全国各地的顶尖电竞选手,他们在各个游戏项目中展现了高水平的操作和战术。 在比赛的文化氛围方面,羊城杯2020鼓励团队协作和竞争精神,这对于参赛选手来说是一个很好的机会展现自己的技术能力和团队合作能力。此外,组委会还积极倡导公平竞赛,严禁使用任何形式的作弊或不正当手段来获取胜利,从而保证了比赛的公正性。 羊城杯2020不仅是一场竞技比赛,还提供了丰厚的奖金和荣誉,吸引了众多顶尖选手参与其中。参赛选手们通过紧张刺激的比赛,展现了他们的技术实力和战术策略。同时,比赛也为电竞爱好者们提供了一个观赏比赛和学习经验的机会,让他们更好地了解电竞运动,提高自己的技术水平。 此外,羊城杯2020还注重了普及电竞文化的意义。比赛在各个媒体平台上进行直播,使更多的观众能够通过网络或电视观看比赛,增加了电竞的曝光度。通过各种推广活动,羊城杯2020吸引了更多非电竞爱好者的关注,提高了电竞在社会中的认可度和影响力。 总的来说,羊城杯2020是一场令人期待的电竞盛事,它不仅展示了顶尖选手们的实力和技巧,也推广了电竞文化并吸引了更多人的关注。这样的比赛将继续推动电竞行业的发展和壮大,为电竞爱好者们带来更多的精彩赛事和娱乐体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值