0
#include <stdio.h>
#include <stdlib.h>
void badf(int n, char c, char* buffer)
{
    int i;
    for (i=0; i<n; i++)
    {
    buffer[i]=c;
    }

}

void f(int n, char c)
{
    char buffer[16];
    badf(n,c,buffer);
}

void message ()
{
printf("Hello\n");

}

int main()
{
f(32,0x08048411);
    return 0;
}

これは私がこれまでに入手したコードです(そのベースを与えられ、それに固執する必要があります。そのため、badf関数とf関数があります)

目標は、プログラムが命令ポインタにオーバーフローすることによってHelloメッセージを出力することです。Ubuntuでデータ表示デバッガーを使用すると、この表示のアドレスは0x0804811だと思います。

プログラムを実行してx/16x $ espを使用すると、スタック内の次のアドレスは1秒になります(上のアドレスから最後の2桁だけが取得されていると推測されます)

不思議に思うのは、次のアドレスを最後の2桁だけでなく、完全なアドレスにする方法です。

また、32は16(上記で定義されたバッファー)+ 8(ベースポインター)+ 8(命令ポインター)から計算されます。

私はこの特定の問題を知っているので、助けてくれてありがとう。

4

1 に答える 1

0

8ビット整数(char)を介してアドレスを渡さないでください。ただし、十分に広いタイプを使用してください...-少なくとも32ビットです。

次のように変更します。

void badf(int n, unsigned int u, char* buffer)
...

void f(int n, unsigned int u)
...
于 2011-12-08T11:51:41.687 に答える