首页
论坛
专栏
课程

[原创] 跨行老菜鸟过来凑热闹,CTF2019第一题分析记录

2019-3-19 18:40 612

[原创] 跨行老菜鸟过来凑热闹,CTF2019第一题分析记录

2019-3-19 18:40
612
    我毕业进了PCB行业,其实我一直喜欢的是IT行业,现在转行还来及吗? 主要是我年纪上来了,哈哈。 完全凭自己的一腔热血,笨办法自学的杂七杂八的技术。读大学时玩过破解,技术一直保持平稳。不多说了,进入我分析的记录,各位将就着看,谢谢。

查下有没有加壳,没加


 1.首先进入OD,F9运行,输入假码:kanxue , 弹出错误窗口。


 2. F12暂停大法,按上面那个k字母,来到堆栈,双击MessageboxExA里面下个断。


 3.ctrl+F2重新运行,输入假码,F9来到断点处,F8单步一步步跟,(中间有错误弹窗口,点确定就行了),一会就来到了程序领空,如图


 4. 接上面图说,来到这里,这时就上下翻动,可能有重要的信息就在附近,如下图。
有正确的注册码提示信息,看这结构,也就是个弹窗口提示注册成功,然后就程序退出了,这里价值不大,接着找。


5. 往下翻动的时候找到这样一个关键点,是个函数调用,里面还有些字符串提示,还有字符串比较函数strcmp调用,这里很有可能就是整个程序的核心点了,拉到IDA里面,重点分析下这个地方。


6. GetWindowTextA 获取文本框的内容,往下走计算单个字符是否在 0-9, a-z , A-Z 里面(查ASCII表),分别减去 29 , 87, 48, 最后把结果放到result里面,
再调用sub_4017F0函数,进去看看。


7. sub_4017F0函数如下图。从这个函数里面得到的字符串,当做数组下标,在 “abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ” 字符串里面搜索得到结果写入Str1, 再与字符串 “KanXueCTF2019JustForhappy” 做比较,明显相等就是正确注册码啦,所以要得出函数 sub_4017FF0里面v5的值,程序就解开了。

8.计算得出结果,我的搞法是在 “abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ”这个字符串里面得到下标值,再反向计算出真的注册码,贴个代码,代码我就不做说明了,写得乱。


using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{

	string Str = "KanXueCTF2019JustForhappy";
	string Keys = "abcdefghiABCDEFGHIJKLMNjklmn0123456789opqrstuvwxyzOPQRSTUVWXYZ";
	int num[25] = { 0 };
	char pass[25] = { 0 };
	int res = 0;

	for (int i = 0; i < int(Str.length()); i++)
	{
		for (int j = 0; j < int(Keys.length()); j++)
		{
			if (Str[i] == Keys[j]) {
				num[i] = j;
				break;
			}
		}
	}

	for ( int i = 0; i < 25 ; ++i )
	{

		if ( num[i] > 0 && num[i] <= 30 )
		{
			res = num[i] + 87;
			if ( (res >= 65 && res <= 90 ) || (res >= 97 && res <= 122) ) {
				pass[i] = res;
			}  else {
				if ( num[i] == 1 )
					pass[i] = '1';
				else if ( num[i] == 2 )
					pass[i] = '2';
				else if ( num[i] == 3 )
					pass[i] = '3';
				else if ( num[i] == 4 )
					pass[i] = '4';
				else if ( num[i] == 5 )
					pass[i] = '5';
				else if ( num[i] == 6 )
					pass[i] = '6';
				else if ( num[i] == 7 )
					pass[i] = '7';
				else if ( num[i] == 8 )
					pass[i] = '8';
				else if ( num[i] == 9 )
					pass[i] = '9';
			}
		}
		else if (num[i] > 30 ) 
		{
			pass[i] = num[i] + 29;			
		}	
		else 
		{
			pass[i] =  '0' ;
		}

	}


	for (int i = 0; i < 25; i++)
	{
		cout << pass[i] ;
	}

	cout << "\n\n";
	return 0;
}
运行成功如下:



 注码码 :j0rXI4bTeustBiIGHeCF70DDM


[招聘]欢迎市场人员加入看雪学院团队!

最后于 2019-3-20 13:01 被sky东编辑 ,原因: 代码格式不对
最新回复 (0)
游客
登录 | 注册 方可回帖
返回