【问题标题】:How can I know if child process is waiting for keyboard input in C我如何知道子进程是否正在等待 C 中的键盘输入
【发布时间】:2020-12-11 04:57:44
【问题描述】:

我正在研究 C (Linux) 中的缓冲区溢出利用。 利用的目标是以 root 身份运行 shell

所以我的策略是这样的。

  1. 猜测目标地址。
  2. 使用#1 的目标地址运行易受攻击的程序。 (由 fork-exec 运行)
  3. 检查程序是否被利用。 (是否执行shell)
  4. 循环直到满足 #3。

我的问题发生在#3。 如何检查子进程是否成功执行shell?
或者,我如何知道子进程是否正在等待键盘输入?

这是我的代码。

/*
GUESS TARGET_ADDRESS
*/
if(fork()==0){
    execl("./vulnerableProgram", "./vulnerableProgram", "exploitInput.txt", NULL);
}
int check = CHECK_IF_CHILD_PROCESS_RUNS_SHELL()          // <- here is my question
if(check) {
    printf("%s\n", TARGET_ADDRESS);
    break;
}

当子进程利用失败时,子进程的状态如下。

  • 分段错误
  • 非法指令
  • 正常退出(由于漏洞利用代码中的NULL字符不会发生溢出)

【问题讨论】:

  • How can I know if child process is waiting for keyboard input - 试试strace,很可能你的程序在read()系统调用中被阻塞了

标签: c linux fork child-process buffer-overflow


【解决方案1】:

当孩子终止您输入运行的程序时,它将返回或退出正常值或异常。我不知道您在利用剥削和东西做什么,但我可以回答您的问题,即您如何知道孩子何时成功执行shell。您可以告诉父级等待子级,直到它的工作完成,然后您可以通过WIFEXITED()处理正常或异常执行,如果返回true则表示子​​级执行正常否则异常。

waitpid(pid,&status,0);
if(WIFEXITED(status){
    printf("normal with %d", WEXITSTATUS(status));
}else{
  //abnormal
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多