BUUCTF-Youngter-drive 双线程的思考
阅读原文时间:2023年08月15日阅读:1

拿到后先upx脱壳,然后直接进

从上向下看

应该是输入

慢慢看

明显的加密

这个函数大概是个加密

但是这个sleep函数是什么鬼???

以下将拓展些许有关“线程”的概念:

    一个程序在运行时占用整个进程,一个进程可以建立多个线程。这些线程能够并行(指同时进行代码处理)以加快程序的运行速度。线程的定义不在这里赘述,以下内容为线程在运用过程中的知识。

    线程能分为 “对等线程”  “分离线程” 和 “主线程”

    当一个处理器在处理一个线程时遇到慢速系统调用(sleep、read等)等需要消耗较多时间的处理需求时,控制便通过上下文切换传送到下一个对等进程

StartAddress 与 sub_41119F 均有一个sleep函数。当该进程进行到该函数时,控制自动切换到另外一个线程并运行,并在另外一个线程中遇到Sleep,则又切换回原进程,因此才有加密 15 次

    但上述也提到,线程是并行的。这两个线程并不是严谨的交替,而是因为Sleep(0x64)这段时间足够将线程中的所有内容运行结束而有余,因此才造成了交替运行的结果

   注:Sleep函数的参数以毫秒为单位

和一个进程相关的线程将会组成一个对等线程池,独立于其他线程创立的子线程

    主线程是所有对等线程中优先级最高的线程(这是它们的唯一区别)

    不过对于上述线程的分类,还有一个更加合理的分类: “可结合” 与 “分离”

    可结合的线程能够被任何其他线程回收或关闭,且在回收之前,其占用的内存资源不会释放;可分离的线程则不可被其他线程关闭,其内存资源将在终止时自动释放

 

    另外一个需要注意的是不同线程间的共享变量

    一个进程将被加载入一块虚拟内存,而其创造的所有线程都能够访问虚拟内存的任何地方

    也就是说,线程的虚拟内存总是共享的;相反的,其寄存器从不会共享,不同线程无法调用其他线程的寄存器

    既然虚拟内存是共享的,也就是说,每个线程的栈堆是共享的;只要线程能够获取其他线程的指针,就能够调用该线程的栈堆(由此也可推出:将一个线程中的变量入栈,则其他线程便能够调用它)

我们少了最后一位,不知道是个啥。应该是个大小写字母。

但是不知道具体是什么,可以一个一个试出flag

看别人wp说是E,他们除了爆破的方法,就没了。我也不太清楚为啥是E。