首页
社区
课程
招聘
[原创]看雪.TSRC 2017CTF秋季赛第二题 ctf2017_Fpc
发表于: 2017-10-26 23:09 3749

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

2017-10-26 23:09
3749

这个题,很有意思。被题目引向了错误的方向,写一下整个思考过程。

首先是main函数很奇怪,没有传递参数的过程。

然后找到是get_input函数在搞事情,get_input把输入读入了栈里面,而不是在堆中分配内存。

这样函数退出后,输入还是在栈里面。在这里发现如果输入超过12个字符(包括字符串末尾的'0'),就会覆盖函数的返回地址,一开始以为这既然是逆向题,应该不会用这个漏洞吧。再往下看check_one函数和check_two函数,实际上12个字符的最后4个会被覆盖,只有前8个有效。check_one函数和check_two函数都是把8个字节当成两个整数做计算。

本来以为按照这个算一下就行了,然而,check_onecheck_two不能同时满足。以为自己算的不对,搞了很久。

后来发现,在check_one函数和print函数中间有一大段指令,不知道是干什么的。

想到之前有一个栈溢出漏洞,先跳转到这来执行一下,正好这个地址0x00413131对应的字符串是11A,末尾还有个0。

输入的字符串是123456789abc11A
跳转后发现这里好像真的是有文章的,很多跳转指令中间藏着一些pop, mov, sub, add等指令。核心指令如下:

分析上面汇编代码,这是一个三元一次方程组,以A, B, C代表输入字符串的前、中、后四个字节表示的整数。这个方程组是

最后解得

变成字符串为Just0for0fun,加上跳转地址,最终的flagJust0for0fun11A


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

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 441
活跃值: (419)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
666666666666
2017-10-28 16:26
0
游客
登录 | 注册 方可回帖
返回
//