首页 > 解决方案 > 跳转到函数内部的地址

问题描述

在尝试解决过去 ctf 事件的挑战时,我遇到了一个独特的问题,需要我执行以下操作:

  1. 使用易受攻击的方法“gets()”将 vuln 函数的返回地址溢出到另一个函数,并将其上方的堆栈单元溢出到另一个给出标志以创建 rop 链的函数。
  2. 溢出它需要这样一种方式,即第二种方法中的全局布尔变量将能够传递以下布尔条件:if(a && !a){; 然后安全地进行到最后一个函数

这显然是不可能的,任何布尔值都不应该同时为真和假,但是如果您正在查看它的编译程序集,它将它分为两​​个不同的条件,一个检查其是否为真,一个检查其是否为假,那么唯一的选择是在考虑到布尔值的默认值为 false 的情况下跳入两者之间。

溢出到中间地址的结果是程序立即终止,同时考虑到在第二个方法的中间着陆后需要跳转到另一个方法的事实,看起来中间跳转正在离开和 ret 功能受到干扰。

我的问题是:

是否可以跳到函数的中间而不干扰函数的“折叠”并出错,如果不是为什么?如果是,需要做什么?

尊重,革命

顺便说一句:aslr 已激活,程序是用 c 编写的,操作系统是 ubuntu 32 位,挑战来自 pico ctf 2019 这个问题是一个普遍问题,是从活动中的挑战中获得灵感的,所以写起来不是在这种情况下回答。

标签: securityctf

解决方案


推荐阅读