私は有名な「スマッシュスタック」チュートリアルをやっていて、私は立ち往生しています。基本的には、スタックの戻りアドレスを指すポインタを操作します。その後、リターンアドレス自体を操作します。ですから、私の目標は命令x = 1を飛ばし過ぎることです。Cポインタ操作
私のコードを確認してください。私のコードで動作するはずです。私もASLRをオフにしていない...しかし、何の効果
しかし、最後に、私はまだ「1」を出力します...チュートリアルからなぜ:-(
コードを伝えることはできません:
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
int *ret;
ret = buffer1 + 12;
(*ret) += 8;
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n",x);
}
マイコード(最初に試す):
void function(int a, int b, int c) {
// Dont really know if initiated arrays have a different address than non initiated...
char buffer1[5] = {1,2,3,4,5};
char buffer2[10];
int *ret;
ret = buffer1;
int i;
for(i=0;i<64;i++){
printf("Added: %d, Address: %016x\n",i,(*ret));
ret += i;
//Found out that adding 5 points to the return address on the stack
if(i == 5) break;
}
printf("stack address of ret: %p\n", ret);
printf("unchanged ret address: %016x\n", (*ret));
//Just counted the bytes to pass the x = 1; movl $0x1,-0x4(%rbp)
(*ret) += 7;
printf("changed ret address: %016x\n", (*ret));
}
void main() {
int x;
x = 0;
function(1,2,3);
x = 1;
printf("print x: %d\n",x);
}
更新:。 私のコードは、現在働いている(これは、x = 1をスキップ)誰もが興味を持っている場合、私はそのコードを投稿します。 ..
Greetz!
それはもちろん、プリント1のみ –
だからここで私のミスがあるのだろうか? – int80
と-fno-stack-protectorでコンパイルすると、 – int80