180728 逆向-SMC出题笔记
在某黑哥的指示下给他加紧出两个题目~
最先想到的就是34c3ctf时做过的SMC题目,那个随机数混杂着自解密真的是让我久久无法忘怀
SMC题目的核心就在于自解密时的key
如果key不提供,那么考点就在于大量x86汇编中一般\x00出现的是最多的
而这需要基于一定量的代码之上才能猜出,而且这种题目相对而言可玩的花招要少很多
于是选择了将key由一个.init_array中的函数动态生成
下一步是自解密代码如何加密放在程序中
由于我们只能写出解密代码(编译前的高级语言),因此有两种方法
一种是先写好代码,编译后令程序将其加密,然后作为data输出字节码,最后将字节码保存在目标程序中
第二种是直接写目标程序,将需要加密的代码段通过Patch来重写。这一点作为逆向选手来说,IDC/IDAPYTHON脚本的Patch是驾轻就熟了,所以我选择了后者
Patch的时候想起来IDC对数组的支持非常反人类,明明语法类C,却不具备数组功能,查了一下据说需要使用Array函数来创建,试了一下也没成功,直接换IDAPython
只要记住API,IDAPython好用多了嘛XD
脚本:
def patch(start, end, key):n = 0while(start + n!=end+1):addr = start + nPatchByte(addr, Byte(addr)^key[n%len(key)]n += 1print("%d Byte has been changed" % n-1)
搞好以后运行疯狂报SIGABRT
动调以后发现是.text段不具备写权限
同样的,如果使用第一种方法,那么.data段解密完成以后是不具备执行权限的
因此需要使用mprotect来修改页属性
理论上来说,应该可以直接修改section的属性,但是我用010Editor查看的时候并对不上号,不知道问题出在哪里..
而mprotect操作的单位必须是页,第一个参数必须指向页起始地址。
最坑的是这些系统函数执行失败并不会报异常,而是返回-1,并设定perror的值
纠结许久以后找到一个示例
long pageSize = sysconf(_SC_PAGESIZE);void *pageStart = (void*)((long)p - (long)p % pageSize);
其中p是目标地址(的指针)
然后通过mprotect(pageStart, pageSize, PROT_WRITE|PROT_EXEC)
即可设置可写可执行属性了
180728 逆向-SMC出题笔记相关推荐
- 【UNCTF】逆向WriteUp以及出题笔记
[UNCTF]逆向WriteUp以及出题笔记 WriteUp re_checkin 反编译 babypy easyMaze ICU ezRust base_on_rust Trap ezre ezvm ...
- 滴水逆向win32学习笔记1
滴水逆向win32学习笔记 一.字符编码 基本介绍 关于utf-16.utf-8和unicode的关系 BOM头 二.宽字符 基本介绍 常用函数 三.Win32 API中的宽字符 什么是win32 A ...
- 逆向QBasic7.1笔记
一.前言 最近接触了一个QBasic编写的16位程序的逆向,该程序是运行在纯DOS环境下,虽然此环境已离我们远去,能接触到的机会不是太多,但为了防止有意外碰到的同学像我最开始那样走弯路,特此将该笔记整 ...
- OD逆向调试程序的笔记
1-读取文本框内容常用的函数(这里的"A"表示ASCII,"W"表示宽字符UNICODE,下同) -GetDlgItemTextA()<这个函数是最常 ...
- 滴水逆向3期笔记与作业——01汇编
防止OneNote丢失. 海哥牛逼. 01汇编笔记 01进制 进制定义 10-2进制转换 八进制 02数据宽度/逻辑运算 数据宽度与存储 逻辑运算 计算机做加法的本质 作业 03通用寄存器_内存读写 ...
- 静态链接库,动态链接库【滴水逆向三期48笔记】
在开发过程中,我们通常会有很多函数,需要多次使用或在不同的程序中使用该函数,也有可能我们会将我们写好的函数给别人使用,但是我们又不想给他源代码,毕竟代码是我们花了很多功夫写出来的,那么我们如何不发给其 ...
- [SCUCTF2022]校赛Web出题笔记
前言 本次校赛我出了两个题,一个签到一个中等,由于自己的原因导致这两道题都出现了比较离谱的非预期,这里给师傅们谢罪了. checkin <?php error_reporting(0);$act ...
- IAT表入门简析【滴水逆向三期52笔记】
在讲IAT表之前,我们来回忆一下之前学习的知识: 如果我们将函数写在程序的源文件中,那么该函数就会被编译器直接编译到程序的二进制文件中,在程序调用该函数的时候,E8后跟的地址是直接写死的,程序直接在e ...
- 导入表解析,IAT表解析【滴水逆向三期53笔记】
我们再上一章节简要介绍了IAT表,我们知道如果程序调用dll中的函数时,必须通过IAT表来找到函数,我们基本了解了IAT表之后,我们今天来讲解一下导入表,通过本章节的学习,我们可以了解导入表,也能对I ...
最新文章
- html5语义化标签大全
- 基于FPGA的gardner同步环设计
- The Windows Subsystem for Linux optional component is not enabled. Please enable it and try again.
- 求职受性别限制?数据指明2021女性求职新方向
- PURE DORM IS GREAT
- [转载] 杜拉拉升职记——07 管理者关心细节吗?
- java中的%nf_java中DecimalFormat四舍五入用法详解
- linux5 vnc,CentOS 5 下安装配置VNC
- Atitit 动态按钮图片背景颜色与文字组合解决方案
- python 写文件 换行_python中写入txt文件需要换行,以及\r 和\n
- ApacheCN Python 译文集 20211108 更新
- 服务器 '' 上的 MSDTC 不可用。
- VBS好玩的整人小程序
- Win10新电脑里的设备和驱动器下如何分盘
- DiskGenius系统迁移(更换硬盘系统对拷)
- 台式计算机硬件组装步骤,【电脑组装教程】DIY台式电脑新手组装+安装系统多图全教程...
- 又是一年金九银十!一起看看这些大厂面试真题查漏补缺吧,程序员翻身之路
- Linux开启root用户
- Bable的简单使用
- Ocata Neutron代码分析(六)——APIRouter的初始化(1)加载core plugin和service plugin...