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小时内删除。
发表评论