首页
论坛
课程
招聘
[原创]看雪.TSRC 2017CTF秋季赛--第二题分析
2017-10-27 15:58 1087

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

2017-10-27 15:58
1087
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;
		}
	}
但是溢出的话,溢出地址必须是由字母和数字组成的,所以往下使劲翻代码,翻到这里:
00413131                       | 83 C4 F0                     | add esp,FFFFFFF0                             |
00413134                       | 70 2A                        | jo ctf2017_fpc.413160                        |
00413136                       | 71 20                        | jno ctf2017_fpc.413158                       |
00413138                       | F2 75 1C                     | jne ctf2017_fpc.413157                       |
此处的地址和指令看起来有点可以,跟进之后发现对关键判断地址41B034写入0,我就知道这条路是对的。
继续往下跟,很多跳转不知道有什么简便的方法可以过滤掉,我是手动跟的,确认了公式:
4*(x-y)+x+z=0xEAF917E2
3*(x-y)+x+z=0xE8F508C8
3*(x-y)+x-z=0xC0A3C68 
计算得到结果 Just0for0fun11A

[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回