Windows-SEH构造方法
Windows-SEH构造方法
本篇为CTF专题,详细了解看“WindowsAPI查缺补漏-异常处理”。常用系统异常值:
异常 | 异常值 | 解释 |
---|---|---|
EXCEPTION_ACCESS_VIOLATION | 0xC0000005 | 程序企图读写一个不可访问的地址时引发的异常。例如企图读取0地址处的内存。 |
EXCEPTION_ARRAY_BOUNDS_EXCEEDED | 0xC000008C | 数组访问越界时引发的异常。 |
EXCEPTION_BREAKPOINT | 0x80000003 | 触发断点时引发的异常。 |
EXCEPTION_DATATYPE_MISALIGNMENT | 0x80000002 | 程序读取一个未经对齐的数据时引发的异常。 |
EXCEPTION_FLT_DENORMAL_OPERAND | 0xC000008D | 如果浮点数操作的操作数是非正常的,则引发该异常。所谓非正常,即它的值太小以至于不能用标准格式表示出来。 |
EXCEPTION_FLT_DIVIDE_BY_ZERO | 0xC000008E | 浮点数除法的除数是0时引发该异常。 |
EXCEPTION_FLT_INEXACT_RESULT | 0xC000008F | 浮点数操作的结果不能精确表示成小数时引发该异常。 |
EXCEPTION_FLT_INVALID_OPERATION | 0xC0000090 | 该异常表示不包括在这个表内的其它浮点数异常。 |
EXCEPTION_FLT_OVERFLOW | 0xC0000091 | 浮点数的指数超过所能表示的最大值时引发该异常。 |
EXCEPTION_FLT_STACK_CHECK | 0xC0000092 | 进行浮点数运算时栈发生溢出或下溢时引发该异常。 |
EXCEPTION_FLT_UNDERFLOW | 0xC0000093 | 浮点数的指数小于所能表示的最小值时引发该异常。 |
EXCEPTION_ILLEGAL_INSTRUCTION | 0xC000001D | 程序企图执行一个无效的指令时引发该异常。 |
EXCEPTION_IN_PAGE_ERROR | 0xC0000006 | 程序要访问的内存页不在物理内存中时引发的异常。 |
EXCEPTION_INT_DIVIDE_BY_ZERO | 0xC0000094 | 整数除法的除数是0时引发该异常。 |
EXCEPTION_INT_OVERFLOW | 0xC0000095 | 整数操作的结果溢出时引发该异常。 |
EXCEPTION_INVALID_DISPOSITION | 0xC0000026 | 异常处理器返回一个无效的处理的时引发该异常。 |
EXCEPTION_NONCONTINUABLE_EXCEPTION | 0xC0000025 | 发生一个不可继续执行的异常时,如果程序继续执行,则会引发该异常。 |
EXCEPTION_PRIV_INSTRUCTION | 0xC0000096 | 程序企图执行一条当前CPU模式不允许的指令时引发该异常。 |
EXCEPTION_SINGLE_STEP | 0x80000004 | 标志寄存器的TF位为1时,每执行一条指令就会引发该异常。主要用于单步调试。 |
EXCEPTION_STACK_OVERFLOW | 0xC00000FD | 栈溢出时引发该异常。 |
hgame creakme2
源代码:
1 | int FilterFuncofDBZ(int dwExceptionCode){ |
[MoeCTF 2022]Fake_code
main函数:
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
第20行的汇编代码:
1 | loc_1400011B8: |
有一部分代码被隐藏在__except
中:
1 | loc_1400011E9: |
idiv为带符号除法,立即数为除数,被除数在eax中,商在eax中,余数在edx中。
loc_1400020D0函数为GetExceptCode(),内容如下:
1 | ; START OF FUNCTION CHUNK FOR main |
sub_140001000为自定义的filter,对值摁M找个枚举值:
1 | _BOOL8 __fastcall sub_140001000(int a1) |
发现是在__try
中抛出了被零除的异常。
仔细分析代码,找出隐藏代码:
1 | a=v5>>7; |
变量0引出异常。写出exp:
1 |
|
[安洵杯 2019]crackme
先是字符串大法,找到标准Base64表和可以密文,点进去发现sub_412AB0
把Base表给大小写转换了。下面提示Hook成功,进入Handler
函数分析。
“where_are_u_now?”其实是密钥,进入sub_411172
其实是个SM4加密。SetUnhandledExceptionFilter
触发异常后执行参数TopLevelExceptoinFilter
,隐藏了sub_412C30
的调用。
先是字符对调,又是一坨看不懂的加密,最后一个加密点进去发现是把“=”变成“!”,sub_4110FF
将Base64编码表左移24位。
最后sub_411136
判断是否相等,尝试逆向:
先求Base64表,大小写转换后右移24位,脚本从网上嗦的:
1 | str2 = '1UTAOIkpyOSWGv/mOYFY4R!!' |
替换“!”后Base64解密,然后SM4解密,脚本还是网上的:
1 | from pysm4 import encrypt, decrypt |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 The Blog of Monoceros406!