jmp

汇编语言之转移指令

拜拜、爱过 提交于 2020-02-11 01:48:17
汇编语言–转移指令 操作符 offset 功能:取得标号的偏移地址 程序: assume cs:codesg codesg segment start:mov ax,offset start ;相当于mov ax,0 s:mov ax,offset s ;相当于mov ax,3 codesg ends end start start和s是代码段中的标号,offset操作符取得了标号start和s的偏移地址0和3。 jmp指令的用法 jmp为无条件转移指令,可以只修改IP,也可以同时修改CS和IP。 1. 依据位移进行转移 段内短转移格式:jmp short 标号 作用:转到标号处执行指令,即(IP)=(IP)+8位位移,它对IP的修改范围为-128~127。 程序: assume cs:codesg codesg segment start:mov ax,0 jmp short s add ax, 1 s:inc ax codesg ends end start 上面的程序执行后,ax中的值为1,因为执行jmp short s后越过了add ax,1, IP指向了标号s处的 inc ax。也就是说,程序只进行了一次ax加1操作。 段内近转移格式:jmp near ptr 标号 作用:与“jmp short 标号”功能相近,不同之处在于(IP)=(IP)+16位位移

汇编语言(王爽)9章jmp指令

六眼飞鱼酱① 提交于 2020-02-09 01:26:42
jmp short 标号 jmp near ptr 标号 jmp far ptr 标号 jmp 16位reg,如jmp ax jmp word ptr 内存单元地址 jmp dword ptr 内存单元地址 详情百度https://www.jianshu.com/p/c685c1c033ff 若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据? 若要指向第一条指令,则要使IP的值为0000H即可,而jmp word ptr为段内转移指令,相当于把IP值赋值为后面内存单元的值,故只需要[0001]处的字是0即可。 即[0001]和[0002]处的字节都是0。 使用t单步执行,可以发现程序进入死循环。 assume cs : code data segment ? //db 'x',0,0,'x' data ends code segment s : mov ax , data mov ds , ax mov bx , 0 jmp word ptr [ bx + 1 ] mov ax , 4 c00h int 21 h code ends end s (2)补全程序,使得jmp指令执行后,CS:IP指向第一条指令 由于执行jmp指令后指向第一条指令,CS段没有改变,只需要改变IP值为0000H

Inject shellcode into PE file

只愿长相守 提交于 2020-02-03 15:54:48
先声明这是不免杀的,只是演示。 新增节 一般能实现特定功能的shellcode的长度都比较长,可以分到几个节上的空白区,但是这样麻烦啊,或者把最后一个节扩大,但是最后一个节一般没有执行的属性。所以选择新增一个节表。 修改添加节表 先判断一下最后一个节表后面有没有够40个字节新增一个节表的结构体,正常的都够。 把第一个节表拷贝写到最后一个节表的后面,因为第一个节表的属性默认是可执行的,可以省了后面的修改。 节表是复制过来的所以还要修改很多东西,先获取一下文件对齐和内存对齐。 SectionAlignment 内存对齐 在 扩展PE头 上的第十一个属性,基于扩展PE头偏移地址32个字节,大小为DWORD。当前的程序的为:1000h。 FileAlignment 文件对齐 在 扩展PE头 上的第十二个属性,基于扩展PE头偏移地址36个字节,大小为DWORD。当前程序得为200h。 大小 英文名 描述 1*8 Name[8] 就是pdata,为了给杀毒软件看着正常一点,尽量改为PE文件有的名称 4 VirtualSize 1000h,也就是00 10 00 00 4 VirtualAddress 上一个节表的 VirtualAddress 加上上一个VirtualSize再按照 SectionAlignment 的整数倍对齐。 4 SizeOfRawData FileAlignment

一点一点学汇编2

ε祈祈猫儿з 提交于 2020-01-30 05:54:32
寄存器 这回我们来看寄存器。CPU是由运算器,控制器,寄存器这些个器件组成。 运算器 主要负责数据的各种数据的处理工作,比如算数运算,逻辑运算; 控制器 是根据给出的相应的机器指令,发出对应的具体控制信号驱动硬件工作。它有指令译码的工作,就是根据指令寄存器的内容,产生相应的微指令; 加法指令的执行可分为:取指,计算地址,取操作数和加法运算四步,每一步都由一组微操作实现.这一组能同时执行的微操作就构成一条微指令。 寄存器 则是CPU中存储数据的部件。对于一个汇编程序员,CPU中最重要的部件就是寄存器。通过对各个寄存器数据的改变,完成对于CPU的控制。不同的CPU,寄存器的结构,数量是不同的。比如,8086CPU中有14个寄存器,名称分别是:AX,BX,CX,DX,CS,DS,ES,SS,IP,SP,BP,SI,DI,PSW。我们不在这里一一介绍每个寄存器的功能,以后用到什么寄存器,就学习什么。大体上我会按照书上的顺序来写这些寄存器。 上述这些个器件,全部集成到了一个CPU芯片中。CPU中数据的传输通过 内总线 进行。前面一篇提到了总线,那个总线是指 外总线 ,是用来连接CPU和主板上的其他部件的。 ----------------------------------------------------------------------------------------------

upx 手动脱壳

倖福魔咒の 提交于 2020-01-26 22:53:36
查壳 UPX 0.89.6 - 1.02 / 1.05 - 2.90 (Delphi) stub -> Markus & Laszlo upx这类压缩壳手动脱壳非常简单。 一、 查找oep 二、 dump、修复IAT 一、查找oep way1: 首先在程序入口发现pushad指令,接下来可以直接查找指令popad 在jmp指令处下断,运行。 jmp之后来到oep way2: 当然可以在单步pushad后,转到esp的内存窗口,设置硬件断点,运行,找到jmp处。 运行后会在popad指令后停下 跟踪jmp将转到oep 二、dump、fix dump 在x64dbg下使用Scylla 删除掉失效函数。 最后 脱壳完成。 如果没有修复,直接运行程序可能会报错 修复IAT后程序便可以正常运行。[fix dump] 来源: https://www.cnblogs.com/DirWang/p/12234943.html

Syclover2019 WP

喜你入骨 提交于 2020-01-26 22:52:49
pwn Find Tools 没有附件,只给了远程环境,目的是让我们使用pwntools工具,exp如下: from pwn import * p=remote('pwnto.fun',9999) p.recvuntil("password:") p.send('l1ve_l0ng_and_pwn') #此处不能使用sendline(引入'\n') p.recv() print p.recv #!将接收到的flag打印出来 #p.interactive() 这道题只是发送和接收包,flag是通过接收得到的,而不是通过拿到shell得到的,所以并不需要交互 pwntools IO模块使用: p.send(data) #发送数据 p.sendline(data) #!! 发送数据和'\n' p.recv(numb=2048,timeout=default) #接收指定字节和超时的数据 p.recvline(keepends=True) #接收一行数据 p.recvuntil("...",drop=false) #接收数据直到我们设置的标志 p.recvall( ) #一直接收到EOF为止 p.recvrepeat(timeout=default) #持续接收直到EOF出现或超时 p.interactive( ) #得到shell后进入交互模式 Baby rop 查看保护:

《30天自制操作系统》笔记(12)——多任务入门

送分小仙女□ 提交于 2020-01-10 06:56:22
《30天自制操作系统》笔记(12)——多任务入门 进度回顾 上一篇 介绍了设置显示器高分辨率的方法。本篇讲一下操作系统实现多任务的方法。 什么是多任务 对程序员来说,也许这是废话,不过还是说清楚比较好。 多任务就是让电脑 同时 运行多个程序(如一边写代码一边听音乐一边下载电影)。 电脑的CPU只有固定有限的那么一个或几个, 不可能 真的同时运行多个程序。所以就用近似的方式,让多个程序 轮换 着运行。当轮换速度够快(0.01秒),给人的 感觉 就是"同时"运行了。 多任务之不实用版 我们首先从最基本的想法开始,做一个不实用版的多任务作为例子。在学习这个例子的过程中引入真正的多任务必须的TSS、TR、far模式JMP的概念,为后续内容打基础。 当你向CPU发出任务切换的指令时,CPU会先把寄存器中的值全部 写入 内存某处;然后,从内存另一位置把所有寄存器的值 读取 出来。这就完成了一次任务切换。 任务切换消耗的时间就是读写内存消耗的时间,大概为 0.0001秒 。 任务状态段TSS 存取全部寄存器的值这件事,当然需要有一个数据结构,这就是 "任务状态段" (Task Status Segment)简称TSS。 1 struct TSS32 2 { 3 int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3; 4 int eip,

手脱UPX(3.91)

可紊 提交于 2020-01-08 05:40:14
1、使用Detect It Easy进行查壳; 2、 使用x32dbg打开该带壳程序,在选项->选项 ->异常中添加区间设置0~FFFFFFFF全忽略; 3、我们F9运行到程序入口处,看到了pushad,我们使用ESP定律进行脱壳; 4、运行后的位置在lea eax,我们可以看到其下有jne upx(3.91).407ABB,jmp upx(3.91).4012CD,我们当前的EIP地址为00407AB7,此处是个大跳转,极有可能是OEP,在jmp下断点,F9运行至此处,单步步入; 5、在此处就可以进行脱壳操作; 6、再次查壳; 7、总结; 该壳是一款不错的压缩工具,用UPX压缩过的可执行文件体积缩小50%-70%,但UPX每个版本使用的方法一样,也就意味着,这种方法能够脱去UPX的多个版本; 来自为知笔记(Wiz) 来源: https://www.cnblogs.com/HOPEAMOR/p/12000801.html

x64技术之SSDT_Hook

瘦欲@ 提交于 2020-01-07 09:04:39
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 测试环境: 虚拟机: Windows 7 64bit 过PG工具 驱动加载工具 PCHunter64 系统自带的计算器和任务管理器等 实现思路: 实际思路与win32的思路一样.都是替换SSDT表里边的函数地址.不过微软被搞怕了,所以在x64上做了一些手脚. 具体手脚就是x64通过SSDT得到的函数地址,不是真实的函数绝对地址了,而是加密了的. HOOK 1.得到系统服务表基址 2.保存需要Hook的函数地址(实际为偏移) 3.使内存可写,把表中要Hook的地址替换成KeBugCheckEx的地址,还原内存属性 4.HookKeBugCheckEx函数,在其开始处jmp到我们自己的函数地址. 5.自己实现Hook的函数,在其中做处理. 注: 简单说一下,win10x64th2及之前的版本,原始地址的保存方式是八字节的,每个地址是需要重定向的绝对地址,但从win10x64rs1开始,原始地址保存方式是四字节的,每个地址是不需要重定向的相对地址。 简单说公式就是 original_address=image_base+address_read_from_file 其中original_address和image_base是八字节整形,address_read_from_file是四字节整形 之前的公式是:

深入底层逆向分析TDC‘s keygenme(手脱压缩壳)

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-31 01:38:06
系统 : Windows xp 程序 : TDC‘s keygenme 程序下载地址 : http://pan.baidu.com/s/1gdWyt6z 要求 : 脱壳 & 注册机编写 使用工具 :OD & IDA & PEID & LordPE & Import REC 可在“PEDIY CrackMe 2007”中查找关于此程序的分析,标题为“ TDC.Crackme10算法分析 ”。 首先了解一下壳是什么: 作者编好软件后,编译成exe可执行文件。 1.有一些版权信息需要保护起来,不想让别人随便改动,如作者的姓名等,即为了保护软件不被破解,通常都是采用加壳来进行保护。 2.需要把程序搞的小一点,从而方便使用。于是,需要用到一些软件,它们能将exe可执行文件压缩, 3.在黑客界给木马等软件加壳脱壳以躲避杀毒软件。                                               --源自百度百科 简单说来,壳就是用来防止破解者对于程序文件的非法修改。壳又分为压缩壳、加密壳。他们的应用范围也不尽相同,压缩壳主要用来压缩程序文件的体积,对于破解者来说强度不大。而加密壳以加密保护为重点,用尽了各种反跟踪技术,保护重点是在OEP(程序入口点)的隐藏和IAT(输入表)的加密上。 这篇博文中我们来尝试破解一个被压缩壳保护、带有简单反调试的程序。