首页 > 其他分享 >std::function逆向还原

std::function逆向还原

时间:2023-10-20 12:33:42浏览次数:50  
标签:std function 虚表 函数 逆向 int 成员

std::function的内存结构

本文案例地址:https://wwmf.lanzout.com/b029diasb 密码:areg

std::function为lamda函数时

本文的代码都是32位为例

image

  • vftable

首先我们可以从Func_impl_no_alloc_V_lambda得知这是一个类型为lamda的std::function容器,把虚表赋值到对象首地址。我们将该对象的类型变更为 std::function

image

我们跳转到虚表,找到虚表的第三个虚函数

image

image

该函数正是我们的lamda函数

  • 捕获变量

看到上图,这个函数lamda函数返回的时 第一个参数 + std::function对象的第二个成员 + std::function对象的第三个成员的和,

std::function对象的第二个成员 + std::function对象的第三个成员其实就是捕获的第一个变量和第二个变量

image

上面显示第一个成员的值为1,第二个成员的值为2,它们存放在虚表指针后面

  • pStorage

    std::function对象会将对象的起始地址存放在对象的最后一个成员,这更加佐证了这是一个std::function

image

最后还原的结果为


#include <iostream>
#include <functional>

int main()
{
	int a = 1,b =2;
    std::function<int(int)> func = [a,b](int i) {return i + a +b; };
	std::cout << func(1) << std::endl;
	return 0;
}

std::function为普通函数时

image

进入sub_401400

image

看到一个虚表,虽然不是赋值到this处,但是后面肯定会复制过去的,std::_Func_impl表示这是一个std::function,后面还表明了容器类型为int (__cdecl *)(int).这种情况目标函数会存放在虚表的后面,sub_401000就是我们的目标函数了

image

回到main函数,我们将v8的类型更变为std::function

image

v3是_Ptrs的最后一个元素,这里存放的是std::function对象的首地址,通过这个地址去调用虚表的第三个函数,可调用目标函数,所以最后还原的效果为

#include <iostream>
#include <functional>


int fun1(int a) {
	std::cout << "fun1" << std::endl;
	return a;
}

int main(int argc, char* argv[]) {
    std::function<int(int)> callback;
    callback = fun1; 
    std::cout << callback(10) << std::endl;

    return 0;
}

std::function为成员函数时

std::function为成员函数与std::function为普通函数基本类似,只是成员函数的this指针会存存放到std::function对象的第四个成员处

标签:std,function,虚表,函数,逆向,int,成员
From: https://www.cnblogs.com/czlnb/p/17776805.html

相关文章

  • [Microsoft Azure] 如何查看 Azure Function的.NET SDK版本列表
    本文将介绍如何在MicrosoftAzure中查看和选择AzureFunction的.NETSDK版本列表,以便为您的项目选择合适的版本。在MicrosoftAzure中,AzureFunctions是一种用于在云端运行小型应用程序或功能的服务。它可以帮助我们在不需要管理基础设施的情况下快速构建和部署应用程......
  • [Microsoft Azure] 如何查看 Azure Function的.NET Runtime
    在本文中,我们将详细介绍如何在MicrosoftAzure中查看AzureFunction的.NETRuntime版本。了解如何找到所使用的.NET版本,确保您的Functions应用程序兼容并具有稳定性。在使用MicrosoftAzure的过程中,您可能会使用到AzureFunctions作为一个无服务器计算服务。而在......
  • rustdesk 1.2.3-1 尝鲜,有很大提升空间
    产品说的很好。测试了一下电脑从archlinuxcn下的rustdesk1.2.3-1,手机端fdroid下的,版本是1.1.10-1,同一局域网,未自建服务器。电脑端启动后显示账号和一次性密码。手机输入账号密码后连接,手机画面黑屏,过一回依旧黑屏不显示,再一会断联。手机可选显示哪个桌面(一共两)。密码刷新后......
  • springboot mybatis-plus 逆向工程
    官网地址:https://baomidou.com/开发环境Springbootv3.1.4mybatis-plusv3.5.3.2mybatis-plus-boot-startermybatis-plus-generatorApacheFreeMarkerv2.3.32mysql  ......
  • Rust: function
    /***file:nested.rs***////公有函数pubfnfunction(){println!("called`my::nested::function()`");}///私有函数#[allow(dead_code)]fnprivate_function(){println!("called`my::nested::private_function()`");}/......
  • SpringBoot项目中使用mybatis逆向工程
    mybatis逆向工程,即利用现有的数据表结构,生成对应的model实体类、dao层接口,以及对应的mapper.xml映射文件。借助mybatis逆向工程,我们无需手动去创建这些文件。下面是使用Java代码的方式来实现逆向工程,生成文件(也可以使用插件来生成):首先,导入需要的依赖包:mybatis逆向工程的依赖和......
  • CF837G Functions On The Segments
    CF837GFunctionsOnTheSegmentsFunctionsOnTheSegments-洛谷|计算机科学教育新生态(luogu.com.cn)目录CF837GFunctionsOnTheSegments题目大意思路code题目大意你有\(n\)个函数,第\(i\)个函数\(f_i\)为:\[f_i(x)=\begin{cases}y_1,&x\lex_1\\ax+b,&x_1\le......
  • 【NSSCTF逆向】【2023题目】《润!》
    题目解法这道题蛮搞的,不算简单。刚开始拿到这道题运行一下有些信息,是一道迷宫题,可能flag是我们输入的路线吧?先拿exeinfo来看看告诉我有壳,但是不要用upx-d来脱壳,结合题目的标签,知道这题有一个魔改upx壳。硬脱不行。说实话我对upx的了解很皮毛,网上搜了搜upx壳的详细源......
  • day04-逆向基础案例
    一抓包逆向案例1.1金树林.apk1.1.1目标#发送验证码#注册#登录#登录后查询红酒1.1.2发送验证码importrequestsres=requests.get('https://miappshop.jshulin.com/memberLogin/phoneCode?phone=%s&serviceType=5'%'18953675222',verify=False)print(res.text)......
  • app逆向day03-反编译工具和hook框架
    一反编译工具1.1常见反编译工具常见的反编译工具:jadx(推荐)、jeb、GDA反编译工具依赖于java环境,所以我们按照jdk1.2JDK环境安装#官方地址:(需要注册-最新java21)https://www.oracle.com/java/technologies/downloads/1.2.1win平台安装#1下载jdk-8u371-windows-x64.e......