这个题耗费了我基本一天的时间,属于知识盲区题。 ``` int passcode1; scanf("%d", passcode1); ``` 程序在调用scanf函数的时候,传的不是指针是一个int类型。编译会有warning,但是能通过编译。最终代码是以passcode1的值为地址进行数据存储。如果正常执行,因为passcode1的值不确定,所以很容易段异常退出。 在这调用login之前,调用了welcome,进行name[100]的输入。导致栈内存是共用的,所以可以通过设置name的值,来修改passcode1的值。 这里的分析都还好,再往下就不通了。因为共用栈刚好到name结束,而且二进制编译开启了函数调用的栈溢出检查,这就导致passcode2没有办法修改。只能说题出的精巧。 然后我从网上找了一下答案,然后再查了一些资料,基本就捋清楚了。 首先这里二进制未开启随机的内存地址空间的保护,导致每个指令地址固定。第二点,未开启got全保护,所以got可以写,导致可以修改动态库函数的调用地址,从而达到跳转到目的。 所以,继续往下的解题思路就是,在输入name的时候,修改passcode1的值为got函数的地址(通过查看plt段的内容)。这个函数取scanf后的一个函数,这样保证到达不了passcode2的scanf。这一步做完就可以保证,passcode1输入的时候不会段错误。然后在进行passcode1输入的时候,将最后的system调用的地址作为输入数据。因为指令地址固定,所以在这里行得通。

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply