C Linux中的代码注入——外壳代码由于某种原因无法工作

C Linux中的代码注入——外壳代码由于某种原因无法工作,c,linux,shellcode,C,Linux,Shellcode,我正在以下链接中尝试代码注入的示例: 一切都运行良好(我的意思是它将使用该示例中的外壳代码向目标进程注入一个字符串),但当我尝试注入外壳代码时,程序根本不工作 以下是获取外壳代码的方法: #include <stdio.h> int main(int argc, char *argv[]){ printf("Hello"); return 0; } #包括 int main(int argc,char*argv[]){ printf(“你好”); 返回0; } 然后,我

我正在以下链接中尝试代码注入的示例:

一切都运行良好(我的意思是它将使用该示例中的外壳代码向目标进程注入一个字符串),但当我尝试注入外壳代码时,程序根本不工作

以下是获取外壳代码的方法:

#include <stdio.h>
int main(int argc, char *argv[]){
  printf("Hello");
  return 0;
}
#包括
int main(int argc,char*argv[]){
printf(“你好”);
返回0;
}
然后,我编译源代码并使用gdb来反汇编代码

(gdb) disassemble main
Dump of assembler code for function main:
   0x080483e4 <+0>: push   %ebp
   0x080483e5 <+1>: mov    %esp,%ebp
   0x080483e7 <+3>: and    $0xfffffff0,%esp
   0x080483ea <+6>: sub    $0x10,%esp
   0x080483ed <+9>: mov    $0x80484e0,%eax
   0x080483f2 <+14>:    mov    %eax,(%esp)
   0x080483f5 <+17>:    call   0x8048300 <printf@plt>
   0x080483fa <+22>:    mov    $0x0,%eax
   0x080483ff <+27>:    leave  
   0x08048400 <+28>:    ret    
End of assembler dump.
(gdb) x/30bx main
0x80483e4 <main>:   0x55    0x89    0xe5    0x83    0xe4    0xf0    0x83    0xec
0x80483ec <main+8>: 0x10    0xb8    0xe0    0x84    0x04    0x08    0x89    0x04
0x80483f4 <main+16>:    0x24    0xe8    0x06    0xff    0xff    0xff    0xb8    0x00
0x80483fc <main+24>:    0x00    0x00    0x00    0xc9    0xc3    0x90
(gdb)反汇编主
主功能的汇编程序代码转储:
0x080483e4:推送%ebp
0x080483e5:mov%esp,%ebp
0x080483e7:和$0xfffffff0,%esp
0x080483ea:子$0x10,%esp
0x080483ed:mov$0x80484e0,%eax
0x080483f2:mov%eax,(%esp)
0x080483f5:调用0x8048300
0x080483fa:mov$0x0,%eax
0x080483ff:离开
0x08048400:ret
汇编程序转储结束。
(gdb)x/30bx干管
0x80483e4:0x55 0x89 0xe5 0x83 0xe4 0xf0 0x83 0xec
0x80483ec:0x10 0xb8 0xe0 0x84 0x04 0x08 0x89 0x04
0x80483f4:0x24 0xe8 0x06 0xff 0xff 0xff 0xb8 0x00
0x80483fc:0x00 0x00 0x00 0xc9 0xc3 0x90
然后,我只是复制这30个字节作为外壳代码并使用它,但它不起作用。有人知道它为什么不起作用吗?如何修复它?谢谢


顺便说一下,我想知道如何从源代码修复,而不是简单地编写汇编代码。

我猜注入程序的
printf
不在
main-0xe4
(0x8048300)。如果您能向我们提供错误消息,您还试图使用2002年已知的漏洞,并且在报告每个CVE后,内核更新多次关闭该漏洞,这将非常有用。(例如)检查以确保您可以在您的内核版本上使用该漏洞,或者您可能只是在撞砖墙。您是否也阅读了说明“您使用的指令集特定于英特尔的体系结构,amd的体系结构可能不同,并且这些指令集不会在amd上运行?”。查看amd的手册,了解其说明集“我在示例中尝试了外壳代码。它正在工作,并且能够将“hello world”注入目标进程。但当我尝试使用其他外壳代码时。我看不出有什么不同。(无法看到注入的字符串)。