shellcode转换为汇编代码的⽅法
0x00 shellcode
这段是楼主最近在看历史中的exp时发现的shellcode,功能是弹计算器,在09年时使⽤很⼴泛,但是没有到相关的分析⽂献,准备有时
间研究下。
0xdb 0xc0 0x31 0xc9 0xbf 0x7c 0x16 0x70 0xcc 0xd9 0x74 0x24 0xf4 0xb1 0x1e 0x58 0x31 0x78 0x18 0x83 0xe8 0xfc 0x03 0x78 0x68 0xf4 0x85 0x30 0x7放⼀张全景图:
这⾥使⽤3种⽅法转换shellcode:
1. windbg⼯具转换shellcode
2. linux下转换shellcode
3. ollydbg⼯具转换shellcode
0x01 windbg⼯具转换shellcode
基本思路
windbg作为windows调试神器,能以各种姿势调戏内存,将⼀段16进制的shellcode转化成汇编也不在话下。
先开辟⼀段内存空间,写⼊shellcode, 再反汇编这段数据,搞定。
调试过程
0:009> .dvalloc1000# 申请1000个字节的内存
Allocated 1000 bytes starting at 01190000# 内存起始地址为01190000
# eb ⽤来写⼊shellcode到内存
0:000> eb 011900000xdb0xc00x310xc90xbf0x7c0x160x700xcc0xd90x740x240xf40xb10x1e0x580x310x780x180x830xe80xfc0x03
0:000> u 01190000# 反汇编,默认⼀次输出8⾏汇编代码
01190000 dbc0            fcmovnb st,st(0)
0119000231c9            xor    ecx,ecx
01190004 bf7c1670cc      mov    edi,0CC70167Ch
01190009 d97424f4        fnstenv [esp-0Ch]
0119000d b11e            mov    cl,1Eh
0119000f 58pop    eax
01190010317818          xor    dword ptr [eax+18h],edi
0119001383e8fc          sub    eax,0FFFFFFFCh
0:000> u # 继续反汇编
01190016037868add    edi,dword ptr [eax+68h]
01190019 f4              hlt
0119001a 8530            test    dword ptr [eax],esi
0119001c 78bc            js      0118ffda
0119001e 65c9            leave
0119002078b6            js      0118ffd8
0119002223f5            and    esi,ebp
01190024 f3b4ae          rep mov ah,0AEh
0:000> u
011900277d02            jge    0119002b
01190029 aa              stos    byte ptr es:[edi]
0119002a 3a32            cmp    dh,byte ptr [edx]
0119002a 3a32            cmp    dh,byte ptr [edx]
0119002c 1cbf            sbb    al,0BFh
0119002e 62
0119002f ed              in      eax,dx
011900301d54d56629      sbb    eax,2966D554h
0119003521e7and    edi,esp
0:000> u
0119003796              xchg    eax,esi
0119003860              pushad
01190039 f5              cmc
0119003a 71ca            jno    01190006
0119003c 06push    es
0119003d 35f514c77c      xor    eax,7CC714F5h
01190042 fb              sti
011900431b056bf027dd    sbb    eax,dword ptr ds:[0DD27F06Bh]
0:000> u
0119004948dec    eax
0119004a fd              std
0119004b 2238and    bh,byte ptr [eax]
0119004d 1ba2e8c3f73b    sbb    esp,dword ptr [edx+3BF7C3E8h]
011900537acf            jp      01190024
011900554c              dec    esp
011900564f              dec    edi
0119005723d3            and    edx,ebx
0:000> u
0119005953push    ebx
0119005a a4              movs    byte ptr es:[edi],byte ptr [esi]
0119005b 57push    edi
0119005c f7d8            neg    eax
0119005e 3b838e831f57    cmp    eax,dword ptr [ebx+571F838Eh]
0119006453push    ebx
011900656451push    ecx
01190067 a133cdf5c6      mov    eax,dword ptr ds:[C6F5CD33h]
0:000> u
0119006c f5              cmc
0119006d c17e98f5        sar    dword ptr [esi-68h],0F5h
01190071 aa              stos    byte ptr es:[edi]
01190072 f1
0119007305a826993d      add    eax,3D9926A8h
011900783bc0            cmp    eax,eax
0119007a d9fe            fsin
0119007c 51push    ecx
0:000> u
0119007d 61              popad
0119007e b60e            mov    dh,0Eh
011900802f              das
011900818519            test    dword ptr [ecx],ebx
0119008387b7782f5990    xchg    esi,dword ptr [edi-6FA6D088h]
011900897bd7            jnp    01190062
0119008b 057fe87bca      add    eax,0CA7BE87Fh
0x02 linux下转换shellcode
ubuntu环境
➜~ cat /etc/issue
Ubuntu 16.04.2 LTS \n\l
基本思路
将shellcode以⼆进制格式存储成⽂件,再使⽤⼯具(nasm)反汇编。调试过程
1. 安装⼯具
➜  ~ sudo apt-get install nasm
2. 使⽤脚本⽣成shellcode⼆进制⽂件
➜  ~ python gen_shellcode.py
3. gen_shellcode.py源码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
a = "\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"\
"\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"\
"\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"\
"\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"\
"\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"\
"\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"\
"\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"\
"\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"\
"\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"\
"\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"\
"\x7f\xe8\x7b\xca"
with open("", 'wb') as fp:
fp.write(a)
4. 查看⽣成的shellcode⼆进制⽂件
➜  ~
0000000 c0db c931 7cbf 7016 d9cc 2474 b1f4 581e
000001078318318 fce8 7803 f468 3085 bc78 c965
0000020 b678 f523 b4f3 7dae aa02 323a bf1c ed62
0000030541d 66d5 212996e7 f560 ca71 350614f5
00000407cc7 1bfb 6b05 27f0 48dd 22f d 1b38 e8a2
0000050 f7c3 7a3b 4ccf 234f53d3 57a4 d8f7 833b
0000060838e 571f6453 a151 cd33 c6f5 c1f5 987e
0000070 aaf5 05f1 26a8 3d99 c03b fed9 61510eb6
0000080852f871978b7 592f7b90 05d7 e87f ca7b
0000090
5. 使⽤intel指令集反汇编shellcode
➜  ~ -p intel
00000000  DBC0              fcmovnb st0
0000000231C9              xor cx,cx
00000004  BF7C16            mov di,0x167c
0000000770CC              jo 0xffd5
00000009  D97424            fnstenv [si+0x24]
0000000C  F4                hlt
0000000D  B11E              mov cl,0x1e
0000000F  58pop ax
00000010317818            xor [bx+si+0x18],di
0000001383E8FC            sub ax,byte -0x4
00000016037868add di,[bx+si+0x68]
00000019  F4                hlt
0000001A  8530              test [bx+si],si
0000001A  8530              test [bx+si],si
0000001C  78BC              js 0xffda
0000001E  65C9              gs leave
0000002078B6              js 0xffd8
0000002223F5              and si,bp
00000024  F3B4AE            rep mov ah,0xae
000000277D02              jnl 0x2b
00000029  AA                stosb
0000002A  3A32              cmp dh,[bp+si]
0000002C  1CBF              sbb al,0xbf
0000002E  62                db 0x62
0000002F  ED                in ax,dx
shell代码
000000301D54D5            sbb ax,0xd554
00000033662921sub [bx+di],esp
00000036  E796              out0x96,ax
0000003860                pushaw
00000039  F5                cmc
0000003A  71CA              jno 0x6
0000003C  06push es
0000003D  35F514            xor ax,0x14f5
00000040  C7                db 0xc7
000000417CFB              jl 0x3e
000000431B05              sbb ax,[di]
000000456BF027            imul si,ax,byte +0x27
00000048  DD48FD            fisttp qword [bx+si-0x3]
0000004B  2238and bh,[bx+si]
0000004D  1BA2E8C3          sbb sp,[bp+si-0x3c18]
00000051  F73B              idiv word [bp+di]
000000537ACF              jpe 0x24
000000554C                dec sp
000000564F                dec di
0000005723D3              and dx,bx
0000005953push bx
0000005A  A4                movsb
0000005B  57push di
0000005C  F7D8              neg ax
0000005E  3B838E83          cmp ax,[bp+di-0x7c72]
000000621F                pop ds
0000006357push di
0000006453push bx
000000656451              fs push cx
00000067  A133CD            mov ax,[0xcd33]
0000006A  F5                cmc
0000006B  C6                db 0xc6
0000006C  F5                cmc
0000006D  C17E98F5          sar word [bp-0x68],byte 0xf5
00000071  AA                stosb
00000072  F1                int1
0000007305A826            add ax,0x26a8
0000007699                cwd
000000773D3BC0            cmp ax,0xc03b
0000007A  D9FE              fsin
0000007C  51push cx
0000007D  61                popaw
0000007E  B60E              mov dh,0xe
000000802F                das
000000818519              test [bx+di],bx
0000008387B7782F          xchg si,[bx+0x2f78]
0000008759pop cx
0000008890nop
000000897BD7              jpo 0x62
0000008B  057FE8            add ax,0xe87f
0000008E  7BCA              jpo 0x5a
ndisasm反汇编⼯具的其他选项还是可以探索下的,⽐如32位和64位,AT&T,AMD, Intel各种指令集的不同,对反汇编都有影响。
0x03 ollydbg ⼯具转换shellcode
基本思路
将shellcode的16进制数据copy到ollydbg⼯具的反汇编窗⼝中,即可完成。
调试步骤
1. 格式化shellcode
放⼀张全景图:
2. 在ollydbg中打开任意⼀个exe⽂件
3.
在反汇编窗⼝中选中⾜够的⾏数,⿏标右击-⼆进制-⼆进制粘贴。 db c0 31 c9 bf 7c 16 70 cc d9 74 24 f4 b1 1e 58 31 78 18 83 e8 fc 03 78 68 f4 85 30 78 bc 65 c9 78 b6 23 f5 f3 b4 ae 7d 02 aa 3a 32 1c bf 62

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。