ret指令

call和ret(f)指令

女生的网名这么多〃 提交于 2020-02-07 18:59:31
call指令 CPU执行call指令时,进行两步操作 将当前的ip(eip)或者cs和ip(ecs和eip)压入栈中 跳转到标号处 call 标号 将当前的IP压栈后,转到标号处执行指令 相当于: push ip jmp near ptr 标号 call far ptr 标号 相当于执行: push CS push IP jmp far ptr 标号 RET指令 CPU执行ret指令,相当于执行 pop ip retf指令 CPU执行retf命令时,相当于执行 pop ip pop cs 来源: CSDN 作者: d1l1 链接: https://blog.csdn.net/qq_41683305/article/details/104208447

2018.5.29 完成attacklab

喜欢而已 提交于 2020-01-14 13:26:45
把第四个attack做了,第四个和第五个attacklab和前边的stack overflow攻击不同,是另一种更先进的return oriented programming攻击。 这里的目标代码在编译中加入了地址随机和栈中代码不可执行这两个保护。也就是说你不知道栈究竟在哪,每次代码执行栈的位置都不一样的,即使你找到了栈的位置,你注入到栈上的代码也没办法执行。 但是,这两个措施并没有改变ret这个指令仍然会去执行代码的事实,并且代码的地址是不变的,那么我们的攻击方式就变成了:拆分现有的代码成为我们想要的代码,然后用ret去一条一条执行现有的代码——有点像是拼碎片的感觉。 所以基本上就是在栈溢出的部分放上你的gadget们的所在地址,需要注意的是最后一定要以ret结束,这样才会返回栈上执行下一个gadget。 如果gadget中有pop指令的话栈上还需要混入准备好的数据,pop之后当然也要以ret结束,这里有一个小trick是0x90这个代码是无操作的意思,可以夹在任何指令中间,我刚开始没搞明白这一点,弄得很痛苦。 第五个attack是道附加题,据说很难,我自然喜闻乐见的被劝退了。 所以,总算能完成这个很无聊的lab还是很令人高兴的。。。 最后看了一节视频,leture 10,对应csapp的第五章,讲一些代码优化的方法。基本上还是很无聊的——主要是没有相应的lab

CALL和RET指令实验

删除回忆录丶 提交于 2019-12-06 04:49:06
实验10 在屏幕8行3列,用绿色显示data段中的字符串 assume cs:code data segment db'Welcome to masm!',0 data ends code segment start: mov dh,8 ;行 mov dl,3 ;列 mov cl,2 ;颜色 mov ax,data mov ds,ax mov si,0 ;字符串首地址 call show_str mov ax,4c00h int 21h show_str: push ax ;用到的寄存器入栈 push bx push cx push dx push es push di mov ax,0B800h ;定义显示缓冲区的段地址 mov es,ax ;N为行,M为列 ;计算写入首地址的偏移地址 公式:1) 0A0H*(N)+M*2 mov al,dh mov ah,0 mov bl,0A0h ;每行偏移A0H mul bl mov bl,dl mov bh,0 add ax,bx add ax,bx mov di,ax ;ax为首地址的偏移地址 mov dl,cl ;dl存颜色 mov ch,0 nx: mov cl,ds:[si] ;判断字符是否为00 jcxz over mov bl,cl mov bh,dl mov es:[di],bx ;赋值 add si,1 add di,2

bit电信专业汇编上机考试三星题开源

放肆的年华 提交于 2019-12-04 16:26:09
北理的汇编期末题其实也没太大难度,很多三星题都是C里面写过的非常容易的题目,而且因为允许提前准备,所以难度又降低了很多,我下面的代码基本上都是自己敲得(不排除有一些算法去网上搜了一下借鉴了一下别人的),另外不完全排除留有bug的可能性,因为我也不是每个用例都测试过了。 也可以看出我这个人的风格,就是喜欢疯狂开堆栈,疯狂写子程序,能封装的东西就一直封装到祖坟里去,毕竟我搞嵌入式软件搞得比较多,那种能封装就封装的工程思想就算是写这种百来行的代码也很难改掉习惯。 在多模块设计中,主模块中调用内部模块buf1,buf2,buf3,buf4。主模块根据键盘输入的指令(如:a,b,c,d)调用上述对应的子程序,每个子程序的任务是显示其入口地址。调用后继续等待调用,若输入ESC键(ASCII码为1BH)则结束程序的执行。请编写完成该任务的程序。 没有什么特别难的地方,主要是得注意一下DISPLAY那边的写法 MOV CL,04H ROL BX,CL ;只能用CL做循环移位,每次移动4位 AND AX,0FH ;取低4位,然后单独打印 打印字母要用到ADD 07H 入口获取就直接在DATA SEGMENT里面声明DW的几个变量,然后声明PROC的时候用它们就行了 DATA SEGMENT BUF DB 10 DB ? DB 10 DUP('$') NEWLINE DB 0DH,0AH,'$'