Youngter-drive 题解

举报
御麟 发表于 2023/04/26 20:56:29 2023/04/26
【摘要】 ​远方有海,有山有林,远方总是飘扬着你的梦。                ——许达然​编辑1.查壳​编辑 32bit,加了UPX壳2.虚拟机脱壳Youngter-drive脱壳3.静态分析寻找思路​编辑跟进main_0函数 ​编辑线程控制的知识不懂,去搜一下函数createMutexW 函数创建或打开命名或未命名的互斥对象。HANDLE CreateMutexW(        [in, ...

远方有海,有山有林,远方总是飘扬着你的梦。                ——许达然

编辑

1.查壳

编辑

 32bit,加了UPX壳

2.虚拟机脱壳

46e6906fb998e09edc5c6732d3b84a41.jpeg

Youngter-drive脱壳

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是为了实现堆栈的先入后出的数据处理而设置的一个指针。它指向当前堆栈段的位置。

编辑

上述具体过程见视频

1cb870c0c58626531831b78a0fd5def5.jpeg

堆栈不平衡

5.根据加密函数编写wp

char *__cdecl sub_411940(int a1, int a2)
{
  char *result; // eax
  char v3; // [esp+D3h] [ebp-5h]

  v3 = *(_BYTE *)(a2 + a1);
  if ( (v3 < 97 || v3 > 122) && (v3 < 65 || v3 > 90) )
    exit(0);
  if ( v3 < 97 || v3 > 122 )
  {
    result = off_418000[0];
    *(_BYTE *)(a2 + a1) = off_418000[0][*(char *)(a2 + a1) - 38];
  }
  else
  {
    result = off_418000[0];
    *(_BYTE *)(a2 + a1) = off_418000[0][*(char *)(a2 + a1) - 96];
  }
  return result;
}

a1是传入的Source,a2是dword_418008

s = 'QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm' #off_418000
d = 'TOiZiZtOrYaToUwPnToBsOaOapsyS' #off_418004
flag="flag{"
for i in range(len(d)):
    if i%2 == 0:
        flag+=d[i]
    else:
        if(d[i].isupper()):
            flag+=chr(s.find(d[i])+96)
        else:
            flag+=chr(s.find(d[i])+38)
flag+="}"
print(flag)

flag{ThisisthreadofwindowshahaIsES}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。