Я делаю знаменитый учебник «Разбить стек», и я застрял. В основном я манипулирую указателем, указывающим на адрес возврата в стеке. А затем манипулируйте обратным адресом. Поэтому моя цель - перепрыгнуть инструкцию x = 1;C Управление указателем
Пожалуйста, проверьте мой код, в моем opionen он должен работать. Я даже выключил 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);
}
Update:. Мой код теперь работает (он пропускает х = 1) я выложу этот код, если кто-то заинтересован. ..
Greetz!
это будет, конечно, печать 1 только –
так, где моя ошибка? – int80
и скомпилировать с -fno-stack-protector – int80