jmp

2020 "第五空间"智能安全大赛 Re nop

夙愿已清 提交于 2020-08-07 21:47:08
测试文件: https://wwa.lanzous.com/is4hte2ulfc 代码处理 这道题是花指令相关题目,利用int 80h做中断。 首先将包含int 80h中断的 sub_804857B , sub_80485C4 函数和反调试函数 sub_804865B 全部nop掉。 接着,将 push 地址 ... pop ebx jmp ebx 这种形式的代码,都修改为 jmp 地址 这样在反编译后能够看到跳转的函数 void __cdecl main( int a1, char ** a2) { char *v2; // eax int savedregs; // [esp+8h] [ebp+0h] v2 = * a2; puts( " input your flag " ); __isoc99_scanf( " %d " , & dword_804A038); ++ dword_804A038; ++ dword_804A038; dword_804A038 -= 0x33333334 ; ++ dword_804A038; sub_8048751(( int )& savedregs); } 代码分析 第一部分 第9~13行代码,对输入num+3-0x33333334 第二部分 进入sub_8048751函数 int __usercall sub_8048753@

基于C51单片机的丁字路口交通灯控制系统

前提是你 提交于 2020-08-07 21:38:55
基于C51单片机的丁字路口交通灯控制系统 项目要求:用单片机设计一套丁字路口的交通灯显示系统,如图所示,有三组相同的道路显示系统 项目概述:采用多机通讯实现对多个红绿灯的控制 主机功能:主机,用于在特殊情况下操纵从机,和对从机的时间统一。 从机功能:从机,每隔10s红灯亮、每隔10s绿灯亮,绿灯到红灯时黄灯闪烁3秒。 项目图纸: 概览图: 2. C51单片机连图: 3. 丁字路口模拟图: 4. 紧急情况处理按钮: 项目代码 代码注释较为详细,自行观看 程序中断图: 主机代码: // 程序说明 ; 主机,用于在特殊情况下操纵从机,和对从机的时间统一。 ; 采用串口通信方式二,波特率固定fosc/64 ; SCON = 1000 0000B = 80H, PCON = 00H 波特率不加倍 ; 定时器T0,方式1,50ms中断一次,20次为1s。 ; 初值:X = 2^16 - (50 * 10^-3) / (1 * 10^-6) = 15536D = 3CB0H // 变量定义 START EQU 30H STOP EQU 31H // 程序起点 ORG 0000H ; 复位入口 LJMP MAIN ; 转到主程序 ORG 000BH ; T0中断入口 LJMP COUNTTIME ; 转到T0中断服务程序 ORG 0023H ; 串行中断入口 LJMP CONNECT ;

汇编语言(王爽 第三版)检测点

别来无恙 提交于 2020-08-05 12:03:23
这本书购于2015.11.30,我大概从2016.3月开始读,历时大概三个月,我们学校开《微机原理与汇编语言》这门课,不过让人感觉很不爽,课本一开始就丢给你一堆东西,意欲让你记住这一大堆东西,然后开始编程,我对编程语言的学习方面要求比较高,所以开始读这本王爽老师写的汇编语言,目前为止,这本书给我的感觉就是,你能学到很多底层的东西,尤其是像键盘的读写原理,屏幕的显示,特别是对内存的操作和管理,不像课本上给你一个中断让你就能显示字符之类的,它会一步一步教你怎么把要显示的东西写到显存里面,这本书显得比较浅显易懂,让人感觉不错,特别是读了这本书再去看那些难度较高的汇编代码及微机原理,效率会高很多,下面是我读这本书的过程中对书中检测点的解答,仅代表个人观点。 第一章 检测点1. 1 1 ) 13   (8kb = 8 * 1024 = 2 ^ 13)   2 ) 1024 0 1023 3 ) 8 * 1024 1024   ( 1 byte = 8 bit,计算机以byte为存储单位) 4 ) 1024 ^ 3 1024 ^ 2 1024 5 ) 2 ^ 6 1 2 ^ 4 2 ^ 2   (kb = 2 ^ 10 Mb = 2 ^ 20 Gb = 2 ^ 30) 6 ) 1 1 2 2 4 7 ) 512 256   (8086的寄存器为16位寄存器,一次可以读取两个字节

[C++]类的空指针调用成员函数后,会发生什么事?

≡放荡痞女 提交于 2020-08-04 12:32:33
类的实例调用成员函数的原理 其实不管是通过对象实例或指针实例调用,其实底层调用的过程都是一样的,都是把当前对象的指针作为一个参数传递给被调用的成员函数。通过下面的相关实例代码进行检验: 实验的C++代码 class Student { private: int age; public: Student() {} Student(int age) : age(age) {} int getAge() { return this->age; } }; int main(int argc, char const *argv[]) { Student s(10); int age = s.getAge(); Student* ps = new Student(10); age = ps->getAge(); return 0; } 基于VS2015调试功能的反汇编代码 int main(int argc, char const *argv[]) { 00A41860 push ebp 00A41861 mov ebp,esp 00A41863 push 0FFFFFFFFh 00A41865 push 0A461D2h 00A4186A mov eax,dword ptr fs:[00000000h] 00A41870 push eax 00A41871 sub esp,104h

2020 "第五空间"智能安全大赛 Re nop

拟墨画扇 提交于 2020-07-29 06:39:07
测试文件: https://wwa.lanzous.com/is4hte2ulfc 代码处理 这道题是花指令相关题目,利用int 80h做中断。 首先将包含int 80h中断的 sub_804857B , sub_80485C4 函数和反调试函数 sub_804865B 全部nop掉。 接着,将 push 地址 ... pop ebx jmp ebx 这种形式的代码,都修改为 jmp 地址 这样在反编译后能够看到跳转的函数 void __cdecl main( int a1, char ** a2) { char *v2; // eax int savedregs; // [esp+8h] [ebp+0h] v2 = * a2; puts( " input your flag " ); __isoc99_scanf( " %d " , & dword_804A038); ++ dword_804A038; ++ dword_804A038; dword_804A038 -= 0x33333334 ; ++ dword_804A038; sub_8048751(( int )& savedregs); } 代码分析 第一部分 第9~13行代码,对输入num+3-0x33333334 第二部分 进入sub_8048751函数 int __usercall sub_8048753@

8086汇编语言程序设计——分支

二次信任 提交于 2020-07-29 03:35:16
汇编语言程序和高级语言程序一样,有顺序、分支、循环、子程序四种结构形式。 计算机程序在执行过程中,可以改变程序的执行顺序,根据一定的条件进行转移,使程序完成更复杂的功能。汇编语言提供了无条件转移指令和条件转移指令。 一个分支程序的例子 示例 设计分支程序,实现下列公式计算。X、Y为字型。假设X单元中保存三个数:9,-6,34,分别作判断和计算。 设计思路: (1) 在数据段中定义2个字型变量X、Y,均为带符号数; (2) 在X单元中依次取出三个数分别作判断,根据X的大小作分支转移; (3) 采用寄存器相对寻址方式(MOV AX,X[SI])取出X的三个值; (4) 标号OUT1是各路分支的公共出口。 程序框图: 代码: ; a.asm 用正常程序格式编写分支程序 data segment x dw 9 ,- 6 , 34 y dw 3 dup(?) ;定义一个变量,占3的字,每个字的内容未知 data ends code segment assume cs: code, ds: data start: mov ax,data mov ds,ax mov cx, 3 ;循环三次 mov si, 0 let0: mov ax,x[si] ;取出X cmp ax, 0 ;X ≥ 0 ? jge let1 ;是,转到let1 mov bx,ax ;否,计算X*X imul bx jmp

《30天自制操作系统》笔记3 --- (Day2 上节)完全解析文件系统

大城市里の小女人 提交于 2020-07-28 07:39:48
Day2 汇编语言学习与Makefile入门 本文仅带着思路,研究源码里关于文件系统的参数 关于day2主程序部分及更多内容,请看 《30天自制操作系统》笔记 导航 发现学习中的变化 源码差异分析 FAT12/FAT16/FAT32相关资料 开始全面分析 资料大全 发现学习中的变化 day1代码(只简单地使用DB DW DD RESB指令) 1 ; hello-os 2 ; TAB=4 3 4 ; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code 5 6 DB 0xeb, 0x4e, 0x90 7 DB " HELLOIPL " ; 启动扇区名称(8字节) 8 DW 512 ; 每个扇区(sector)大小(必须512字节) 9 DB 1 ; 簇(cluster)大小(必须为1个扇区) 10 DW 1 ; FAT起始位置(一般为第一个扇区) 11 DB 2 ; FAT个数(必须为2) 12 DW 224 ; 根目录大小(一般为224项) 13 DW 2880 ; 该磁盘大小(必须为2880扇区1440*1024/512) 14 DB 0xf0 ; 磁盘类型(必须为0xf0) 15 DW 9 ; FAT的长度(必??9扇区) 16 DW 18 ; 一个磁道(track)有几个扇区(必须为18) 17 DW 2 ; 磁头数(必??2) 18

Linux Rootkit躲避内核检测

一曲冷凌霜 提交于 2020-07-28 02:54:54
来自 Linux Rootkit如何避开内核检测的 Rootkit在登堂入室并得手后,还要记得把门锁上。 如果我们想注入一个Rootkit到内核,同时不想被侦测到,那么我们需要做的是精妙的隐藏,并保持低调静悄悄,这个话题我已经谈过了,诸如进程摘链,TCP链接摘链潜伏等等,详情参见: https://blog.csdn.net/dog250/article/details/105371830 https://blog.csdn.net/dog250/article/details/105394840 然则天网恢恢,疏而不漏,马脚总是要露出来的。如果已经被怀疑,如何反制呢? 其实第一时间采取反制措施势必重要!我们需要的只是占领制高点,让后续的侦测手段无从开展。 我们必须知道都有哪些侦测措施用来应对Rootkit,常见的,不外乎以下: systemtap,raw kprobe/jprobe,ftrace等跟踪机制。它们通过内核模块起作用。 自研内核模块,采用指令特征匹配,指令校验机制排查Rootkit。 gdb/kdb/crash调试机制,它们通过/dev/mem,/proc/kcore起作用。 和杀毒软件打架一样,Rootkit和反Rootkit也是互搏的对象。 无论如何互搏,其战场均在内核态。 很显然,我们要做的就是: 第一时间封堵内核模块的加载。 第一时间封堵/dev/mem,

c语言没有try catch的替代方案

心不动则不痛 提交于 2020-07-27 22:07:02
setjmp与longjmp 后缀jmp指的就是jump,关看名字就能猜到这哥俩是干啥的了。使用他们俩就可以让程序控制流转移,进而实现对异常的处理。 异常处理的结构可以划分为以下三个阶段: 准备阶段:在内核栈保存通用寄存器内容 处理阶段:保存硬件出错码和异常类型号,然后向当前进程发送信号 恢复阶段:恢复保存在内核栈中的各个寄存器内容,返回当前进程的断电处继续执行 过程有点类似递归,只有文字你可能看的有点云里雾里,我们结合一个小例子来看看 #include <stdio.h> #include <setjmp.h> static jmp_buf buf; void second(void) { printf("second\n"); // 跳回setjmp的调用处 - 使得setjmp返回值为1 longjmp(buf, 1); } void first(void) { second(); //这行到不了,因为second里面longjmp已经跳转回去了 printf("first\n"); } int main() { int rc; rc = setjmp(buf); if (rc==0) { // 进入此行前,setjmp返回0 first(); } // longjmp跳转回,setjmp返回1,因此进入此行 else if(rc==1){ printf("main\n");

int3和SingleStep联合实现Linux系统键盘监控(kprobe原理)

做~自己de王妃 提交于 2020-07-27 12:59:34
就着Linux系统键盘监控这个话题,再写点什么。 前面已经写了三篇,可以一起汇总着看,算是一个简单的一题多解吧: 标准inline hook的方法: https://blog.csdn.net/dog250/article/details/106425811 手工push/ret jmp inline hook的方法: https://blog.csdn.net/dog250/article/details/106481123 手工构造push %rbp效果的方法: https://blog.csdn.net/dog250/article/details/106493618 以上所有的这些,都不是Linux内核标准的做法,如果把这些看作一些奇技淫巧的话,Linux内核标准的做法则是另一种把戏: int3结合debug寄存器单步执行。 是的,这就是Linux内核kprobe的方法。一个完整的kprobe闭环如下图所示: 【绝大多数文章都没有说清楚kprobe的原理,只是单纯的源码分析】 按照这个逻辑, inline hook可以hook 任意位置,任意指令长度的代码了。 对于键盘监控,按照上述原理,下面是代码: // int3debughook.c # include <linux/module.h> # include <linux/kdebug.h> # include