【reverse】buu-[Zer0pts2020]easy_strcmp——main函数的启动过程+IDA动态调试ELF
文章目录
- 依赖
- 思路
- 代码
- CPP实现
- Python+libnum库
- IDA动态调试
- 参考资料
依赖
- IDA7.7
- 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_6EA
把strcmp
的地址篡改为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相关推荐
- [汇编与C语言关系]2. main函数与启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...
- 第七章之main函数和启动例程
main函数和启动例程 为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 "最简单的汇编程序"时,我们的汇编和链接步骤是: ...
- spring-boot 使用 main函数 无法启动的问题完美 解决方案。
spring-boot 使用 main函数 无法启动的问题完美 解决方案. 参考文章: (1)spring-boot 使用 main函数 无法启动的问题完美 解决方案. (2)https://www. ...
- WPF 用Main函数方式启动程序
WPF默认程序启动:新建project后自动生成的App.xaml中指定程序启动方式(StartupUri="MainWindow.xaml"),如下代码所示,启动MainWind ...
- 【Linux 内核设计的艺术】从开机加电到执行 main 函数之前的过程
本笔记依据 <Linux 内核设计的艺术> 新设计团队 著 机械工业出版社 以及本人平时的笔记积累而书写,Linux0.11. 文章目录 1.1 启动 BIOS,准备实模式下的中断向量表和 ...
- linux 如何运行函数,Linux系统中main函数的执行过程
1. 问题:Linux如何执行main函数. 本文使用一个简单的C程序(simple.c)作为例子讲解.代码如下, intmain() { return(0); } 2. 编译 -#gcc -o s ...
- VB.NET 从main函数里启动窗口
<STAThreadAttribute()> _Public Shared Sub Main()Application.EnableVisualStyles()Application.Ru ...
- 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 主函数逻辑结构 | 启动无限循环 | 接收用户操作值 | 宏定义 | 显示操作菜单 )
文章目录 一.主函数逻辑结构 1.启动无限循环 2.接收用户操作值 3.主函数代码示例 二.宏定义声明 三.显示操作菜单 一.主函数逻辑结构 在 main 函数中 , 启动一个无限循环 , 不断的接收 ...
- Linux内核(1)--从开机到main函数
从开机到main函数 1. 启动BIOS,准备中断向量表和中断服务程序 1.1 启动BIOS 1.2 BIOS在内存中加载中断向量表和中断服务程序 2 加载操作系统内核程序 2.1 加载第一部分内核代 ...
最新文章
- etcd 笔记(05)— etcd 代码结构、各模块功能、整体架构、各模块之间的交互、请求和应答流程
- linux安装ncurses教程,Linux ncurses安装教程(2种方法)
- oracle11G在linux环境下的卸载操作
- DM368开发 -- 硬件认识
- 西澳大学商科专业排名_澳洲西澳大学优势专业排名多少
- 37岁跳槽去阿里 p8_36岁阿里p8发帖:手下12个p7,17个p6,亲自写代码毫无中年危机...
- 消解原理推理_什么是推理统计中的Z检验及其工作原理?
- vue 时区转换_vue---时间戳转换
- 2018-07-06笔记(LNMP配置)
- var _ 接口 = 结构体{}
- html5 输入用户名和密码登陆网址,192.168.5.1路由器登录入口用户名和密码
- 哪个服务器比较稳定,云服务器哪个比较稳定
- JAVA企业级应用服务器之TOMCAT实战
- 矩阵等式 matrix identity(二)
- 你所不知道的 CSS 阴影技巧与细节
- java 股票数据抓取_java抓取东方财富股票数据(附源码)
- html5中get的特点,html4与html5的差异及html5的一些新特性
- pythonturtle魔法阵_python turtle 库绘制简单魔法阵
- 镜子--天空16度蓝
- SQL Developer连接时报错:ORA-12528
热门文章
- 慕课-工程伦理第十二讲参考答案
- android数据库降级_Android之sqlite数据库版本升级和降级的处理(onUpgrade和onDowngrade)...
- sendcloud php 群发,laravel5.5 使用sendcloud发送邮件
- 68个经典励志小故事|哲理小故事,让你终身受益(3)
- 为什么这么多学生讨厌数学(以及如何解决它)?
- IT职场人生系列之二十四:程序员如何增加收入
- Https原理及实践
- STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
- 外贸Newer必备外贸流程
- 用矩阵解方程式的运算-高斯消元法