Youngter-drive 题解
远方有海,有山有林,远方总是飘扬着你的梦。 ——许达然
1.查壳
32bit,加了UPX壳
2.虚拟机脱壳
3.静态分析寻找思路
跟进main_0函数
线程控制的知识不懂,去搜一下函数
createMutexW 函数
创建或打开命名或未命名的互斥对象。
HANDLE CreateMutexW(
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCWSTR lpName
);
特性:
a.独占性-在某个时间点上,只有一个线程拥有互斥,别的线程等待,除非这个线程扔掉后,别的线程才会拥有互斥
b.所有线程都没有互斥时,线程句柄有信号,如果有一个线程拥有互斥,线程句柄无信号CreateThread函数
创建一个在调用进程的虚拟地址空间内执行的线程。
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
__drv_aliasesMem LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);WaitForSingleObject 函数
WaitForSingleObject是一种Windows API函数。当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限。
CloseHandle 函数
关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
查看main函数调用的函数,跟进sub_411190()函数
继续跟进
终于找了与flag直接有关的函数,重命名一下函数便于找
可以知道flag存在Dest之中,跟进
Source
找到off_418004跟进
继续跟进aToiziztoryatou
没有头绪
Source要想和aToiziztoryatou相等,一定是在别的地方有过操作,交叉引用看一下
有一处调用为此函数
我们知道Source就是输入的字符串
然后复制给了Dest
那么Source输入之后修改过没有,查看一下别的修改Source的函数
跟进这个函数
发现存在堆栈不平衡的问题
4.处理堆栈不平衡问题
转到汇编代码,在option中开启stack pointer
SP值变成了负数,修改成0才能使得堆栈保持平衡
在堆栈不平衡处按下Alt+K(SP值为负数的上一个call函数位置),修改SP值
SP是为了实现堆栈的先入后出的数据处理而设置的一个指针。它指向当前堆栈段的位置。
上述具体过程见视频
5.根据加密函数编写wp
a1是传入的Source,a2是dword_418008
flag{ThisisthreadofwindowshahaIsES}
- 点赞
- 收藏
- 关注作者
评论(0)