2017HCTF第一题WP(法二)
@zbnysjwsnd8 趁我陪女票先发啦可恶~CheckCode的分析和解法提供另一种思路
查壳显示无运行显示Waring后直接结束,估计有反调试
http://img.blog.csdn.net/20171114152957452?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
于是拖入IDA检索该字符串,找到这里的调用:
http://img.blog.csdn.net/20171114152711703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
稍微查了一下,TlsCallback是线程局部存储回调函数,简单来说就是在创建线程的时候调用这个函数
最简单的方法就是在OD中断下来,然后直接把它NOP掉
http://img.blog.csdn.net/20171114153122914?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
搞定以后重新运行,发现显示了几个字符串以后又挂了
http://img.blog.csdn.net/20171114153458589?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
说明还有别的地方调用反调呗╮(╯_╰)╭
查了一下WARNING字符串只有TlsCallback里调用了,那干脆把它Hook住好了:
http://img.blog.csdn.net/20171115002059232?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
这样就可以正常运行了,继续往下走,找到接收输入的地方,很明显这里就是关键:
http://img.blog.csdn.net/20171115002210704?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
0x00bd1316函数对User进行Check,IDA反编译一下比较方便:
http://img.blog.csdn.net/20171115003602464?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
逆序,然后通过一个乱七八糟的东西【对下标计算】,最后与输入值异或,然后比较
所以逆算法直接算出这个东西然后与比较值异或,再逆序即可:
d =
d1 = []
for j in range(11):
d1.append(chr(((((j ^ 0x76) - 52) ^ 0x80) + 43) ^ d))
flag = "".join(d1)
print(flag[::-1])
得到Name:“M.KATSURAGI”
然后我把它提交了几十遍,没用(╯‵□′)╯︵┻━┻
刚开始上来就用IDA反编译main函数报错了:
http://img.blog.csdn.net/20171115004109161?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
一般在加壳、或是对解密代码段的时候会出现这种错误,堆栈识别错误
但是已经做到这里都没有出现对代码操作的地方,没道理啊
于是去0x413238看看:
记得勾上Option-general-stack pointer,查看堆栈偏移:
http://img.blog.csdn.net/20171115004303474?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
问题出在mov esp, ebp上了啊……ALT+K更改试试
嘿,还真行了
这样一眼就能看到CheckName之后还有Code的检查了
http://img.blog.csdn.net/20171115004626823?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
往下分析,跟着字符串走:
http://img.blog.csdn.net/20171115011136372?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
可以看到,先在sub_41114f中对input进行了第一次变换,然后分别用它得到了3个字符串,最后校验这3个部分依次查看:
http://img.blog.csdn.net/20171115004916307?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
变换1很简单,依次异或0x76即可后面3个变换其实思路一样,以变换2为例:
http://img.blog.csdn.net/20171115005636924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
乍一看有点懵,但仔细分析就能看出端倪
&和|操作一般用于二进制位中的处理,“和”操作用于取出某些位,“或”操作用于合并拼接值
对这些敏感的话,再查一下关键的0xAA的二进制:
http://img.blog.csdn.net/20171115005657789?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
也就是说,实际上这个操作就是把每个数异或0xad后再将奇偶位交换
分析出它的意义,逆变换就很简单了:先将奇偶位交换,再异或0xad即可
变换3、4只是异或值和取的位不同,思路都是相同的,它们分别操作14-21位和21-28位
例如变换3的0xcc是11001100,再分别左移和右移2位
逆变换同样交换即可
最后与0x41b0dc进行比较,于是把它Dump下来,然后先分段进行变换2、3、4的逆,再进行变换1的逆即可:
d2 =
for i in range(7, 14):
p = (d2 & 0xaa)>>1
q = (d2<<1) & 0xaa
d2 = (p|q)^0xad
for i in range(14, 21):
p = (d2 & 0xcc)>>2
q = (d2<<2) & 0xcc
d2 = (p|q)^0xbe
for i in range(21, 28):
p = (d2 & 0xf0)>>4
q = (d2<<4) & 0xf0
d2 = (p|q)^0xef
for i in d2:
print(chr(i^0x76), end='')
得到flag
这个算法还是很有意思的,不过到处都是反调有点麻烦~
嗯…………
我都是靠IDA反编译出来的算法来逆,管反调干啥呢(╯‵□′)╯︵┻━┻
附件在dalaohttps://www.52pojie.cn/thread-661434-1-1.html这里有,我就不再上传啦
(PS:注册码最后6位不同的话可能是由于官方每隔若干时间更换一次源程序和flag,防止地下交易嘛~) 厉害了,我的哥 虽然我看不懂但是好厉害的样子 虽然我一样看不懂但是好厉害的样子,好厉害 很好,不错
膜拜。
学习了 膜拜大佬 好东西 受益匪浅 厉害了, 我的歌 膜拜一下大佬,新入CTF坑的小萌新希望沾沾仙气。:lol
页:
[1]
2