学习
实践
活动
工具
TVP
写文章

elf 变异upx 脱壳

再进入 直到找到jmp r13 运行到这里,F8跳转 直接retn下断点F9,直接retn下断点F9重复, 直到遇到一个大跳转 单步,然后return 来到了程序入口 idc脚本下载 可以存放在ida里面有个脚本的文件夹idc,源码后面会附上 首先 在D盘下创建一个dumpfile无后缀文件,不然要提示错误 当然也可以改文件目录和地址,见源文件 运行到程序入口 auto e_phoff; auto e_phnum,p_offset; auto i,dumpfile; ImageBase=0x400000 ; StartImg=0x400000; EndImg=0x0; if (Dword(ImageBase)==0x7f454c46 || Dword 0; i < size; i=i+1 ) { fputc(Byte(startimg+i),dumpfile); } } 这个题脱壳后就全是地址

10220

程序一定要从main函数开始运行吗?

Q: 链接器如何为他们分配在输出文件中的空间和地址? Tips: 外部符号指的是目标文件需要引用的符号,但是定义在其它目标文件中,链接前外部符号地址都是000000之类,链接后的可执行文件就可以看见这些外部符号都是有地址的。 链接就是把相似的段放在一起,先找到段的偏移地址,再找出符号在段中的偏移,这样可以确定符号在整个可执行程序中的地址。 注意:我们代码里明明用的是printf,为什么它却引用了puts的符号呢,因为编译器默认情况下会把只用一个字符串参数的printf替换成puts, 可以节省格式解析的时间,使用-fno-builtin会关闭这个内置函数优化选项 Linux一般程序的入口是__start函数,程序有两个相关的段: init段:进程的初始化代码,一个程序开始运行时,在main函数调用之前,会先运行.init段中的代码。

43130
  • 广告
    关闭

    2022腾讯全球数字生态大会

    11月30-12月1日,邀您一起“数实创新,产业共进”!

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    BROP 攻击技术 | PWN

    其实这种 stop_gadget 很多,比如函数入口什么的 能想到这种招的人真的不简单呀,佩服 根据上面的描述,使用如下 Python3 代码: # 这个函数用来获取 stop_gadget 的地址 # 如果从程序的基地址 0x400000 开始寻找的话,按照 Linux ELF执行的顺序,优先找到的肯定是 _start 函数,所以这里也可以说是寻找 _start 函数,对于我们的需求来说,找到 _start 提供参数,如果参数是可控的并且已知的,我们从基地址开始遍历,如果执行到某个地址的指令真的把我们提供的参数打印了出来,那么这个地址就是 puts 的 plt 地址了 如果再获取到 puts 的 plt dump 内存 有了 puts 的 plt 地址我们就可以调用 puts 函数来打印每一个地址的内容了,我们用它来 dump 内存 为什么要 dump 内存,dump 内存的意义何在呢? 这个非常非常重要,但是非常简单,本来我们获取到各种地址后,就跟常规的 ROP 没有什么区别了,也就是调用 system 函数 但是刚才我们也看到了, puts 函数的地址每次连接都是变化的,也就是说我们获取后

    71120

    elf格式分析

    然后依据文件的指示,系统设置设置代码段和数据段寄存器 4.然后依据文件的指示, 跳转到用户的代码的入口地址(一般就是我们的main函数) 5.从main開始,计算机就一条一条的运行我们给的指令 对于可运行文件来说,文件头包括的一下信息与进程启动相关 e_entry 程序入口地址 e_phoff segment偏移 e_phnum segment数量 0x1 Entry point address: 0x4000b0 //程序的入口地址是 Entry point address: 0x4000b0 //程序的入口地址是 设置该内存的权限是RE(可读,可运行) 为什么数据段的事实上地址是0x6000bc,而不是0x6000000呢,这是由Align决定的,Align决定内存和磁盘以1M为单位进行映射,在文件里

    9721

    编译、链接到载入、运行的大致过程----2.链接

    ”, 也有叫做“文件虚拟地址”的,我觉得都是一个意思:就是说 这个segment 是从这个 虚拟地址开始的,那么结束怎么计算呢? 看FileSiz 字段的值,这个值表示segment 的长度,开始地址加上长度就是结束地址了; 从上面readelf -l 输出的segment head的信息中: 对于cat (/usr/bin/cat )这个程序,编号为02的LOAD的segment 的地址范围是: 0x400000~0x40adcc,这个非常容易理解, 开始地址加上长度就是结束地址, 至此,我们已经获得了其中一个type为LOAD的 : 0x400000~0x40adcc 通过计算segment所包含的section, 获得的地址是: 0x400238~0x40adcc 为什么上述两种方式得到的同一个segment的地址会有偏差呢 如果segment 的开始地址不是在page的开头,结束地址不是在page的结尾,那么这两个地址都需要 进行page 对齐的调整;所以对上述的地址按照page对齐(4KB对齐就是 以0x1000为单位进行对齐

    38030

    PE知识复习之PE的重定位表

    如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234. 这也是为什么很多游戏外挂.等等.都选择DLL注入. 因为系统帮你重定位了各种信息. 代码写在DLL中即可. 如下图: B DLL 从0x20.... 展开了.规避了使用相同地址 ? 虽然这样解决了入口基址不一样.内存展开不一样. 但是我们知道.PE文件中有很多RVA .RVA 是相对于ImageBase的偏移进行存放的. 如果PE文件中都是 RVA 那就好办了. 但是不一定呀. 比如我们有地址 101234 101235 101236 这种修正的地址有10000个. 那么每个地址有4个字节的. 那么 4 * 10000 = 4万个字节. 所以修复的位置是 0x116b0的位置. 0x116b0 + 当前PE文件的ImageBase就是要进行重定位的位置 当前PE的Imagebase为0x400000 重定位地方为 0x4116b0位置

    65530

    如何使用scemu安全地模拟Shellcode执行

    -console_addr

    检测到第一个eip = address时生成终端 -a, --entry
    Shellcode的入口 选择内存映射目录 -R, --reg <REGISTER> 跟踪指定的寄存器,包括值和内容 -s, --string
    监控指定地址的字符串 ], being_debugged: 0x0, reserved2: 0x0, reserved3: [ 0xffffffff, 0x400000 ListEntry { flink: 0x0, blink: 0x0, }, reserved2: [ 0x0, 0x400000 filter_func: 0x51068c, handler_func: 0x288, }, try_level: 0x288, } => 项目地址

    17720

    esp32c3的系统底层启动分析

    power up 上电启动 看门狗复位 bootloader第二阶段 该程序开始存放在flash的0x0地址处,其中的作用是从flash中加载分区表,并且决定启动的程序位置,对于OTA来说非常有用处。 , len = 0x400000 ram (rw): org = 0x3FC80000, len = 0x50000 rtc_ram (rx): org = 0x50000000, len 接下来要开始构建裸机工程了。 为什么不用cmake或者makefile,原因是makefile的跨平台效率不是很好,而且语法比较复杂,而cmake也比较慢,所以想到以后可能会到windows上开发,换一种高效简单的工程构建方式比较, 其原理就是ROM中运行程序,每个函数都有特定的地址,只需要知道ROM函数对应的地址,就可以通过访问地址,从而访问函数。

    1K70

    数据结构算法整理-03-顺序栈与链栈

    特点: 先入先出 出入口只有一个(弹夹) 1. next; top=top->next; free(q); return top; } 记忆总结 链栈数据是通过数组存放,但外层依旧是一个结构体(跟顺序表一样) 栈满:top==MaxSize-1 为什么要减一 为什么top不从1开始

    15020

    NimHollow:基于Nim实现的进程镂空PoC

    输出文件名 --whispers2 使用NimlineWhispers2 生成syscalls.nim --debug 不从 查询创建的进程以从PEB(进程环境块)提取其基址指针: 3、读取镜像基址指针指向的8字节内存(对于64位体系结构),以获取镜像基址的实际值: 4、读取已加载EXE映像的0x200字节并分析PE结构以获取入口地址 : 5、向入口地址写入Shellcode并恢复线程执行: 项目地址 https://github.com/snovvcrash/NimHollow

    17910

    全网最硬核讲解计算机的启动过程

    假如我现在说,CPU 开机就是执行了这块区域的代码,然后巴拉巴拉一顿操作就开机了,你肯定要喷我了,为什么就执行到这了呢,那咋不从开始执行? BIOS 程序的入口地址也就是开始地址是 0xFFFF0(人家就那么写的),也就是开机键一按下,一定有一个神奇的力量,将 pc 寄存器中的值变成 0xFFFF0,然后 CPU 就开始马不停蹄地跑了起来。 五、BIOS 里到底写了什么程序 好了,我们现在知道了 BIOS 被映射到了内存的某个位置,并且开机一瞬间 CPU 强制将自己的 pc 寄存器初始化为 BIOS 程序的入口地址,从这里开始 CPU 马不停蹄地向前跑了起来 如果你有心的话应该能猜出,入口地址处可能是个跳转指令,跳到一个更大范围的空间去执行自己的任务。 ) 该入口地址处是一个跳转指令,跳转到 0xfe05b 位置,开始执行(二跳) 执行了一些硬件检测工作后,最后一步将启动区内容加载到内存 0x7c00,并跳转到这里(三跳) 启动区代码主要是加载操作系统内核

    37220

    按下开机键后的4.98秒

    假如我现在说,CPU 开机就是执行了这块区域的代码,然后巴拉巴拉一顿操作就开机了,你肯定要喷我了,为什么就执行到这了呢,那咋不从开始执行? BIOS 程序的入口地址也就是开始地址是 0xFFFF0(人家就那么写的),也就是开机键一按下,一定有一个神奇的力量,将 pc 寄存器中的值变成 0xFFFF0,然后 CPU 就开始马不停蹄地跑了起来。 五、BIOS 里到底写了什么程序 好了,我们现在知道了 BIOS 被映射到了内存的某个位置,并且开机一瞬间 CPU 强制将自己的 pc 寄存器初始化为 BIOS 程序的入口地址,从这里开始 CPU 马不停蹄地向前跑了起来 如果你有心的话应该能猜出,入口地址处可能是个跳转指令,跳到一个更大范围的空间去执行自己的任务。 ) 该入口地址处是一个跳转指令,跳转到 0xfe05b 位置,开始执行(二跳) 执行了一些硬件检测工作后,最后一步将启动区内容加载到内存 0x7c00,并跳转到这里(三跳) 启动区代码主要是加载操作系统内核

    22931

    Dubbo源码解析 —— 服务暴露原理

    前言 之前讲完了dubbo集群容错系列,现在开始讲比较重要的环节,也就是dubbo面试中比较喜欢问的两个: 服务发布和 服务引用. 暴露本地服务 暴露远程服务 启动netty 连接zookeeper 到zookeeper注册 监听zookeeper 从文档入手,了解全局 经常有人问到,看源码要怎么看.要了解这个服务发布,文档就是一个很好的切入口 下面要开始敲黑板划重点了. ? ? dubbo支持多种协议,默认使用的是 dubbo协议,具体介绍官方文档写得很清楚,传送地址:相关协议介绍 马不停蹄,下面就到了第三个面试题,也是服务发布的重点, 本地暴露和 远程暴露 ? 为什么会有 本地暴露和 远程暴露呢?

    72950

    dubbo源码解析-服务暴露原理

    ❈ 之前讲完了dubbo集群容错系列,现在开始讲比较重要的环节,也就是dubbo面试中比较喜欢问的两个:服务发布和服务引用. ❈ ? 暴露本地服务 暴露远程服务 启动netty 连接zookeeper 到zookeeper注册 监听zookeeper 从文档入手,了解全局 经常有人问到,看源码要怎么看.要了解这个服务发布,文档就是一个很好的切入口 下面要开始敲黑板划重点了. ? ? dubbo支持多种协议,默认使用的是dubbo协议,具体介绍官方文档写得很清楚,传送地址:相关协议介绍 马不停蹄,下面就到了第三个面试题,也是服务发布的重点,本地暴露和远程暴露 ? 为什么会有本地暴露和远程暴露呢?

    34020

    .NET实现之(ActiveX插件开发)

    在打算讲这篇文章之前我深思一个下午,打算分两篇来讲的,但是又怕读者看着嫌烦;其实稍微了解一ActiveX插件的朋友都能知道,这样一扯可能出现一堆问题;但是我还是决定通过简单的方式尽量让初学者少接触底层的东西包括 我主要会由浅入深的去逐层的讲解,对一些概念性的东西,我会给出参考资料供大家去学习,由于它的发展历史我也就不去讲解了,主要是实现为主;如果喜欢刨根问底的朋友可以去查询相关的文章或者看一些关于OLE、COM方面的书籍,就算我们不从事相关开发 插件就是一个很典型的COM组件,宿主在以OLE为容器的Web浏览器应用程序中,我们把这个OLE容器称为复合文档应用,复合文档应用程序在微软的系统到处可见如:Office就是一个很强大的复合文档应用程序,为什么要称为复合文档应用程序呢 ActiveX插件必须得有界面啊;所以我们新建一个Windows窗体控件库项目: 2: 新建后会出现一个默认的用户自定义控件我们随便放一个按钮就行了,然后写点测试代码; 3: 每一个ActiveX插件都有一个入口地址 ,这就是COM入口地址;我们就拿我们上面的这个测试界面作为入口地址;我们切换到代码视图; 4: 我们在这个类的上面添加了两个特性,ComVisible是否对COM公开,这个特性的意思就是说我们的组件是否能用于

    11110

    《一个操作系统的实现》笔记(5)--内核雏形

    被加载到的位置 ---- 偏移地址 BaseOfLoaderPhyAddr equ BaseOfLoader*10h ; LOADER.BIN 被加载到的位置 ---- 物理地址 ;... ; GDT memcpy(pPHdr->p_vaddr,BaseOfKernelFilePhyAddr+pPHdr->p_offset,pPHdr->p_filesz) 现在的内存分布式这样的:0x90000开始的 63KB留给了Loader.bin,0x80000开始的64KB留给了Kernel.bin,0x30000开始的320KB留给了整理后的内核,而页目录和页表被放置在了1MB以上的内存空间 ;** ; 比如把 KernelEntryPointPhyAddr 和 -Ttext 的值都改为 0x400400, ; 则 KERNEL 就会被加载到内存 0x400000(4M) 处 ,入口在 0x400400。

    59340

    Maix Bit 系列心得(4)--- 人脸识别

    Author:AXYZdong 自动化专业 工科男 有一思考,有一想法,有一理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDN@AXYZdong,CSDN首发,AXYZdong原创 唯一博客更新的地址为: ? AXYZdong的博客 ? 一、实现步骤 具体操作步骤:MaixPy实现人脸识别 二、心得体会 刚开始以为只要把 key_gen_v1.2.bin 烧录进去,然后就可以跑脚本了。 task_fe = kpu.load(0x400000) # 从flash 0x400000 加载人脸196维特征值模型 clock = time.clock() # 初始化系统时钟,计算帧率 key_pin plist=fmap[:] # 获取关键预测结果 le=(i.x()+int(plist[0]*i.w() - 10), i.y()+int(plist

    28830

    手动打造一个弹窗程序

    SizeOfOptionalHeader 描述Optional头的长度,在自己写程序进行分析的时候,一定要注意这一,原版的OD直接使用sizeof来获得了,忽视了这个值是变长的,我们可以自己来更改,达到反调试的目的 Magic 类型识别,可以来判断到底是32位还是64位,再或者是其他的,我们使用32位的,为0x10b AddressOfEntryPoint 程序入口,因为头部对齐后为200字节,所以程序就从文件的 200位置开始写,对应到内存中就是1000,所以填写0x1000 ImageBase 建议装载地址,这个地址并不是一定能占住的,如果没有到这个位置的话,会根据重定位表来修正程序中的地址,因为要写一个exe 文件,一般默认是0x400000 SectionAlignment 内存对齐,填写0x1000 FileAlignment 文件对齐,填写0x200 MajorSubsystemVersion 这个版本号是不能进行修改的 0x05 构造导入表 在完成了这些内容以后,就需要开始构造导入表了,因为我们需要调用MessageBoxA函数来实现弹窗的功能。

    17210

    扫码关注腾讯云开发者

    领取腾讯云代金券