返回信息流应论坛上某同学的要求,写这篇帖子对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:希望大家看了之后,不要对外公开,好东西自己留着,比如偷偷发个简历过去什么的。哎呀,我太坏了
这是一条镜像帖。来源:北邮人论坛 / cpp / #80449同步于 2014/6/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[心得]关于《shellcode》一文
gdl
2014/6/24镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
http://bbs.byr.cn/#!article/CPP/80412,是这一篇里面的,有人说不知道怎么解出来的,叫我写的教程什么。
【 在 gaoweiwei 的大作中提到: 】
: shellcode啊,不错
nice,技术贴
【 在 gdl 的大作中提到: 】
: http://bbs.byr.cn/#!article/CPP/80412,是这一篇里面的,有人说不知道怎么解出来的,叫我写的教程什么。
这……你这样说,我怎么知道呢。看看ollydbg左下角显示的是什么,实在不行重来一遍
【 在 Monologue 的大作中提到: 】
: 单步调试到00424A30 > 68 5EFFE690 push 90E6FF5E 这句就停在这了是怎么个情况?
access violation when executing
【 在 gdl 的大作中提到: 】
: 这……你这样说,我怎么知道呢。看看ollydbg左下角显示的是什么,实在不行重来一遍