我正在尝试编写一些自定义 shellcode 以从程序中获取 shell。查看程序的模块间调用,我发现了一个对 的调用socket(),我最初的计划是使用它来创建一个新的套接字、连接回并生成一个 shell。
我能够恢复连接,但不幸的是,当我调用 时CreateProcessA,我没有得到任何外壳。
调用后,socket()我在 EAX 中有套接字描述符:
然后,在connect()(有效,我在我的 netcat 侦听器上恢复连接)之后,我调用CreateProcessA()了以下参数:
InheritHandles正确设置为 TRUE。在左侧面板上,我已经转储了StartUpInfo结构,正如您所看到的,为所有句柄正确添加了文件描述符(结构的前 3 个字节都设置为 200)。标志STARTF_USESTDHANDLES也正确设置。
不幸的是,这不起作用。令我惊讶的是,如果我不使用对 的模块间调用socket()的地址,而是使用WSASocketA(使用 arwin 找到的)的地址,并且不更改任何其他内容(除了添加 WSASocketA 所需的额外空参数),我可以得到我的壳。
我不明白为什么这不是发生socket(),事实上,根据该标志的文档WSA_FLAG_NO_HANDLE_INHERIT的WSASocketA:
创建一个不可继承的套接字。
默认情况下,由 WSASocket 或套接字函数创建的套接字句柄是可继承的。设置此标志时,套接字句柄是不可继承的。
所以我假设默认情况下它应该同时使用这两个功能。
我不知道这是否相关,但我正在 Windows 7 机器上测试它。

