C 格式化字符串攻击,在bash中将输出转换为可读格式
我正在进行ctf挑战赛。这是相关的代码部分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
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的用法感到困惑:(哇……真是太棒了:)