root_me_PE_x86_SEHVEH_WP
PE DotNet - 0 protection
使用 NET relector
工具
或者dnSPY
https://github.com/0xd4d/dnSpy/releases
就可以破解
ELF x64 - Crackme automating
python 编程
别人写的代码
https://mydiary42.wordpress.com/2019/01/26/root-me-crackme-automating/
int([x]) -> integer
int(x, base=10) -> integer
将数字或字符转为整形
Convert a number or string to an integer, or return 0 if no arguments are given.
num=line[addr+1,-1]
byte.append(int (num,16)) //将num变为16进制
使用pwntools
/ Capstone
/objdump
获得反汇编代码
之后进行搜索
PE x86 - SEHVEH_WP
从题目知道是关于SEH 和 VEH(VectoredExceptionHandler)的。
OllyDBG 查看seh链 选择 view-seh chain
在输入后进入主要部分。
这段不是很懂,根据多次调试后判断,如果输入12个字节,则`0xB814A8`处就可以跳转,使`EBP`为0. 为0,即表示密码正确,会输入成功语句。接下来是第一部分密码
`LODS `即将密码头四个字节放入`EAX`中,将`0x5A643059 xor 0x 3628552E `得到第一部分密码,还需反序排列为`weLl`FS:[0] 为TEB结构体中指向第一个SEH结构体地址
即`0xEFFC14`. 接着,执行`INT 1`指令后,会进入`0xDB1D60`处的第一个SEH函数。 SEH函数的第三个参数,即`[ESP+C]`为pContext的地址,pContext保存线程切换时的寄存器信息。在PE 32位下,`+0xB0`为EAX寄存器的值,`0xB81D64`处将`0x48335621`加到`EAX+0xB0`中,保存着输入的第二部分四字节密码。 `+0xB8`为EIP寄存器的值,通过下面的判断将EIP值加2,结果为`0xB814E4`,即`INT 1`指令的下一条指令地址。 `XOR EAX,EAX`将EAX置0,表示从发生异常的代码处继续执行。 最后计算如下: `FF2C F8E5 XOR 495F 4265 = B673 BA80 - 48335621 = 6E40 645F=n@d_` 反序排列为`_d@n`
以下摘自https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-addvectoredexceptionhandler0xB814FF
处调用AddVectoredExceptionHandler
函数,新增一个SEH函数。`First` The order in which the handler should be called. If the parameter is nonzero, the handler is the first handler to be called. If the parameter is zero, the handler is the last handler to be called. 如果不为0,则成为第一个调用的SEH函数,从图中可以看到,`First=1`. `Handler` A pointer to the handler to be called. For more information, see VectoredHandler. 从图中看出,函数地址为`0xB81940`, `Return value` If the function succeeds, the return value is a handle to the exception handler. If the function fails, the return value is NULL. 该函数将第三部分的四字节密码减去了一个数,之后,又执行第二个SEH函数。`有个疑问是这里将返回值置0,又怎么执行第二个SEH函数。` 最后计算如下: `3C4C7440 xor 74406653 =480C 1213 + 21486553 - 48335621=21212145=!!!E` 反序排列为`E!!!`1
2
3
4PVOID AddVectoredExceptionHandler(
ULONG First,
PVECTORED_EXCEPTION_HANDLER Handler
);最后三部分密码组合在一起:
密码正确weLl_d@nE!!!