私はfgetsでstdinからループして読み込むプログラムを持っています。読み取りループ全体が関数内にあり、関数の戻りアドレスをprintf脆弱性で上書きしようとしています。戻りアドレスは0xbffff0fc(0x2a20029e)にあり、スタック上のバッファは入力AAAA(0x41414141)によって識別されます。Cフォーマット文字列の脆弱性、バッファ内のアドレス取得方法
0xbffff0b0: 0x0000000a 0x00000020 0xb7fc7c20 0xb7e4fd94
0xbffff0c0: 0xb7fc73cc 0xbffff0dc 0x41414141 0x66740000
0xbffff0d0: 0x785c2220 0x785c3439 0x785c3739 0x785c3430
0xbffff0e0: 0x29223830 0xb7fc0000 0x5da95700 0x00000000
0xbffff0f0: 0x00000000 0xb7fc7000 0x00000000 0x2a20029e
だから、私の理解から、私は、バッファに0xbffff0fc記述する必要があり、その後、私は0xbffff0fcする任意の値を書き込むために(kは整数)%X%6 $ nを使用することができます。
したがって入力は< 0xbffff0fc>%x%6 $ nのようになります。私が持っている問題は、0xbffff0fcがスタックになるように、どのようにして< 0xbffff0fc>と書くのかです。 ASCII文字だけでは、私は本当にこれを行うことはできません。
編集:プログラム
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int function1()
{
char line[32];
size_t size;
while(1)
{
if (!fgets(line, sizeof(line), stdin))
{
return 0;
}
size = strlen(line);
line[size - 1] = '\0';
printf(line);
printf("\n");
}
return 0;
}
int main(int argc, char** argv)
{
function1();
return 0;
}
私はコードを追加しましたが、それは本当に質問に必要だとは思わなかった。 –