より安全にコーディングする方法を学ぶために、フォーマット文字列の脆弱性に関するチュートリアルを進めています。これまでに作成したプログラムは次のとおりです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char text[100];
strcpy(text, argv[1]);
printf(text);
}
私はこのように実行しています:
>>> ./foo $(ruby -e 'print "AAAA" + "%08x."*9 + "%x"')
AAAAffe466f4.00000001.f763b1c9.ffe458df.ffe458de.00000000.ffe459c4.ffe45964.00000000.41414141
末尾に「41414141」が表示されます。これは、文字列の先頭にある AAAA です。ただし、代わりに「%s」を次のように使用すると:
>>> ./foo $(ruby -e 'print "AAAA" + "%08x."*9 + "%s"')
セグメンテーション違反が発生します。誰かが私を正しい方向に向けることができますか?