6

私はstackoverflowに慣れていないので、犯した間違いについて事前にお詫び申し上げます。

最近、このCパズルに出会いました。プログラムを以下に示します。

#include<stdio.h>

void change()
{

}

int main()
{
 printf("\nHello");
 change();
 printf("\nHai");
 printf("\nHow are you?");
 return 0;
}

期待される出力は、

Hello
Hai
How are you?

この問題では、関数 change() にコードを追加して、次のように出力を変更するよう求められます。

Hello
How are you?

main() を変更することは想定されていません。

ステートメント printf("\nHai") を避けて、スタック メモリに格納されている関数 change() のリターン アドレスを変更しようとしました。しかし、gcc を使用してコンパイルするとエラーが発生します。

change() に追加したコードを以下に示します。

void change()
{
 char ch;
 *(&ch+10)+=20;
} 

ch(10と20)に加算される値は、

objdump -d ./a.out

問題を解決するための提案をお待ちしております。どうぞよろしくお願いいたします。

4

2 に答える 2