利用call传递静态参数

    技术2022-05-12  26

    今天逆向的时候出现了一段代码,貌似很乱无意义:

    00402E28    E8 09000000     CALL t.00402E36

    00402E2D    61              POPAD

    00402E2E    64:76 61        JBE SHORT t.00402E92                   

    00402E31    70 69           JO SHORT t.00402E9C

    00402E33    3332            XOR ESI,DWORD PTR DS:[EDX]

    00402E35    00FF            ADD BH,BH

    00402E37    95              XCHG EAX,EBP

    00402E38    21F1            AND ECX,ESI

    00402E3A    FFFF            ???                                    

    00402E3C    8985 57FBFFFF   MOV DWORD PTR SS:[EBP-4A9],EAX

     

    执行的时候变成:

    …………(看不到,向上翻就变回去了。以为是花指令,没管它继续向下执行)

    00402E36    FF95 21F1FFFF   CALL DWORD PTR SS:[EBP-EDF]; kernel32.LoadLibraryA

    00402E3C    8985 57FBFFFF   MOV DWORD PTR SS:[EBP-4A9],EAX

    而且居然还能顺利运行,并返回结果advapi32.77DA0000

    觉得非常奇怪,为什么没有push参数却能执行呢?

     

    重新执行一遍,观察堆栈。发现call  LoadLibraryA之前ESP为:

    0012EFB4   00402E2D  返回到 t.00402E2D 来自 t.00402E36

    这是没错的,因为前面的call会将其下一句压栈。难道返回地址也能做参数?

    ……

    突然灵光一闪(不是一下子就想出来的,惭愧啊惭愧)

    中间那段根本不是代码也不是花指令,而是字符串!

    数据与代码的混合使反汇编出现无意义代码。00其实是字符串的结尾。LoadLibrary的参数是指向字符串的指针,而那个返回值就指向字符串的首地址。所有的都解释得通了。

     

    IDA中修正后的代码:

    DATA:00402E28                 call    loc_402E36

    DATA:00402E28 ; ---------------------------------------------------------------------------

    DATA:00402E2D aAdvapi32       db 'advapi32',0

    DATA:00402E36 ; ---------------------------------------------------------------------------

    DATA:00402E36

    DATA:00402E36 loc_402E36:                                  ; CODE XREF: DATA:00402E28p

    DATA:00402E36                 call    dword ptr [ebp-0EDFh]

    DATA:00402E3C                 mov     [ebp-4A9h], eax

     

    这是一种利用call传递参数的方法。终于可以上网搜了(一开始根本无从下手,不知道要搜什么……)。原来在shellcode编写中是常用技巧。

    虽然可能是很基本的东西,但在不知道的情况下,能自己分析解决,并学到一些东西,还是小有成就感的。


    最新回复(0)