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


  1. 在输入后进入主要部分。

    0hMvnK.jpg 这段不是很懂,根据多次调试后判断,如果输入12个字节,则`0xB814A8`处就可以跳转,使`EBP`为0. 0hQv2n.jpg 为0,即表示密码正确,会输入成功语句。
  2. 接下来是第一部分密码

    0hllIe.jpg `LODS `即将密码头四个字节放入`EAX`中,将`0x5A643059 xor 0x 3628552E `得到第一部分密码,还需反序排列为`weLl`
  3. FS:[0] 为TEB结构体中指向第一个SEH结构体地址

    0h1iOP.jpg 0h1fXt.jpg 即`0xEFFC14`. 接着,执行`INT 1`指令后,会进入`0xDB1D60`处的第一个SEH函数。 0hdwPP.jpg 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,表示从发生异常的代码处继续执行。 0hwUL4.jpg 最后计算如下: `FF2C F8E5 XOR 495F 4265 = B673 BA80 - 48335621 = 6E40 645F=n@d_` 反序排列为`_d@n`
  4. 0xB814FF处调用AddVectoredExceptionHandler函数,新增一个SEH函数。

    0h09pV.jpg 以下摘自https://docs.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-addvectoredexceptionhandler
    1
    2
    3
    4
    PVOID AddVectoredExceptionHandler(
    ULONG First,
    PVECTORED_EXCEPTION_HANDLER Handler
    );
    `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. 0h0zHH.jpg 该函数将第三部分的四字节密码减去了一个数,之后,又执行第二个SEH函数。`有个疑问是这里将返回值置0,又怎么执行第二个SEH函数。` 最后计算如下: `3C4C7440 xor 74406653 =480C 1213 + 21486553 - 48335621=21212145=!!!E` 反序排列为`E!!!`
  5. 最后三部分密码组合在一起:weLl_d@nE!!!

    0hDnsO.jpg 密码正确