![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
汇编学习
文章平均质量分 70
1_f0rm4t3d
-
展开
-
汇编学习笔记(一)
小菜无才,今天拿出自己的笔记献丑,大神莫喷预备知识:11:22 2012-8-19电瓶脉冲:就是CPU的01脉冲 《编码的奥秘》--底层必学汇编:是直接面对硬件编程,效率是所有语言里最高的,汇编是机器指令(01代码)的助记符,汇编和人类语言接近,便于阅读和记忆(汇编语言是不区分大小写的)还有在CPU里面其实所有的运算都可以通过加法来实现的,寄存器:原创 2013-09-02 23:00:15 · 1199 阅读 · 0 评论 -
加壳学习笔记(二)-汇编基础
简单的call函数过程 1.参数入栈,返回地址入栈。在一个栈帧里,call function的完整过程应该是这样的,call调用的过程要经历两个过程,一个是首先把调用函数之前的指令的下一条指令地址压入栈中(push ebp),作为返回地址,也就是保存旧栈地址,接着会跳转到被调函数的地址入口。呵呵,现在就是借此来恶补汇编哈。 2.代码区跳转。在执行被调函数的时候,为函数重新开辟栈帧,(mov ebp,esp)这句的意思是将旧栈顶换为新栈的底,这里的新栈一般是由函数专属的哈, 下面就是用sub esp,原创 2014-05-19 23:18:18 · 1519 阅读 · 0 评论 -
加壳学习笔记(一)-基础知识
1.预备知识 1.关于栈,在windows里面的堆栈其实很简单,当学了才知道哈,呵呵,第一要记住的是windows里面的栈是向低地址生长的(extended,延伸,呵呵,顺便丰富下英语的单词量,确实是少的可怜),你可以这样认为,栈就像是一个倒立的箱子,箱子的口子是向下的,底是向上的,这里就表明了系统栈的分布也是延伸方向是由高地址向低地址extended,在最初的原创 2014-05-19 23:11:18 · 1862 阅读 · 0 评论 -
加壳学习笔记(三)-简单的脱壳思路&调试思路
1.首先F3加载应用程序,然后一路F8直到自己停下来,或者是ctrl+F8他会自己运行,直到出现自己停下的时候(也就是OllyDbug把程序的控制权交出,转由应用程序自己控制,呵呵,不行,还得唠唠其他的......下面先跳转一下) 控制权、领空:关于程序的控制权和领空的问题,OllyDbug是一个强大的程序调试工具,具有强大的调试和反汇编能力,他会在应用程序拉到内存的那一刻,就牢牢的控制了该程序,具体的方法是(个人猜想而已):OD把程序拉到内存的同时,就是一个领孩子入瓮的问题,呵呵,实际这里原创 2014-05-19 23:23:10 · 2250 阅读 · 0 评论 -
C++分析淹没EIP
可定位的EIP位置,利用数据段数据给EIP位置赋值,强行转移程序的执行流程,也就是关键是pop EIP时栈顶的数据决定,因为EIP会把pop过来的数据当指令地址去寻址执行,这下问题就清晰了,应该是可以把它转移到一个可执行代码段(比如自己的ShellCode),以上只是个人的简单理解,手写的大致汇编流程,一定有很多错误,求指点!原创 2013-09-25 21:45:14 · 1730 阅读 · 0 评论 -
汇编学习笔记(六)
第十四章 端口访问端口:使用in和out指令分别往端口读和写 ,如:in al,60H ;就是往al中写入60H中的数据,读入一个字节,这里的端口读写和内存的读写是一样的,只是执行的对象不同COMS RAM 芯片:1.包含一个时钟和一个由128个存储单元的RAM存储器,早期的计算机为64个字节2.该芯片靠电池供电,因此,关机后其内部的实时钟仍可以正常工作,RAM 的信息不原创 2013-09-05 19:00:18 · 996 阅读 · 0 评论 -
汇编学习笔记(五)
第十章 call 和 ret 指令call和ret指令都是转移指令,他们都修改IP或同时修改CS:IP的值ret指令:该指令用栈中的数据,修改IP的内容,从而实现了近转移,CPU执行ret指令时,进行下面两步操作:1.(IP)=((SS)*16 +(SP))2.(SP) = (SP) +2 ;这里实现的具体步骤是,把同一个栈区的一个地址(可能是数据段的地址)传给IP,让原创 2013-09-05 18:55:58 · 896 阅读 · 0 评论 -
汇编学习笔记(三)
第五章 LOOP和[BX][bx] :如果在编辑器里面想把偏移地址为[0]的内容放入 mov ax,[0] ax中,需要在前面加一个 mov bx,[0] 然后再进行 mov ax,[bx]对mov ax,[bx]的理解 bx存放的数据作为一个偏移地址EA,段地址SA默认在DS段寄存器中,将SA:EA处的数据送入ax中,即(ax)=((ds) * 16 +(bx)); 括号括的内容原创 2013-09-03 09:26:38 · 1010 阅读 · 0 评论 -
汇编学习笔记(二)
第三章:寄存器(内存访问)内存中字的存储:如存放的是20000H,就在高地址存放高端位,低地址存放低端为,记住,在内存的地址是以字节为单位的,就是说没隔8位为一个地址加1,字型数据:就是两个字节,在任何两个地址的连续的内存单元可以看做是两个内存单元,也可以看做是一个字的高低8位(高位字节单元和低位字节单元)DS和[address]:就是说在[]直接接内存的偏移地址,注意是偏移地原创 2013-09-03 09:22:05 · 956 阅读 · 0 评论 -
汇编学习笔记(四)
第七章:更灵活的定位内存地址 实现双层循环的思路:将外层的cx的值在覆盖前首先保存到一个位置存放,然后再进行覆盖,当内层的循环执行完了之后,再拿出外层的值赋给cx,进行外层循环,如此一来,便记忆了两次循环的次数双层循环实现:assume cs:aaaa segmentstart: mov ax,1 mov cx,3s: add ax,ax mo原创 2013-09-03 09:31:07 · 1355 阅读 · 0 评论 -
三种方法打印 main函数的返回地址的值(old EIP)(用途,你懂得!)
这里可以简单的修改任意函数的返回地址,可以做到自定义EIP的指向,即可执行当前进程空间的任意指令,这里只是让大家更清楚栈帧结构,没有涉及跨进程的inline HOOK 等,后面会陆续讲下读取任意进程内存,修改任意进程函数执行流程等方法。 废话不多说了,直接上菜: #include #include /* 打印 main函数的返回地址的值(用途,你懂得!)原创 2014-09-28 23:16:04 · 3685 阅读 · 0 评论