首页
社区
课程
招聘
[原创]利用call传递静态参数
发表于: 2009-8-18 10:31 8956

[原创]利用call传递静态参数

2009-8-18 10:31
8956

今天逆向一个木马的时候有点小心得,希望能对我这样的菜们有所帮助哈~

出现了一段代码,貌似很乱无意义:
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中修正后的代码(OD中要怎么做?请指导一下……):
DATA:00402E28                 call    loc_402E36
DATA:00402E28 ; ---------------------------------------------------------------------------
DATA:00402E2D aAdvapi32       db 'advapi32',0
DATA:00402E36 ; ---------------------------------------------------------------------------
DATA:00402E36
DATA:00402E36 loc_402E36:                   ; CODE XREF: DATA:00402E28 p
DATA:00402E36                 call    dword ptr [ebp-0EDFh]
DATA:00402E3C                 mov     [ebp-4A9h], eax

这是一种利用call传递参数的方法。终于可以上网搜了(一开始根本无从下手,不知道要搜什么……)。原来在shellcode编写中是常用技巧。
虽然可能是很基本的东西,但在不知道的情况下,能自己分析解决,并学到一些东西,还是小有成就感的。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 462
活跃值: (53)
能力值: ( LV9,RANK:460 )
在线值:
发帖
回帖
粉丝
2
在分析Win32.Virut吗?
2009-8-18 12:39
0
雪    币: 399
活跃值: (38)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
在od中
select->right click->analysis->during next analysis,treat selection as->ascii text
then press ctrl+a to analysis again
2009-8-19 18:51
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了,thanx!
2009-8-20 10:47
0
雪    币: 104
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
FASM里用invoke宏调用函数可以直接传入字符串,就能编译出这种代码。
invoke MessageBox, NULL, "Text", "Caption", MB_OK
2009-12-8 21:43
0
雪    币: 237
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
CallAPI之前的Call其实就是变相的压入这个Call后面的字符串指针。
2009-12-9 11:16
0
雪    币: 112
活跃值: (48)
能力值: ( LV9,RANK:320 )
在线值:
发帖
回帖
粉丝
7
呼呼
push 40h
call @f
db 'charme',0
@@:
push 0
push 0
call MessageBoxA

不就是个这么,,呼呼,,,
2009-12-11 11:25
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
好文好文,简单易懂!
2009-12-21 16:05
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
前两天刚用到过这方法  呵呵
2010-2-22 17:26
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
嗯,倒着看比顺着看麻烦多了。

2010-2-26 22:30
0
雪    币: 208
活跃值: (148)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
此为字符串压栈的宏
macro pushsz str
    local next
    call  next
    db str,0
    next:
endm
2010-3-2 16:57
0
游客
登录 | 注册 方可回帖
返回
//