-
-
[原创]看雪2019CTF第二场第一题神秘来信:SEH异常处理--MysteriousLetter2
-
发表于:
2019-6-22 22:47
8271
-
[原创]看雪2019CTF第二场第一题神秘来信:SEH异常处理--MysteriousLetter2
先看程序主逻辑
这里可以看到要求输入六位的序列号,最后三位是353
,然后前三位的和是5.
但是我们并没有发现success的提示。
我们搜索并定位
可以看到success的提示在except里面
这里我们要提到SEH
(结构化异常处理),这是Windows下的一种异常处理机制。
参考加密与解密
next是下一个链的地址。如果next的值是FFFFFFh
,表示是链表的最后一个节点,该节点的回调函数是系统设置的一个终结处理函数,所有无人值守的异常都会到达这里。
异常处理函数可以是自定义的函数,系统有一个默认的函数,但我们可以自定义一个异常处理函数,让它来处理。
但是得先安装自定义函数才能使用。
我们可以写一个异常处理的例子
我们可以将其编译后反汇编研究下except的代码以及是如何安装SEH的。限于篇幅,我们不做深入探究。了解更多可以看一下https://blog.csdn.net/w1012747007/article/details/77131781
这里,我们看到filter(这是IDA自动生成的提示)
0x401373
的filter
返回1,即EXCEPTION_EXECUTE_HANDLER
,意思是捕获该异常,也就是说无论发生什么异常,都将被0x401379
的异常处理捕获。
这里,我们知道了,如果想要程序输出success,程序中就需要出现一次异常。让0x401379
的exception执行.
我们从try块开头开始分析。
这里的给ms_exc.registration.TryLevel
赋值是用于处理嵌套的try。trylevel为0表示最外层,具体可以参见此处
大致的流程如下
esi的值是输入的序列号转为十六进制的结果。(例如输入的序列号是110799
,那么esi就是0x110799)
重点来看0x401354
的处理,我们分析一下执行到0x401354
时帧栈
执行完0x401354
,eax就是0x401353
然后div的时候,如果esi的值是0,就会触发异常,也就是我们想要的结果。
我们只需要esi的值原来是0x401353
,也就是和eax一样。
而esi的值的由来前面分析过,所以序列码就是401353
顺带blog原文备份
blog
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2019-6-22 22:48
被微笑明天编辑
,原因: