C 格式化字符串攻击,在bash中将输出转换为可读格式

C 格式化字符串攻击,在bash中将输出转换为可读格式,c,bash,printf,exploit,C,Bash,Printf,Exploit,我正在进行ctf挑战赛。这是相关的代码部分 void details(){ char name[100]; printf("Please enter your name: "); scanf("%100s", name); printf("Hello %s!\n", name); } 如果I EOF scanf/stdin,printf将输出任意数据,其中I 希望能有一些用处,但在bas

我正在进行ctf挑战赛。这是相关的代码部分

void details(){    
    char name[100];
    printf("Please enter your name: ");
    scanf("%100s", name);
    printf("Hello %s!\n", name);    
}
如果I EOF scanf/stdin,printf将输出任意数据,其中I 希望能有一些用处,但在bash中它是不可察觉的十六进制数据

我尝试将输出管道化到hextump或od-tx1,重定向到 但是不管我在尝试什么,shell输出都与什么不匹配 我在gdb中看到,例如0xF7FACCE00xF7E7B6E3等

有什么建议吗? 谢谢

好的,我来解释一下,请记住,这里的界面本身仍然是一个挑战。 我试图保持我的问题的通用性,以避免遇到任何破坏者。 我正在研究其他攻击向量,这只是其中之一。 我知道我可以使缓冲区溢出,但这只能达到我想要的一半 我得走了

void welcome(){
    char name[100];
    printf("enter you name : ");
    scanf("%100s", name);
    printf("Welcome %s!\n", name);
}

int main(){
    printf("Toddler's Secure Login System 1.0 beta.\n");

    welcome();
    login();

    // something after login...
    printf("Now I can safely trust you that you have credential :)\n");
    return 0;   
}
在gdb中,它看起来像这样

在顶部,当我使用Ctrl-D“Welcome&%%/%%/&”退出scanf时,您可以看到printf输出,显然,这种格式是不可读的。在反汇编中,缓冲区位于$ebp-0x70、0xffffd068及以下位置。正如您所看到的,在第一个0字节之前有几个字,我希望能够提供这些字 在狂欢节上。现在,如果我将程序的输出通过管道传输到od以转换为十六进制,我所看到的就是十六进制中可打印的ASCII码,不可打印的字符到哪里去了


在这个挑战中真正感兴趣的功能是
login()
。要在不破坏它的情况下提示您此挑战:请记住,即使
welcome()
函数结束并清除堆栈,这些值仍可以保留在这些内存位置。请查看
login()
中的
scanf()
函数。

不清楚您的问题是什么,您能澄清一下吗?(更准确地说)欢迎来到StackOverflow!如果你认为十六进制数据是“不可分辨”的,那么你可能不应该考虑当程序首先调用未定义的行为时会发生什么。你希望用这些“数据”做什么
hextump
是很好的第一步,但是您发布的屏幕截图不是
hextump
scanf(“%100s”,name)的输出
可能导致缓冲区溢出,因为空终止符可能会写入数组
名称
的边界之外。请改用
%99s
来阻止它。由于空字符始终为空,因此格式必须为%99sadded@Someprogrammerdude我认为这里的重点是找到一种利用此代码段的方法,例如通过覆盖函数返回地址。但我不太确定…谢谢Shane。一周来,我一直在尝试使用name和passcode1的重叠来在login中向passcode1注入一个可执行地址,然后使用后续的scanf/%d在该地址放置一个相对的短跳转操作码,直接跳转到系统调用,但如果我使用完整的100个字符,它将跳过scanf调用。但是,为保持我的积极性而欢呼,在过去的几天里,我已经(重新)学到了很多。没问题,我发现这个挑战比蹒跚学步的孩子的包中的其他挑战要棘手得多。如果你需要任何提示,请告诉我。对不起,妈妈。。我对scanf的用法感到困惑:(哇……真是太棒了:)