HKCERT-2025-easydriver

Author:share

最近也是开始学习内核驱动了,来复现一道驱动题目,本来以为是一道简单题,结果发现是跟NepCTF2025的0解题XSafe长的不能说一模一样吧,只能说是完全一样,只改了密文和轮数其他基本全部照搬.

先来看r3层用户态的程序逻辑很简单,就是输入,然后打开进程,在写入后输出,本来看不出来有什么,但是看了其他师傅的博客发现,驱动可能访问了该进程,取出输入值进行校验

在来看r0层的驱动程序主要的程序在这个函数中sub_140010ADE

跟进这个函数发现这个函数被混淆的特别厉害,到这里没有思路只能动调看一下

运行加载这个驱动发现蓝屏了,错误码是0xdeadbeef,里面应该有反调试

查看崩溃前的栈帧调用,这里发现了是使用了KeBugCheckEx这个函数来进行反调试的

在ida中查看这个位置,发现里调用了一个函数

但是只有一个跳转,看了其他师傅的wp说这里是一个根据api调用函数的位置,那么反调试函数应该也是通过这个来进行调用的,下一步直接定位到这里进行动调

根据地址简单的计算一下这个函数在内存中的位置,然后下断点,进行动调

跟过来俩次发现了这个函数是我们要找的反调试函数,现在可以在ida直接nop掉调用的函数,也可以直接使用r rip=ret<地址>的方式直接绕过反调试,这里绕过之后后面还一个反调试和将调试器剥离的函数都用相同的方式绕过即可

在我们输入字符串后,调用的一个函数PsGetProcessSectionBaseAddress是用来查找目标进程的,这里的进程就是我们的r3程序

下一个函数是用来复制自己输入的字符串,在这里对复制好的位置下一个硬件断点,跟踪一下执行流和对我们输入做了什么

跟踪过来发现他调用了一个strlen来统计我们的长度,直接运行发现直接就跳出去了,应该是有一个长度的判断

动调到这里发现我们的长度rax被r8覆盖了,并且传给了rdi,

到最后发现是 xor rax,rdi,在cmp rax,22222222,在计算一下发现我们的长度应该是48位

后面就到了漫长的动调,观察寄存器的环节,动调出来的逻辑

key 3c4ed885 12af3e87 d6e1b31f 25c10aa0
mov r10d, 11111111h
xor r10d, dword ptr [0FFFFF800235C9018h]#9E3779B9
xor r11d,r11d
mov esi,r9d v1
shl esi, 4 v1<<4 mov edi,r9d v1 shr edi,5 v1>>5
xor edi,esi (v1<<4)^(v1>>5)
add edi,r9d v1+(v1<<4)^(v1>>5)
mov esi,r11d
and esi,3
mov esi,dword ptr [r8+rsi*4] k0=0x3C4ED885
add esi,r11d key[sum&3]+sum
xor esi,edi (key[sum&3]+sum)^(v1+(v1<<4)^(v1>>5))
add eax,esi v0+=(key[sum&3]+sum)^(v1+(v1<<4)^(v1>>5))
add r11d,r10d sum+=del
mov esi,eax v0
shl esi,4 v0<<4 mov edi,eax v0 shr edi,5 v0>>5
xor edi,esi (v0<<4)^(v0>>5)
add edi,eax v0+ (v0<<4)^(v0>>5)
mov esi,r11d sum
shr esi,9 sum>>9
and esi,0Ch (sum>>9)&0xc
mov esi,dword ptr [r8+rsi] key[ (sum>>9)&0xc]
add esi,r11d key[ (sum>>9)&0xc]+sum
xor esi,edi (key[ (sum>>9)&0xc]+sum)^(v0+ (v0<<4)^(v0>>5))
add r9d,esi v1+=(key[ (sum>>9)&0xc]+sum)^(v0+ (v0<<4)^(v0>>5))
dec ecx 00257

这里是一个魔改的tea,在去查找一下程序的密文

exp:

#include<iostream>
#include<stdlib.h>
#include<fstream>
using namespace std;
unsigned int v[] = { 0x2a90bfd5, 0xaa53b7ef, 0xfc23b031, 0xdd985d10, 0xff5ceea4, 0x0ade98c1, 0xc5bb1dd3, 0x60a3d0cc, 0xc02fcca9, 0xdd9f252b, 0x9750cd50, 0x808a76e5 };
unsigned int key[4]{ 0x3c4ed885,0x12af3e87, 0xd6e1b31f,0x25c10aa0 };
void enderpt(int a) {
	unsigned int  del = 0x257* 0x9E3779B9;
	for (int i = 0; i < 0x257; i++)
	{

		v[a + 1] -= (key[((del >> 9) & 0xc)/4] + del) ^ (v[a] + ((v[a] << 4) ^ (v[a] >> 5)));
		del -= 0x9E3779B9;
		v[a] -= (key[del & 3] + del) ^ (v[a + 1]+((v[a + 1] << 4) ^ (v[a + 1] >> 5)));

	}
}
int main()
{
			int num = sizeof(v) / sizeof(unsigned int);
			for (int i = 0; i <num; i+=2)enderpt(i);	
			for (int i = 0; i < num; i++)
			{
				for (int j = 0; j <= 3; j++)
				{
					printf("%c", (((v[i] >> (j * 8))) & 0x7f));//小端序
				}
			}

}

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
本博客已运行 days h m s
The Blog By spr1ng
Thank you for your support.