C语言 利用BufferOverFlow读取文件内容并验证输入

sxpgvts3  于 2023-02-18  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个CTF挑战,其中我有一个简单的代码容易受到缓冲区溢出(通过strcpy),如下所示:

#include <stdio.h>
#include <string.h>
int display(char *text)
{
        char buffer[20];
        strcpy(buffer, texte);
        printf("%s\n",buffer);
}

int main(int argc, char ** argv)
{
        char forbidden[]={0x00, 0x80, 0x89, 0xe1, 0x89};
        int i,j;
        if (argc!=2)
        {
                printf("Usage: %s <text>\n", argv[0]);
                return 1;
        }
        for(i=0;argv[1][i];i++)
        {
                for(j=0;forbidden[j];j++)
                {
                        if(argv[1][i] == forbidden[j])
                        {
                                printf("Shellcode detected!\n");
                                return 1;
                        }
                }
        }
        display(argv[1]);
        return 0;
}

我设法通过GDB调试并看到了地址和指令,我完全控制了内存,所以我设法破坏了内存并注入了我自己的 shell 代码,并将返回地址更改为运行我的代码的块。
但困扰我的是代码检查禁用字符,我需要用来执行一个\bin\cat,这真的依赖于0x80(系统调用的OpCode),我用 shell 代码生成器,如masterccc.github .但它内弗斯提供我一个 shell 代码没有这些禁用字符,我尝试了编码器(改变 shell 代码指令,但有相同的语义),但没有办法.
我只是想知道如果我在正确的路径,我必须执行 shell 代码,并绕过这个验证,或它的错误路径?给予我一些提示,请。
我在32位x86上工作。

wgx48brx

wgx48brx1#

还有其他方法可以得到一个 shell ;)您可能应该检查一下什么是ROP chain
如果你仍然想使用shellcode(这可能是最简单的方法),你也可以把它注入到一个env变量中而不是argv[1]中,并在argv[1]中使用jmp ADDRESS_OF_THE_SHELLCODE_IN_ENV,它不会触发禁用字符。
祝你和反恐组玩得开心!

相关问题