首页
社区
课程
招聘
[旧帖] [求助]如何把shellcode变成汇编代码? 0.00雪花
发表于: 2008-9-9 13:27 4714

[旧帖] [求助]如何把shellcode变成汇编代码? 0.00雪花

2008-9-9 13:27
4714
unsigned char scode[] =
"\xb8\x12\x00\xcd\x10\xbd\x18\x7c\xb9\x18\x00\xb8\x01\x13\xbb\x0c"
"\x00\xba\x1d\x0e\xcd\x10\xe2\xfe\x49\x20\x61\x6d\x20\x76\x69\x72"
"\x75\x73\x21\x20\x46\x75\x63\x6b\x20\x79\x6f\x75\x20\x3a\x2d\x29";

这段code来自木马gh0st的硬盘锁部分,想看完整的硬盘锁自己可以下来看。我想知道这段code如何才能变成汇编代码,最好是图文并茂解说……
最重要的,我要知道在这段汇编代码中,ES是什么时候赋值的……

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
2
为什么我的帖子老要我自己顶呢?
唉,高手快来啊~
2008-9-9 17:38
0
雪    币: 222
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
方法太多了,有耐心就在OD里一个个粘
2008-9-9 18:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
4
汗,就是方法多为什么回的人不多?
而且LS太笼统了,怎么粘?
2008-9-9 18:12
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没有上传图片的权限,就口头描述一下,给个最简单的方法吧。

用UltraEdit-32(或者任意一款Hex编辑器)把你的代码生成一个文件,比如 dump.bin。如果是32位的程序,就用OllyDBG就行了,菜单 View->File,然后选刚才的 dump.bin,在新打开的窗口里面点右键选Disassemble就行了,送佛送到西,顺便贴一下内容好了。

00000000   /B8 1220CD10     mov     eax, 10CD2012
00000005    BD 187CB918     mov     ebp, 18B97C18
0000000A    20B8 0113BB0C   and     byte ptr [eax+CBB1301], bh
00000010    20BA 1D0ECD10   and     byte ptr [edx+10CD0E1D], bh
00000016  - E2 FE           loopd   short 00000016
00000018    49              dec     ecx
00000019    2061 6D         and     byte ptr [ecx+6D], ah
0000001C    2076 69         and     byte ptr [esi+69], dh
0000001F  - 72 75           jb      short 00000096
00000021  - 73 21           jnb     short 00000044
00000023    2046 75         and     byte ptr [esi+75], al
00000026    636B 20         arpl    word ptr [ebx+20], bp
00000029  - 79 6F           jns     short 0000009A
0000002B  - 75 20           jnz     short 0000004D
0000002D    3A              ???
0000002E    2D              ???
0000002F    29              ???

一看代码这么乱,那就换16位试一下吧。
打开cmd,切换到dump.bin目录下,输入debug dump.bin
提示符下输入 u 和 d 命令,自己看吧,q 是退出。

-u
0B58:0100 B81220        MOV     AX,2012
0B58:0103 CD10          INT     10
0B58:0105 BD187C        MOV     BP,7C18
0B58:0108 B91820        MOV     CX,2018
0B58:010B B80113        MOV     AX,1301
0B58:010E BB0C20        MOV     BX,200C
0B58:0111 BA1D0E        MOV     DX,0E1D
0B58:0114 CD10          INT     10
0B58:0116 E2FE          LOOP    0116
0B58:0118 49            DEC     CX
0B58:0119 20616D        AND     [BX+DI+6D],AH
0B58:011C 207669        AND     [BP+69],DH
0B58:011F 7275          JB      0196
-d
0B58:0100  B8 12 20 CD 10 BD 18 7C-B9 18 20 B8 01 13 BB 0C   .. ....|.. .....
0B58:0110  20 BA 1D 0E CD 10 E2 FE-49 20 61 6D 20 76 69 72    .......I am vir
0B58:0120  75 73 21 20 46 75 63 6B-20 79 6F 75 20 3A 2D 29   us! Fuck you :-)
0B58:0130  00 75 05 2E FF 06 94 90-2E 80 3C 00 75 19 A9 01   .u........<.u...
0B58:0140  00 75 09 2E C7 06 96 90-02 00 EB 0E 50 B0 03 B4   .u..........P...
0B58:0150  FF E8 9E 00 58 EB 03 E8-1D 01 58 C3 F9 C3 55 51   ....X.....X...UQ
0B58:0160  26 8A 4F 08 32 ED 0B C9-74 0D 8D 6F 09 E8 19 04   &.O.2...t..o....
0B58:0170  73 08 E8 0E 00 E2 F6 F9-EB 06 2E 89 2E A9 90 F8   s...............
-q

看样子,前面是指令,后面是字符串。至于具体这段代码做什么的,我就不清楚了,也没兴趣,你自己分析吧。

PS:谁能推荐个好用的可以外链的图片空间吗?贴图省事多了,不用打这么多垃圾了。。。
2008-9-9 23:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
6
我按照LS的步骤得到的如下面
C:\>debug 1.bin
-u
0B81:0100 B81200        MOV     AX,0012
0B81:0103 CD10          INT     10
0B81:0105 BD187C        MOV     BP,7C18
0B81:0108 B91800        MOV     CX,0018
0B81:010B B80113        MOV     AX,1301
0B81:010E BB0C00        MOV     BX,000C
0B81:0111 BA1D0E        MOV     DX,0E1D
0B81:0114 CD10          INT     10
0B81:0116 E2FE          LOOP    0116
0B81:0118 49            DEC     CX
0B81:0119 20616D        AND     [BX+DI+6D],AH
0B81:011C 207669        AND     [BP+69],DH
0B81:011F 7275          JB      0196
-

不知道怎么回事,好像LS得到的有点问题,比如第一条命令MOV     AX,2012,传过去AH=20,但是INT     10有功能号20吗?
2008-9-10 12:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
自己写一段程序,利用Visual Studio的Go To Disassembly 功能可以得到反汇编程序。
程序如下:

#include "stdafx.h"

unsigned char scode[] =
"\xb8\x12\x00\xcd\x10\xbd\x18\x7c\xb9\x18\x00\xb8\x01\x13\xbb\x0c"
"\x00\xba\x1d\x0e\xcd\x10\xe2\xfe\x49\x20\x61\x6d\x20\x76\x69\x72"
"\x75\x73\x21\x20\x46\x75\x63\x6b\x20\x79\x6f\x75\x20\x3a\x2d\x29";

int _tmain(int argc, _TCHAR* argv[])
{
        unsigned char* p = scode;

        return 0;
}

步骤如下:

1 在语句return 0;下个断点;
2 运行程序,当程序在断点处停下后,获得指针p的值;
3 选择Visual Studio的右键菜单Go To Disassembly ,我们将得到整个程序的汇编命令;
4 在Address输入框中输入指针p的值,我们将跳到scode的汇编代码处。

最后得到的汇编指令如下:
mov         eax,10CD0012h
mov         ebp,18B97C18h
add         byte ptr [eax+0CBB1301h],bh
add         byte ptr [edx+10CD0E1Dh],bh
loop        011D7016
dec         ecx  
and         byte ptr [ecx+6Dh],ah
and         byte ptr [esi+69h],dh
jb          011D7096
jae         011D7044
and         byte ptr [esi+75h],al
arpl        word ptr [ebx+20h],bp
jns         011D709A
jne         011D704D
cmp         ch,byte ptr ds:[00000029h]

不过这样做要有个前提,数组中的汇编指令集必须和Visual Studio中用的汇编指令集一样才行。
所以你要得到正确的汇编程序,首先你必须知道这个数组中的汇编语言属于那种汇编指令集。
2008-9-10 13:26
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
自己手动输入的,写错了。。。。
2008-9-10 15:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
msy
9
不需要手动输入啊,在CMD下可以复制粘贴的
2008-9-10 17:55
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你的那个shellcode我是自己打到 UltrEdit32 里面的。。。抄错了。。。
2008-9-10 21:29
0
游客
登录 | 注册 方可回帖
返回
//