网站建议:179001057@qq.com

利用call传递静态参数

技术2022-05-12  3

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

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)