我有一个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上工作。
1条答案
按热度按时间wgx48brx1#
还有其他方法可以得到一个 shell ;)您可能应该检查一下什么是ROP chain
如果你仍然想使用shellcode(这可能是最简单的方法),你也可以把它注入到一个env变量中而不是argv[1]中,并在argv[1]中使用
jmp ADDRESS_OF_THE_SHELLCODE_IN_ENV
,它不会触发禁用字符。祝你和反恐组玩得开心!