2023-re4(SEH异常控制流+花指令+异或)

二木 王者

拿到题我们可以发现,有一个简单的反调试,调试很好过,我们直接NOP或者进行附加调试皆可

image-20231017091327367

限制了输入,指定输入的flag的长度为40.

image-20231017091608472

这一部分实现了SHE异常处理,人为的做出了访问不可地址的访问。

image-20231017091729756

如果是熟悉SEH这个考点的话,那就方向其实很简单。直接找它所隐藏的代码即可。

但是对于这道题,我们可以发现一个很有趣的地方,我们直接静态分析,是不能直接分析出隐藏代码在哪儿的。

我们仔细看可以发现一个可疑地方

image-20231017092721102

对于这里有一个jmp_except 就是我们需要处理的代码,我们可以看到,有一个是退出,一个是向下执行,我们所以下面的那段代码就是我们需要的隐藏代码,这里我们只需修改jmp即可。

修改之后,被隐藏的代码逻辑就出现了

image-20231017092942023

所以对于此方面的处理,由于出题人会将我们的关键代码,放入SEH断下来之后,从而实现了代码的隐藏,所以处理此类题目我们的思路就是,就是去寻找出题人隐藏的代码,其中有两方面,一方面就是观察主程序的汇编,对于jmp要特别主要,大多数,就会出现一个莫名的jmp跳过了一大段的内容,这是因为使用了SEH处理机制,将SEH断入,就会执行我们那跳过的代码。所以我们只需修改跳转即可,另外如果主程序没有而是在其他地方调用,这就需要我们进行动态调试了,通过动态调试确定我们数据被修改的地方,也能找到被出题人隐藏的代码。

我们可以知道,前面的循环并没有对我们的输入数据进行处理,下面的函数对我们的数据进行了修改(v19)

image-20231017093031969

进入之后,我们可以发现有一个小花指令,很简单,将无关数据nop掉就行。

image-20231017093152905

image-20231017093509437

很简单的异或

下面的,又对v19进行了异或操作,这里我们动态调试,但是我们不能直接查看具体v10的值为多少,这里我是进行前后数据调试,将前后数据dump下来进行异或,可以得出对前32为异或上139,对后八位异或上1.

image-20231017093606811

写出我们的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>

int main()
{
unsigned char data[40] = {
0xCB, 0xCD, 0xD8, 0xC9, 0xDF, 0xCC, 0xF4, 0xDD, 0xC0, 0xCE, 0xE4, 0xB7, 0xF6, 0xE3, 0xE7, 0xE3,
0xF1, 0xFF, 0xFE, 0xF2, 0xFF, 0xFB, 0xFF, 0xF7, 0xEC, 0xED, 0xF4, 0xA7, 0xE6, 0xF3, 0xE4, 0xF8,
0xC8, 0xC0, 0xD5, 0xC7, 0xC8, 0xC4, 0x8A, 0xD7};

for (int i = 0; i < 40; i++)
{
data[i] ^= 139;
}
for (int i = 0; i < 40;i++)
{
data[i] = (i ^ data[i] ^ 5)-1;
}
for (int i = 0; i < 40; i++)
printf("%c",data[i]);

return 0;
}

DASCTF{SEH_1s_fan_and_fmyy_1s_shenxian!}

 评论
目录