【发布时间】:2012-03-14 20:38:15
【问题描述】:
所以我想参加 Stripe CTF 比赛,但我对安全性一无所知,所以当我遇到问题时,我查找了问题 3。我仍然不明白它是如何工作的。 黑客的目标是通过使用设置了SUID 位的应用程序来访问其他用户文件中的密码。这是应用程序的(简化的)代码:
#define NUM_FNS 4
typedef int (*fn_ptr)(const char *);
int to_upper(const char *str)
int to_lower(const char *str)
int capitalize(const char *str)
int length(const char *str)
int run(const char *str)
{
// This function is now deprecated.
return system(str);
}
int truncate_and_call(fn_ptr *fns, int index, char *user_string)
{
char buf[64];
// Truncate supplied string
strncpy(buf, user_string, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';
return fns[index](buf);
}
int main(int argc, char **argv)
{
int index;
fn_ptr fns[NUM_FNS] = {&to_upper, &to_lower, &capitalize, &length};
if (argc != 3) {
exit(-1);
}
// Parse supplied index
index = atoi(argv[1]);
if (index >= NUM_FNS) {
exit(-1);
}
return truncate_and_call(fns, index, argv[2]);
}
这是我找到的解决方案:http://pastebin.com/VJ4xpawq
我很困惑为什么会这样。如果我使用 ./level03 -28 "echo foo;" 之类的代码运行代码我得到一个段错误。还有,为什么他的printf函数里的内存地址反了????
我迷路了,想学习。先感谢您。 :)
【问题讨论】:
标签: c security memory symlink stack