我正在学习C,并决定尝试使用该代码。我可以通过写任何字符(但以108个字符写字母K
来覆盖密码trigger
)来找出密码,因为它在我的代码中有错误,我可以打印消息inside
。我想知道是否可以通过更改代码中的返回地址来执行相同的打印消息inside
的方法?如果需要更多详细信息,请告诉我。
我的代码:
#include <stdio.h>
char getdata() {
int trigger = 'A';
char data[100];
gets(data);
return (char) trigger;
}
void login() {
printf("inside!\n");
exit(0);
}
void main() {
printf("enter ");
if (getdata() == 'K') {
login();
} else {
printf("wrong.\n");
exit(1);
}
}
我希望输出为:
当用户输入密码时,应该输入inside
,即使我有地址空间布局,它也应该可以正常工作
答案 0 :(得分:1)
如果我很了解您想要这样的话:
#include <stdio.h>
#include <stdlib.h>
char getdata() {
return getchar();
}
void login() {
printf("inside!\n");
exit(0);
}
int main() { // warning main returns an int, not void
printf("enter ");
if (getdata() == 'K') {
login();
} else {
printf("wrong.\n");
exit(1);
}
return 0;
}
编译和执行:
/tmp % gcc -Wall c.c
/tmp % ./a.out
enter K
inside!
/tmp % ./a.out
enter s
wrong.
/tmp %
(在第一种情况下,我输入K<return>
,在第二种情况下,我输入s<return>
,但是无论第一个字符之后输入的字符是什么,因为它们都不会被读取)