首页
社区
课程
招聘
[原创]看雪.TSRC 2017CTF秋季赛--第二题分析
发表于: 2017-10-27 15:58 3062

[原创]看雪.TSRC 2017CTF秋季赛--第二题分析

2017-10-27 15:58
3062

IDA分析看到函数需求是两个DWORD并且要满足公式:

5 * (dwHi - dwLow) + dwHi == 0x8F503A42 && 13 * (dwHi - dwLow) + dwLow == 0xEF503A42
17 * (dwHi - dwLow) + dwHi == 0xF3A94883 && 7 * (dwHi - dwLow) + dwLow == 0x33A94883
由于懒得计算公式,并且发现使用的是ESP作为scanf的缓冲区且栈布局明显存在溢出:
0018FF34 0041B08C "%s" 
0018FF38 0018FF3C 
0018FF3C 00000000  
0018FF40 7EFDE000 
0018FF44 0040100A 返回到 ctf2017_fpc.0040100A 自 ctf2017_fpc.00413D42 
0018FF48 0040101C 返回到 ctf2017_fpc.0040101C 自 ctf2017_fpc.00401050 
0018FF4C 00413E3E 返回到 ctf2017_fpc.00413E3E 自 ctf2017_fpc.00401000
所以先测试了000000000000/^P@( ^P 使用Alt+16输入),果然可以成功,但是提交答案是不认的,而且比赛要求只能输入字母数字。虽然答案不对,但是知道可以溢出。
放弃溢出之后进行公式计算,发现公式无解 ,于是又根据溢出开始找线索。
/*该代码用于计算最低位数值,没有找到结果*/	for (int n = 1; n < 256; n++)
	{
		char x = 0x42 - (char)(n * 5);
		char y = 0x42 - (char)(n * 13);

		if (char(x - y) == n)
		{
			printf("%x ", n);
		}
		else
		{
			continue;
		}
	}
但是溢出的话,溢出地址必须是由字母和数字组成的,所以往下使劲翻代码,翻到这里:

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//