BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #80449同步于 2014/6/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[心得]关于《shellcode》一文

gdl
2014/6/24镜像同步19 回复
应论坛上某同学的要求,写这篇帖子对http://bbs.byr.cn/#!article/CPP/80412做个说明。谈不上什么教程和科普,纯粹的操作演示而已。 前置知识:汇编 shellcode 环境:WinXP 工具:VC 6.0 ollydbg 说明:其实ollydbg不是必须的,VC本身就自带汇编调试,我只是习惯了ollydbg。 一、 调试用代码 //shellcode根据分析结果做了如下注释 unsigned char ShellCode[] = { /***解码程序开始***/ 0x68,0x5E,0xFF,0xE6,0x90,0x8B,0xCC,0xFF,0xD1,0x83,0xC6,0x15,0xB9,0xE1,0xFF,0xFF, 0xFF,0xF7,0xD1,0x81,0x36,0xF9,0xF9,0xF9,0xF9,0x83,0xC6,0x04,0xE2,0xF5, /***解码程序结束***/ /***待解码数据开始***/ 0x37,0x2B, 0x2C,0x04,0x2D,0x23,0x4A,0x16,0x44,0x51,0x2B,0x42,0x41,0x0F,0x29,0x3C,0x36,0x5B, 0x49,0x4B,0x31,0x52,0x33,0x4C,0x28,0x10,0x33,0x2B,0x5A,0x55,0x49,0x15,0x40,0x52, 0x4C,0x21,0x4C,0x1A,0x2D,0x23,0x48,0x48,0x47,0x50,0x58,0x5A,0x31,0x1E,0x40,0x02, 0x3D,0x1A,0x2A,0x29,0x29,0x32,0x31,0x5D,0x45,0x2A,0x31,0x12,0x5A,0x55,0x3E,0x12, 0x4E,0x5B,0x45,0x0B,0x39,0x03,0x4C,0x44,0x8D,0x96,0x94,0x9B,0x92,0x9C,0x9C,0x89, 0x9C,0x8B,0xB9,0x81,0x9F,0x96,0x9A,0x8C,0x8A,0xD7,0x96,0x8B,0x9E,0x58,0x5A,0x3E, 0x12,0x4B,0x42,0x2B,0x53,0x40,0x52,0x46,0x53,0x2C,0x1B,0x4F,0x37, 0x29,0x3C,0x36, 0x5B,0x58,0x5A,0xF4,0xF3,0x69 /***待解码数据结束***/ }; int main() { __asm { lea eax, ShellCode push eax ret } return 0; } 以上代码以VC编译出debug版本,然后用ollydbg载入就可以开始调试了。 二、 ollydbg调试 说明:以下有些内容涉及到一些基本的调试常识,可自行百度 ollydbg载入程序后停在程序入口,然后根据VC debug版本常识找到main函数入口,如下: 00401010 >|> \55 push ebp 00401011 |. 8BEC mov ebp, esp 00401013 |. 83EC 40 sub esp, 40 00401016 |. 53 push ebx 00401017 |. 56 push esi 00401018 |. 57 push edi 00401019 |. 8D7D C0 lea edi, dword ptr [ebp-40] 0040101C |. B9 10000000 mov ecx, 10 00401021 |. B8 CCCCCCCC mov eax, CCCCCCCC 00401026 |. F3:AB rep stos dword ptr es:[edi] 00401028 |. 8D05 304A4200 lea eax, dword ptr [ShellCode]//这里由于是调试debug版本,有符号表,被ollydbg自动识别了 0040102E |. 50 push eax 0040102F \. C3 retn 从地址00401028出看出,这就是我们在代码中的内联汇编代码(注:地址00401028根据环境不同结果会不一样),在0040102f处下断点,然后f9运行,程序会断在此处,然后f8单步步过调试。接下来就会进入shellcode了,整个如下: 00424A30 > 68 5EFFE690 push 90E6FF5E 00424A35 8BCC mov ecx, esp 00424A37 FFD1 call ecx 00424A39 83C6 15 add esi, 15 00424A3C B9 E1FFFFFF mov ecx, -1F 00424A41 F7D1 not ecx 00424A43 8136 F9F9F9F9 xor dword ptr [esi], F9F9F9F9 00424A49 83C6 04 add esi, 4 00424A4C ^ E2 F5 loopd short 00424A43 00424A4E 37 aaa/**********************/ 00424A4F 2B2C04 sub ebp, dword ptr [esp+eax] 00424A52 2D 234A1644 sub eax, 44164A23 00424A57 51 push ecx 00424A58 2B42 41 sub eax, dword ptr [edx+41] 00424A5B 0F293C36 movaps dqword ptr [esi+esi], xmm7 00424A5F 5B pop ebx 00424A60 49 dec ecx 00424A61 4B dec ebx 00424A62 3152 33 xor dword ptr [edx+33], edx 00424A65 4C dec esp 00424A66 2810 sub byte ptr [eax], dl 00424A68 332B xor ebp, dword ptr [ebx] 00424A6A 5A pop edx 00424A6B 55 push ebp 00424A6C 49 dec ecx 00424A6D 15 40524C21 adc eax, 214C5240 00424A72 4C dec esp 00424A73 1A2D 23484847 sbb ch, byte ptr [47484823] 00424A79 50 push eax 00424A7A 58 pop eax 00424A7B 5A pop edx 00424A7C 311E xor dword ptr [esi], ebx 00424A7E 40 inc eax 00424A7F 023D 1A2A2929 add bh, byte ptr [29292A1A] 00424A85 3231 xor dh, byte ptr [ecx] 00424A87 5D pop ebp 00424A88 45 inc ebp 00424A89 2A31 sub dh, byte ptr [ecx] 00424A8B 125A 55 adc bl, byte ptr [edx+55] 00424A8E 3E:124E 5B adc cl, byte ptr [esi+5B] 00424A92 45 inc ebp 00424A93 0B39 or edi, dword ptr [ecx] 00424A95 034C44 8D add ecx, dword ptr [esp+eax*2-73] 00424A99 96 xchg eax, esi 00424A9A 94 xchg eax, esp 00424A9B 9B wait 00424A9C 92 xchg eax, edx 00424A9D 9C pushfd 00424A9E 9C pushfd 00424A9F 899C8B B9819F96 mov dword ptr [ebx+ecx*4+969F81B9], > 00424AA6 9A 8C8AD796 8B9>call far 9E8B:96D78A8C 00424AAD 58 pop eax 00424AAE 5A pop edx 00424AAF 3E:124B 42 adc cl, byte ptr [ebx+42] 00424AB3 2B53 40 sub edx, dword ptr [ebx+40] 00424AB6 52 push edx 00424AB7 46 inc esi 00424AB8 53 push ebx 00424AB9 2C 1B sub al, 1B 00424ABB 4F dec edi 00424ABC 37 aaa 00424ABD 293C36 sub dword ptr [esi+esi], edi 00424AC0 5B pop ebx 00424AC1 58 pop eax 00424AC2 5A pop edx 00424AC3 F4 hlt 00424AC4 F3: prefix rep: 00424AC5 6900 00000000 imul eax, dword ptr [eax], 0 接下来对解码程序做详细说明,从地址00424a30开始到00424a4c这段解码程序也是楼主认为该shellcode的精华所在。 从地址00424a30开始继续f8调试,分析过程见注释: 00424A30 > 68 5EFFE690 push 90E6FF5E //数据90E6FF5E入栈,此时esp=0x0012ff30 00424A35 8BCC mov ecx, esp //ecx=0x12ff30 00424A37 FFD1 call ecx //调用函数,当调试到这一步时,f7单步步入进入该函数 { //通过观察,就会发现00424a30处压入的数据90E6FF5E已经成为如下代码 //从栈顶pop到esi寄存器一个数据,那么这个数据是什么呢? //再联想到我们是通过call指令进入的,其实call指令简单来讲进行了两个步骤: //1.push返回地址也就是call指令的下一条指令的地址2.跳转到函数处执行 //明白了后,就清楚知道了,pop后esi存储的是函数地址地址00424a39 //然后跳转到该地址执行 0012FF30 5E pop esi 0012FF31 FFE6 jmp esi 0012FF33 90 nop } 00424A39 83C6 15 add esi, 15 //执行后esi=0x00424a4e,0x00424a39 + 0x15 = 0x00424a4e 00424A3C B9 E1FFFFFF mov ecx, -1F 00424A41 F7D1 not ecx //此时ecx=0x1e,十进制的30 00424A43 8136 F9F9F9F9 xor dword ptr [esi], F9F9F9F9 00424A49 83C6 04 add esi, 4 00424A4C ^ E2 F5 loopd short 00424A43 //以上3行代码就是开始解码了,loopd循环指令,以ecx为计数器 在00424a43发现是对esi处的数据每四字节和0xf9f9f9f9进行异或操作。在f8运行到这一步时,esi=0x00424a4e,在ollydbg的数据窗口右键:转到->表达式。然后输入00424a4e就可以观察该块的数据了。 这里需要循环执行30次,为了看见效果,我在00424a4c下了一个断点,然后f9执行,这样你就可以看见从00424a4e开始数据的变化了。执行完后,如下: 00424A4E CE D2 D5 FD D4 DA B3 EF BD A8 D2 BB B8 F6 D0 C5 我正在筹建一个信 00424A5E CF A2 B0 B2 C8 AB CA B5 D1 E9 CA D2 A3 AC B0 EC 息安全实验室,办 00424A6E B9 AB B5 D8 B5 E3 D4 DA B1 B1 BE A9 A1 A3 C8 E7 公地点在北京。如 00424A7E B9 FB C4 E3 D3 D0 D0 CB C8 A4 BC D3 C8 EB A3 AC 果你有兴趣加入, 00424A8E C7 EB B7 A2 BC F2 C0 FA B5 BD 74 6F 6D 62 6B 65 请发简历到tombke 00424A9E 65 70 65 72 40 78 66 6F 63 75 73 2E 6F 72 67 A1 eper@xfocus.org 00424AAE A3 C7 EB B2 BB D2 AA B9 AB BF AA D5 E2 B6 CE D0 G氩灰???舛涡 00424ABE C5 CF A2 A1 A3 0D 0A 90 00 00 00 00 00 00 00 00 畔ⅰ?.?....... 这时,我发现基本信息是出来了,但是后面一串乱码,刚开始楼主实在是不知道这是什么,后来楼主在写这篇帖子的时候,发现解码后最后三字节数据是0D 0A 90,发现了最熟悉的0D0A,这也就是windows下的回车换行‘\r\n’,我就试了试其他编码,数据窗口中右键:文本->ascii(64),完整的信息出来了,如下: 00424A4E 我正在筹建一个信息安全实验室,办公地点在北京。如果你有兴趣加入, 00424A8E 请发简历到tombkeeper@xfocus.org。请不要公开这段信息。..?....... 至此,整个过程就结束了。 其实如果细心,你就会发现待解码数据开始的地址是0x00424a4e,那么你往上看看我最初给的shellcode汇编码,是不是也有一行代码的地址也是0x00424a4e, 00424A4E 37 aaa/**********************/ 这时,就很清楚从地址00424a30开始到00424a39这段代码其实就是动态定位shellcode中待解码数据的起始位置了,这段代码在楼主眼中那是相当耀眼。此时,再结合我在最初调试代码中对shellcode的注释,相信大家就很明了了。 PS:希望大家看了之后,不要对外公开,好东西自己留着,比如偷偷发个简历过去什么的。哎呀,我太坏了
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
gaoweiwei机器人#1 · 2014/6/24
shellcode啊,不错
gdl机器人#2 · 2014/6/24
http://bbs.byr.cn/#!article/CPP/80412,是这一篇里面的,有人说不知道怎么解出来的,叫我写的教程什么。 【 在 gaoweiwei 的大作中提到: 】 : shellcode啊,不错
gaoweiwei机器人#3 · 2014/6/24
nice,技术贴 【 在 gdl 的大作中提到: 】 : http://bbs.byr.cn/#!article/CPP/80412,是这一篇里面的,有人说不知道怎么解出来的,叫我写的教程什么。
ak47机器人#4 · 2014/6/24
好厉害,问下楼主是研几的? 来自「北邮人论坛手机版」
Monologue机器人#5 · 2014/6/24
单步调试到00424A30 > 68 5EFFE690 push 90E6FF5E 这句就停在这了是怎么个情况?
gdl机器人#6 · 2014/6/24
这……你这样说,我怎么知道呢。看看ollydbg左下角显示的是什么,实在不行重来一遍 【 在 Monologue 的大作中提到: 】 : 单步调试到00424A30 > 68 5EFFE690 push 90E6FF5E 这句就停在这了是怎么个情况?
Monologue机器人#7 · 2014/6/24
access violation when executing 【 在 gdl 的大作中提到: 】 : 这……你这样说,我怎么知道呢。看看ollydbg左下角显示的是什么,实在不行重来一遍
Monologue机器人#8 · 2014/6/24
搞定了。。。郁闷~换了台电脑就好了。。。昨天就卡在这的。。不过中文都是乱码~就看到了邮箱~
gdl机器人#9 · 2014/6/24
被大神赞扬,饭都能多吃一碗了 【 在 gaoweiwei 的大作中提到: 】 : nice,技术贴