RPIのModern Binary Exploitationコースに取り組む here 。メモリリークを使用してスタックに関する情報を取得し、システムコールのオフセットを計算することになっているASLRを悪用する例に問題があります。これがコードです:
#include <stdio.h>
#include <string.h>
/* gcc -pie -fPIE -fno-stack-protector -o aslr_leak2 ./aslr_leak2.c */
int main(int argc, char * argv[])
{
char leaky[16];
if(argc < 2)
{
printf("Please provide two arguments.\n");
return 1;
}
memcpy(leaky, argv[1], 16);
printf("Leaky buffer: %s\n", leaky);
printf("another round? : ");
fgets(leaky, 64, stdin);
return 0;
}
メモリリークを取得するためのフォーマット文字列の悪用のようには見えないので、それがどのように機能するのかはわかりません。私が正しく理解している場合は、最初の印刷物から情報を取得する必要があります。これは、ROPガジェットを作成するためのリターンポインターを上書きするのに役立ちます。はい、必要に応じてGDB内で実行できますが、実行できません。
最初の引数として16文字を指定すると、リーキーバッファーがいっぱいになります。終了ヌルのためのスペースがないので、後続のprintfは16文字をエコーし、終了ヌル文字が見つかるまでスタックにあるものをすべて印刷し続けます。これはあなたの情報漏えいです。 ROPガジェットのアドレスは、リークされたアドレスに対して相対的に計算できます。