【问题标题】:Block SIGINT from terminating program阻止 SIGINT 终止程序
【发布时间】:2019-01-24 17:44:08
【问题描述】:

我需要一些关于 C 程序的帮助 - 它是一个反向 shell (https://github.com/arturgontijo/remoteShell/blob/master/reverseShell.c) 我做了一些更改,比如将所有内容放在一个循环和一些睡眠模式中 + 放置一些参数以直接传递 IP 和 PORT 现在那个东西效果很好它很稳定(不能用 TAB 自动完成内容的问题我并不关心)但我真正关心的是,如果在目标机器上我按下 CTRL+C 程序,这个东西会中断自行退出。现在我用这个例子来阻止 CTRL+C 调用:

/* Signal Handler for SIGINT */
void sigintHandler(int sig_num) 
{ 
    /* Reset handler to catch SIGINT next time. 
       Refer http://en.cppreference.com/w/c/program/signal */
    signal(SIGINT, sigintHandler); 
    printf("\n Cannot be terminated using Ctrl+C \n"); 
    fflush(stdout); 
} 

signal(SIGINT, sigintHandler); 

我在网上找到了这个例子并将它放在我的循环中,但仍然从客户端按 ctrl+C 中断程序。我想知道 dup2() 是否对此负责,因为在简单的 C 程序上这实际上工作得很好。

【问题讨论】:

  • 这部分代码看起来没问题。你能提供一个完整的例子吗?
  • ^ 嗨 - 代码如下所示:imgur.com/a/oKf5aP4
  • 您不能从信号处理程序中进行任意函数调用。 Footnote 188 of the C Standard 甚至声明“因此,信号处理程序通常不能调用标准库函数。” POSIX allows for the calling of only async-signal-safe functions。请注意,printf()fflush() 不是异步信号安全的。您获得该代码的在线资源是错误的来源。
  • 添加到安德鲁的评论中,write 是异步信号安全的,如果写入的文件描述符是行缓冲或非缓冲的,则不需要刷新:char m[] = "hi\n"; write(stdout, m, sizeof(m));

标签: c ctrl reverse-shell


【解决方案1】:

您可以使用sigetops family of functions 来处理发送到您的应用程序的信号。

因此,对于您的示例,您可以使用:

#include <signal.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    sigset_t block_set;

    sigemptyset(&block_set);

    sigaddset(&block_set, SIGINT);

    sigprocmask(SIG_BLOCK, &block_set, NULL);

    while(1) {
        sleep(1);
    }
}

运行示例:https://repl.it/repls/RelevantImaginarySearchservice

您可以稍后通过调用解除对信号的阻塞

sigprocmask(SIG_UNBLOCK, &block_set, NULL);

【讨论】:

  • 嗯还是什么都没有,我想我会分叉它或其他东西,这样一个进程将被淘汰而不是主要的事情
猜你喜欢
  • 2015-04-21
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2014-09-03
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多