格式化字符串攻击,以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等等等。

output/bash

有指针吗? 谢谢。

好吧,我会很好地表达自己的观点,这里的界面本身还是有些挑战。 我试图让我的问题保持通用,以避免遇到任何破坏者。 我正在查看其他攻击媒介,这只是其中之一。 而且我知道我可以使缓冲区溢出,但这只会到达一半 需要走。

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中,看起来像这样,

gdb

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

pipe to od -t x1

解决方法

此挑战中真正感兴趣的功能是login()。为了给您一个提示而又不给您带来麻烦的提示:请记住,即使welcome()函数结束并清除了堆栈,这些值仍然可以保留在那些内存位置中。请改用scanf()中的login()函数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...