首页
社区
课程
招聘
代码注入后出错,求解
发表于: 2011-3-27 11:34 5960

代码注入后出错,求解

2011-3-27 11:34
5960
根据下面的连接进行了一个简单的代码注入实验http://home.inf.fh-rhein-sieg.de/~ikarim2s/how2injectcode/code_inject.html
    就是用OD在代码中添加了一个函数,然后让程序跳到这个函数执行,执行完后返回,然后程序就出错了。
    作为实验,那个函数也只有简单的几句。进入函数前做了相关的寄存器入栈保护,返回后普通寄存器值和修改前是一样的。但ST0~ST7的值都被改变了,我把代码注入过程和注入前后软件附上,请大侠帮忙看看,谢谢了!
(1)在00401523处编写函数
(2)在源程序中添加call 00401523
添加前
0401560   .  E8 55020000   call    <jmp.&MFC42.#540>
00401565      8B46 60       mov     eax, dword ptr [esi+60]
00401568      8D4C24 04     lea     ecx, dword ptr [esp+4]
0040156C      50            push    eax
0040156D      68 20304000   push    00403020           

添加call后
00401560   .  E8 55020000   call    <jmp.&MFC42.#540>
00401565   .  E8 B9FFFFFF   call    00401523
0040156A   .  90            nop
0040156B   .  90            nop
0040156C   .  50            push    eax
0040156D   .  68 20304000   push    00403020                   

(3)应为添加call 00401523后覆盖了两条语句,所以需要在00401523处将缺失的语句补上;又因为执行函数前保存了EIP,所以在函数中涉及到与esp相关的操作均要改为esp+4;下面是00401523处最终的函数
00401523  /$  50            push    eax
00401524  |.  56            push    esi
00401525  |.  5E            pop     esi
00401526  |.  58            pop     eax
00401527  |.  8B46 60       mov     eax, dword ptr [esi+60]
0040152A  |.  8D4C24 08     lea     ecx, dword ptr [esp+8]
0040152E  \.  C3            retn

(4)下面给出程序正常执行到0040156C   .  50    push   eax和代码注入后程序执行到此处的寄存器数值截图,注意这里ST0~ST7都改变了,而其他普通寄存器都没变。

(5)单击执行代码注入后的程序,显示如下报错。注意代码注入前后0X73D34597处的代码是同样的,代码注入并未其发生改变

    这么简单的一段代码注入,都没改变什么参数,竟然发生这种情况,实在想不通,苦思良久毫无结果,不知道什么地方做的不对,请大家帮忙看看....

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 69
活跃值: (157)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
lea     ecx, dword ptr [esp+8]  esp改变了,你得到的ecx 不再是原来的ecx了,应该先保存esp,再用esp寻址
2011-3-27 12:08
0
雪    币: 234
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
将00401565        call    00401523
改为              jmp   00401523  

00401523     mov     eax, dword ptr [esi+60]
00401526     lea     ecx, dword ptr [esp+4]
0040152a     jmp         0040156A
试一试。
2011-3-27 12:45
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
4
LS的也对,
不过用Call的话,要注意ESI也是指向堆栈的,所以要用
mov     eax, dword ptr [esi+64]
2011-3-27 14:25
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
采取用
地址1   jmp 地址2
地址2:
   pushad
   添加的代码
   popad
  (jmp修改后 nop覆盖的代码)
jmp  (nop的下一行)
2011-3-27 18:56
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
6
第2个注入代码处没改正确

未HOOK前代码:
00401583    8D5424 04       lea     edx, dword ptr ss:[esp+4]
00401587    8D4E 64         lea     ecx, dword ptr ds:[esi+64]


HOOK后应该是这样
00401B28    50              push    eax
00401B29    56              push    esi
00401B2A    90              nop
00401B2B    90              nop
00401B2C    90              nop
00401B2D    5E              pop     esi
00401B2E    58              pop     eax
00401B2F    8D5424 08       lea     edx, dword ptr ss:[esp+8]
00401B33    8D4E 64         lea     ecx, dword ptr ds:[esi+64]
00401B36    90              nop
00401B37    C3              retn



坐等楼主给分
2011-3-27 19:12
0
雪    币: 93
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=tygyxyw;940817]将00401565        call    00401523
改为              jmp   00401523  

00401523     mov     eax, dword ptr [esi+60]
00401526     lea     ecx, dword p...[/QUOTE]

谢谢,将call改为jmp后目前没有问题了
请问这是为什么呢?
2011-3-27 22:20
0
雪    币: 93
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=Mx¢Xgt;940964]第2个注入代码处没改正确

未HOOK前代码:
00401583    8D5424 04       lea     edx, dword ptr ss:[esp+4]
00401587    8D4E 64         lea     ecx, dword ptr ds:[esi+6...[/QUOTE]

呵呵,我的esi+8了呀,将call改为jmp就对了,好诡异
2011-3-27 22:21
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
9
不是的,是你第2处HOOK代码写错,晕
上传的附件:
2011-3-27 23:00
0
雪    币: 677
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
第二个hook都错了还正常?
2011-3-27 23:08
0
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
11
他两边都改过来的时候 可能改正确了
2011-3-27 23:20
0
雪    币: 93
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
晕,原来是两次注入了
这个程序多次修改注入后,连我自己都忘了
00401583   .  E8 A0050000   call    00401B28
在这里还注入过一次... ...

看了大家给的建议,我在注入前代码里注入了一段新程序,用jmp,就对了。

所以,最终结论是,注入时,call和jmp都是可行的。
非常感谢各位大侠能不被我那么多文字误导,还给出了详细解答!!
2011-3-28 08:27
0
游客
登录 | 注册 方可回帖
返回
//