ctf漏洞题

金在熔 2018-11-02 10:28:31
#include<stdio.h>
void getFlag()
{
printf("flag is here\n");
}
void foo(int num)
{
int result;
char s;
gets(&s);
result = puts(&s);
if(num == 0x61616161)
{
getFlag();
}
else{
puts("wrong flag");
}
}
int main()
{
setbuf(stdin, 0);
setbuf(stdout, 0);
setbuf(stderr, 0);
puts("so, can u find flag?");
foo(0x12345678);
return 0;
}
我输入什么可以输出flag is here
...全文
384 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
天马行空_ 2018-11-04
  • 打赏
  • 举报
回复
调试,(打印)计算参数num和s之间的长度,使用gets()的时候,覆盖num,因为gets()没有是不安全的函数,没有长度限制。
打印&num和&s,在我的机器上是0x22fe30和0x22fe1b,距离是21,想要覆盖num,最少输入25个字符,0x61对应的字符是'a',所以只要第22到25位为'a'就可以了。所以输入25个'a'就可以破解。当然输入长一些也是可以的,但可能会引起其它错误。


  • 打赏
  • 举报
回复
输入足够多的a就可以了,让s溢出直到覆盖栈中的num
十八道胡同 2018-11-02
  • 打赏
  • 举报
回复
void foo(int num)
{
int result;
char s;
gets(&s);
result = puts(&s);
if(num == 0x61616161) //你的num是参数传入的,不是你输入的,这个程序你无法进入getFlag()。除非你把输入的值赋值给num
{
getFlag();
}

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧