HackPluto's Blog

看雪KCTF2019wp

字数统计: 403阅读时长: 1 min
2019/09/27 Share

1.神秘来信

先将程序放入IDA中

可以看到这个需要输入一个序列号,长度不能超过7,并且后3位为353,前三位和不能超过149。直接看反汇编的代码有些奇怪,因为并没有成功时候的条件,这里需要查看汇编,发现这里有一个除0异常

这里涉及到了Windows的SEH机制
SEH 的工作原理:
Windows 程序设计中最重要的理念就是消息传递,事件驱动。当GUI应用程序触发一个消息时,系统将把该消息放入消息队列,然后去查找并调用窗体的消息处理函数(CALLBACK),传递的参数当然就是这个消息。我们同样可以把异常也当作是一种消息,应用程序发生异常时就触发了该消息并告知系统。系统接收后同样会找它的“回调函数”,也就是我们的异常处理例程。当然,如果我们在程序中没有做异常处理的话,系统也不会置之不理,它将弹出我们常见的应用程序错误框,然后结束该程序。
SEH 是 Windows 系统提供的功能,跟开发工具无关。值得一提的是,VC 将 SEH 进行了封装 try catch finally,c++中也可以用c的封装 try{}except(){} 和 try{}finally{}. 所以当你建立一个C++ try块时,编译器就生成一个SEH_ _try块。

动态调试这个程序,发现最后ESI寄存器里的值为401353,所以序列号为401353













CATALOG
  1. 1. 1.神秘来信