About

Stack3 looks at environment variables, and how they can be set, and overwriting function pointers stored on the stack (as a prelude to overwriting the saved EIP)
Hints:
  • both gdb and objdump is your friend you determining where the win() function lies in memory.
This level is at /opt/protostar/bin/stack3

Source code

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

void win()
{
    printf("code flow successfully changed\n");
}

int main(int argc, char **argv)
{
    volatile int (*fp)();
    char buffer[64];

    fp = 0;

    gets(buffer);

    if(fp) {
        printf("calling function pointer, jumping to 0x%08x\n", fp);
        fp();
    }
}

从hits中得知gdb是个好用的工具。gdb是个很好用的Debug工具,具体用法请Google之。。。

根据之前的题目应该很快领悟到只需要将buffer超出64字节即可进行关键if语句中。但随后发现仍需要进入win()函数才行,而我们并不知道win的地址是多少~~此时便需要用到gdb这个工具了

获得win函数地址是0x08048424,这下好办了,只需要0x08048424覆盖到fp即可。。。