【问题标题】:How to print the if statement in C如何在C中打印if语句
【发布时间】:2020-09-25 11:51:28
【问题描述】:

我正在学习 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 并且在我有地址空间布局时甚至应该可以工作 随机化。

【问题讨论】:

  • @Inian 抱歉打错了。我已经编辑了我的代码。
  • 你想要什么,读取一个字符还是一个字符串?
  • @bruno 我希望能够通过更改返回地址来打印消息inside,所以我猜它是字符串还是字符都没关系。
  • Edit 您的问题并添加输入示例,以及实际和预期输出。

标签: c optimization


【解决方案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&lt;return&gt;,在第二种情况下输入s&lt;return&gt;,但无论在第一个字符之后输入什么字符,因为它们未被读取)

【讨论】:

  • 是的,它有效。但是,是否可以更改返回地址但仍将其余代码保留在 getdata() 中,以便除了返回地址之外不会更改很多?
  • 从一开始我就不明白你说的return address是什么意思,请你解释一下?
  • 我的意思是我需要在 ASLR 开启时使相同的代码工作。你认为这会奏效吗?
  • @Sky ASLR ?那是什么
  • 地址空间布局随机化