-
-
[原创]看雪.TSRC 2017CTF秋季赛第二题 ctf2017_Fpc
-
发表于:
2017-10-26 23:09
3749
-
[原创]看雪.TSRC 2017CTF秋季赛第二题 ctf2017_Fpc
这个题,很有意思。被题目引向了错误的方向,写一下整个思考过程。
首先是main
函数很奇怪,没有传递参数的过程。
然后找到是get_input
函数在搞事情,get_input
把输入读入了栈里面,而不是在堆中分配内存。
这样函数退出后,输入还是在栈里面。在这里发现如果输入超过12个字符(包括字符串末尾的'0'),就会覆盖函数的返回地址,一开始以为这既然是逆向题,应该不会用这个漏洞吧。再往下看check_one
函数和check_two
函数,实际上12个字符的最后4个会被覆盖,只有前8个有效。check_one
函数和check_two
函数都是把8个字节当成两个整数做计算。
本来以为按照这个算一下就行了,然而,check_one
和check_two
不能同时满足。以为自己算的不对,搞了很久。
后来发现,在check_one
函数和print
函数中间有一大段指令,不知道是干什么的。
想到之前有一个栈溢出漏洞,先跳转到这来执行一下,正好这个地址0x00413131
对应的字符串是11A
,末尾还有个0。
输入的字符串是123456789abc11A
。
跳转后发现这里好像真的是有文章的,很多跳转指令中间藏着一些pop, mov, sub, add
等指令。核心指令如下:
分析上面汇编代码,这是一个三元一次方程组,以A, B, C
代表输入字符串的前、中、后四个字节表示的整数。这个方程组是
最后解得
变成字符串为Just0for0fun
,加上跳转地址,最终的flag
是Just0for0fun11A
。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)