我想用纯的asm(inline C++ asm - > no masm)启动一个进程。问题是我不知道如何获得system()函数的地址。每次我重新编译程序,地址都会改变。那么有什么办法可以启动一个流程?我找到了一个针对linux的解决方案。但在execve的功能只是被拆卸和内联:ASM - Windows - 启动过程
0x80002bc <__execve>: pushl %ebp
0x80002bd <__execve+1>: movl %esp,%ebp
0x80002bf <__execve+3>: pushl %ebx
0x80002c0 <__execve+4>: movl $0xb,%eax
0x80002c5 <__execve+9>: movl 0x8(%ebp),%ebx
0x80002c8 <__execve+12>: movl 0xc(%ebp),%ecx
0x80002cb <__execve+15>: movl 0x10(%ebp),%edx
0x80002ce <__execve+18>: int $0x80
0x80002d0 <__execve+20>: movl %eax,%edx
0x80002d2 <__execve+22>: testl %edx,%edx
0x80002d4 <__execve+24>: jnl 0x80002e6 <__execve+42>
0x80002d6 <__execve+26>: negl %edx
0x80002d8 <__execve+28>: pushl %edx
0x80002d9 <__execve+29>: call 0x8001a34 <__normal_errno_location>
0x80002de <__execve+34>: popl %edx
0x80002df <__execve+35>: movl %edx,(%eax)
0x80002e1 <__execve+37>: movl $0xffffffff,%eax
0x80002e6 <__execve+42>: popl %ebx
0x80002e7 <__execve+43>: movl %ebp,%esp
0x80002e9 <__execve+45>: popl %ebp
0x80002ea <__execve+46>: ret
0x80002eb <__execve+47>: nop
见:http://insecure.org/stf/smashstack.html
但CreateProcess-和Windows中的系统功能要复杂得多。那么是否有可能用原始汇编代码创建一个进程?我必须要做与学校描述的here相同的缓冲区溢出攻击。但我不明白如何获得该函数的地址来启动一个进程。
Windows有安全措施来阻止你这样做。对于可能用于绕过这些措施的技术的讨论对于堆栈溢出问题来说太长了。投票结束。 –
好吧。我真的得到它的工作。但是我不得不使用VirtualAlloc函数来使代码可执行。 –
@ florian-r但是......但是......你是怎么做到的? –