RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1097799
Accepted
Elvin
Elvin
Asked:2020-03-22 01:04:03 +0000 UTC2020-03-22 01:04:03 +0000 UTC 2020-03-22 01:04:03 +0000 UTC

为什么 masm 对字符串或文本文字太长发誓,为什么在结构中设置 db 或 dw?

  • 772

我正在按照这个例子编写 c-shellcode。我重复示例中的步骤以填充结构:示例本身:

    ;IA86 and AMD64
    IFDEF _M_IA86
    .386
    .model flat, stdcall
    ENDIF

    ;set code section .shell
    .CODE shell

    ;data struct
    Shell_Static_Data STRUCT 
        phrase_ldrloaddll db 16 dup(0)
        phrase_msgbox db 16 dup(0) //почему byte?
        phrase_hello db 16 dup(0)
        phrase_hello_title db 16 dup(0)
        phrase_user32 dw 16 dup(0)//почему word? 
        phrase_ntdll dw 16 dup(0)
    Shell_Static_Data ENDS

    shelldata Shell_Static_Data <"LdrLoadDll", "MessageBoxA", "Hello hacker", "Shellcode", \
         {'u', 's', 'e', 'r', '3', '2', '.', 'd', 'l', 'l'}, {'N', 't', 'd', 'l','l', '.', 'd', 'l', 'l'}>
;getting ptr to shelldata struct

IFDEF _M_IA86

get_data_struct_ptr PROC
;delta
    call get_delta
get_delta:
    pop eax
;calc var
    sub eax, 5
    sub eax, sizeof shelldata
    ret
get_data_struct_ptr ENDP

ELSEIFDEF _M_AMD64

get_data_struct_ptr PROC
;delta
    call get_delta
get_delta:
    pop rax
;calc var
    sub rax, 5
    sub rax, sizeof shelldata
    ret
get_data_struct_ptr ENDP

ENDIF

END

为什么确切地暴露了 db 或 dw 。这与在 C 结构中声明的数组的大小有什么关系?按照这个汇编代码,编写了一个 C 结构体:

 #pragma pack(push, 1)
typedef struct _Shell_Static_Data {
    char phrase_ldrloaddll[16];
    char phrase_msgbox[16];
    char phrase_hello[16];
    char phrase_hello_title[16];
    wchar_t phrase_user32[16];
    wchar_t phrase_ntdll[16];
} Shell_Static_Data, *PShell_Static_Data;
#pragma pack(pop)

extern PShell_Static_Data __stdcall get_data_struct_ptr();

__declspec(noinline) void entry();

void *get_module_base_addr(wchar_t *mod_name);
void *get_proc_addr(void *mod_addr, char *proc_name);

该示例正在运行,并且按照说明运行。

现在我正在根据这个例子编写我的模拟:MASM:

     ;IA86 and AMD64
        IFDEF _M_IA86
        .386
        .model flat, stdcall
        ENDIF

        ;set code section .shell
        .CODE shell

        ;data struct
        Shell_Static_Data STRUCT 
            phrase_ldrloaddll db 16 dup(0)
            phrase_ntdll dw 16 dup(0)
            phrase_kernel32 dw 16 dup(0)
            phrase_FindFirFil db 16 dup(0)
            phrase_FindNexFileA db 16 dup(0)
            phrase_DelFilA db 16 dup(0)
            phrase_FindCL db 16 dup(0)
            phrase_ExPr db 16 dup(0)
            phrase_PathM db 42 dup(0) ;не понимаю какое число нужно выставлять, это зависит от размера массива?
    ;что нужно выбрать db или dw, может dt ? На чём завязан этот выбор?
            phrase_path db 38 dup(0)
        Shell_Static_Data ENDS

        shelldata Shell_Static_Data <"LdrLoadDll", {'N','t','d','l','l','.','d','l','l'},{'K','e','r','n','e','l','3','2','.','d','l','l'},"FindFirstFileA","FindNextFileA","DeleteFileA","FindClose","ExitProcess","C:\\Users\\Documents\\delete\\d*.*","C:\\Users\\Documents\\delete\\">
;getting ptr to shelldata struct

IFDEF _M_IA86

get_data_struct_ptr PROC
;delta
    call get_delta
get_delta:
    pop eax
;calc var
    sub eax, 5
    sub eax, sizeof shelldata
    ret
get_data_struct_ptr ENDP

ELSEIFDEF _M_AMD64

get_data_struct_ptr PROC
;delta
    call get_delta
get_delta:
    pop rax
;calc var
    sub rax, 5
    sub rax, sizeof shelldata
    ret
get_data_struct_ptr ENDP

ENDIF

END

在这里,我试图通过与示例类比来写下我的函数和字符串(因为由于直接链接而禁止在教程中使用指针,但在 shellcode 中不允许这样做)我不明白结构字段是用汇编写的:如何理解是否需要db或dw,它后面的数字,它应该是什么以及它取决于什么(可能取决于引号中的字符数?)C中的结构如下所示:

#pragma pack(push, 1)
typedef struct _Shell_Static_Data {
    char phrase_ldrloaddll[16];
    wchar_t phrase_ntdll[16];
    wchar_t phrase_kernel32[16];
    char phrase_FindFirFil[16];//findfirstfilea
    char phrase_FindNexFileA[16];
    char phrase_DelFilA[16];
    char phrase_FindCL[16];//findclose
    char phrase_ExPr[16];//exitproc
    char phrase_PathM[42];//путь с маской
    char phrase_path[38];
} Shell_Static_Data, *PShell_Static_Data;
#pragma pack(pop)

extern PShell_Static_Data __stdcall get_data_struct_ptr();

__declspec(noinline) void entry();

设置当前设置后,VS 说:

A2041 字符串或文本文字太长
(shellcode_native.asm)

A2006 未定义符号:shelldata

帮助解决错误

c
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Elvin
    2020-03-24T18:47:42Z2020-03-24T18:47:42Z

    这里:

     shelldata Shell_Static_Data <"LdrLoadDll", {'N','t','d','l','l','.','d','l','l'},{'K','e','r','n','e','l','3','2','.','d','l','l'},"FindFirstFileA","FindNextFileA","DeleteFileA","FindClose","ExitProcess","C:\\Users\\Documents\\delete\\d*.*","C:\\Users\\Documents\\delete\\">
    

    必须写出绝对路径C:\Users\Documents\delete\,而不是两个斜线

    • 0

相关问题

  • 如何将数字拆分为位并将其写入 C 中的数组?

  • 如何以给定的角度移动物体?

  • 解决“子集和问题”的时效算法

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5