如何解决格式化字符串攻击,以bash格式将输出转换为可读格式
我正在处理CTF挑战。这是相关的代码部分,
void details(){
char name[100];
printf("Please enter your name: ");
scanf("%100s",name);
printf("Hello %s!\n",name);
}
如果我EOF scanf / stdin,printf将输出任意数据, 希望能有所用,但是bash中不可识别的十六进制数据。
我尝试将输出管道传输到hexdump或od -t x1,重定向到 文件,但是无论我在尝试什么,shell输出都不匹配 我在gdb中看到例如0xf7facce0 0xf7e7b6e3等等等。
有指针吗? 谢谢。
好吧,我会很好地表达自己的观点,这里的界面本身还是有些挑战。 我试图让我的问题保持通用,以避免遇到任何破坏者。 我正在查看其他攻击媒介,这只是其中之一。 而且我知道我可以使缓冲区溢出,但这只会到达一半 需要走。
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退出scanf时,在顶部可以看到printf的输出,“ Welcome&%% /%/&”,显然,这种格式不可读。在反汇编中,缓冲区位于$ ebp-0x70、0xffffd068及之后。如您所见,第一个0字节之前有几个词,我希望能够使这些词可用 猛扑现在,如果我将程序的输出通过管道传输到od以转换为十六进制,那么我看到的只是十六进制的可打印ASCII代码,不可打印的字符在哪里?
解决方法
此挑战中真正感兴趣的功能是login()
。为了给您一个提示而又不给您带来麻烦的提示:请记住,即使welcome()
函数结束并清除了堆栈,这些值仍然可以保留在那些内存位置中。请改用scanf()
中的login()
函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。