文章目录

  • 依赖
  • 思路
  • 代码
    • CPP实现
    • Python+libnum库
  • IDA动态调试
  • 参考资料

依赖

  1. IDA7.7
  2. Ubuntu20.04

作者:hans774882968以及hans774882968以及hans774882968

本文52pojie:https://www.52pojie.cn/thread-1686873-1-1.html

本文juejin:https://juejin.cn/post/7142310602067673124

本文csdn:https://blog.csdn.net/hans774882968/article/details/126813906

思路

64位ELF。用IDA打开即可看到main函数:

__int64 __fastcall main(int a1, char **a2, char **a3)
{if ( a1 > 1 ){if ( !strcmp(a2[1], "zer0pts{********CENSORED********}") )puts("Correct!");elseputs("Wrong!");}else{printf("Usage: %s <FLAG>\n", *a2);}return 0LL;
}

会这么简单嘛?我们应该关注a2[1]是否被修改了。因此看看start函数:

// positive sp value has been detected, the output may be wrong!
void __fastcall __noreturn start(__int64 a1, __int64 a2, void (*a3)(void))
{__int64 v3; // raxint v4; // esi__int64 v5; // [rsp-8h] [rbp-8h] BYREFchar *retaddr; // [rsp+0h] [rbp+0h] BYREFv4 = v5;v5 = v3;_libc_start_main(main, v4, &retaddr, init, fini, a3, &v5);__halt();
}

查阅_libc_start_main的资料(参考链接1)可知init函数会在main函数之前被调用。

void __fastcall init(unsigned int a1, __int64 a2, __int64 a3)
{signed __int64 v4; // rbp__int64 i; // rbxv4 = &off_200DF0 - &funcs_889;init_proc();if ( v4 ){for ( i = 0LL; i != v4; ++i )((void (__fastcall *)(_QWORD, __int64, __int64))*(&funcs_889 + i))(a1, a2, a3);}
}

有这些函数被调用了:

.init_array:0000000000200DE0 E0 06 00 00 00 00 00 00       funcs_889 dq offset sub_6E0
.init_array:0000000000200DE8 95 07 00 00 00 00 00 00       dq offset sub_795

看了看sub_6E0啥也没有,那重点肯定是sub_795了:

// write access to const memory has been detected, the output may be wrong!
int (**sub_795())(const char *s1, const char *s2)
{int (**result)(const char *, const char *); // raxresult = &strcmp;qword_201090 = (__int64)&strcmp;off_201028 = sub_6EA;return result;
}

点击查看off_201028,发现是strcmp函数的地址,也就是说off_201028 = sub_6EAstrcmp的地址篡改为sub_6EA的地址。因此main函数调用strcmp的时候会调用sub_6EA

__int64 __fastcall sub_6EA(__int64 a1, __int64 a2)
{int i; // [rsp+18h] [rbp-8h]int v4; // [rsp+18h] [rbp-8h]int j; // [rsp+1Ch] [rbp-4h]for ( i = 0; *(_BYTE *)(i + a1); ++i );v4 = (i >> 3) + 1;for ( j = 0; j < v4; ++j )*(_QWORD *)(8 * j + a1) -= qword_201060[j];return qword_201090(a1, a2);
}

这里a1, a2类型不对,应该是const char *。回忆一下sub_795这句qword_201090 = (__int64)&strcmp,可知qword_201090(a1, a2)就是调用原有的strcmp函数。至此我们已经知道a2[1]被修改的过程。

总结:一种hook,很有趣。

代码

CPP实现

考虑到这里要把字符串当_QWORD使用,python不方便实现,因此我们用IDA安装目录下可找到的defs.h,赋能cpp,打出一套组合

【reverse】buu-[Zer0pts2020]easy_strcmp——main函数的启动过程+IDA动态调试ELF相关推荐

  1. [汇编与C语言关系]2. main函数与启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...

  2. 第七章之main函数和启动例程

    main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 "最简单的汇编程序"时,我们的汇编和链接步骤是: ...

  3. spring-boot 使用 main函数 无法启动的问题完美 解决方案。

    spring-boot 使用 main函数 无法启动的问题完美 解决方案. 参考文章: (1)spring-boot 使用 main函数 无法启动的问题完美 解决方案. (2)https://www. ...

  4. WPF 用Main函数方式启动程序

    WPF默认程序启动:新建project后自动生成的App.xaml中指定程序启动方式(StartupUri="MainWindow.xaml"),如下代码所示,启动MainWind ...

  5. 【Linux 内核设计的艺术】从开机加电到执行 main 函数之前的过程

    本笔记依据 <Linux 内核设计的艺术> 新设计团队 著 机械工业出版社 以及本人平时的笔记积累而书写,Linux0.11. 文章目录 1.1 启动 BIOS,准备实模式下的中断向量表和 ...

  6. linux 如何运行函数,Linux系统中main函数的执行过程

    1. 问题:Linux如何执行main函数. 本文使用一个简单的C程序(simple.c)作为例子讲解.代码如下, intmain() { return(0); } 2.  编译 -#gcc -o s ...

  7. VB.NET 从main函数里启动窗口

    <STAThreadAttribute()> _Public Shared Sub Main()Application.EnableVisualStyles()Application.Ru ...

  8. 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 主函数逻辑结构 | 启动无限循环 | 接收用户操作值 | 宏定义 | 显示操作菜单 )

    文章目录 一.主函数逻辑结构 1.启动无限循环 2.接收用户操作值 3.主函数代码示例 二.宏定义声明 三.显示操作菜单 一.主函数逻辑结构 在 main 函数中 , 启动一个无限循环 , 不断的接收 ...

  9. Linux内核(1)--从开机到main函数

    从开机到main函数 1. 启动BIOS,准备中断向量表和中断服务程序 1.1 启动BIOS 1.2 BIOS在内存中加载中断向量表和中断服务程序 2 加载操作系统内核程序 2.1 加载第一部分内核代 ...

最新文章

  1. etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程
  2. linux安装ncurses教程,Linux ncurses安装教程(2种方法)
  3. oracle11G在linux环境下的卸载操作
  4. DM368开发 -- 硬件认识
  5. 西澳大学商科专业排名_澳洲西澳大学优势专业排名多少
  6. 37岁跳槽去阿里 p8_36岁阿里p8发帖:手下12个p7,17个p6,亲自写代码毫无中年危机...
  7. 消解原理推理_什么是推理统计中的Z检验及其工作原理?
  8. vue 时区转换_vue---时间戳转换
  9. 2018-07-06笔记(LNMP配置)
  10. var _ 接口 = 结构体{}
  11. html5 输入用户名和密码登陆网址,192.168.5.1路由器登录入口用户名和密码
  12. 哪个服务器比较稳定,云服务器哪个比较稳定
  13. JAVA企业级应用服务器之TOMCAT实战
  14. 矩阵等式 matrix identity(二)
  15. 你所不知道的 CSS 阴影技巧与细节
  16. java 股票数据抓取_java抓取东方财富股票数据(附源码)
  17. html5中get的特点,html4与html5的差异及html5的一些新特性
  18. pythonturtle魔法阵_python turtle 库绘制简单魔法阵
  19. 镜子--天空16度蓝
  20. SQL Developer连接时报错:ORA-12528

热门文章

  1. 慕课-工程伦理第十二讲参考答案
  2. android数据库降级_Android之sqlite数据库版本升级和降级的处理(onUpgrade和onDowngrade)...
  3. sendcloud php 群发,laravel5.5 使用sendcloud发送邮件
  4. 68个经典励志小故事|哲理小故事,让你终身受益(3)
  5. 为什么这么多学生讨厌数学(以及如何解决它)?
  6. IT职场人生系列之二十四:程序员如何增加收入
  7. Https原理及实践
  8. STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
  9. 外贸Newer必备外贸流程
  10. 用矩阵解方程式的运算-高斯消元法