Youngter-drive 题解

文章描述了一个逆向工程的过程,包括32位加壳程序的脱壳,通过静态分析跟进main函数,了解createMutexW和CreateThread等线程控制函数,以及如何处理堆栈不平衡问题。最后,解析加密函数并编写解密代码来获取flag。
摘要由CSDN通过智能技术生成

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

1.查壳

 32bit,加了UPX壳

2.虚拟机脱壳

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

上述具体过程见视频

堆栈不平衡

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}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烨鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值