合天网络安全笔记-十九-

合天网络安全笔记(十九)

P89:逆向工程--汇编语言 - 网络安全就业推荐 - BV1Zu411s79i

提问大家是这些东西都很简单,都掌握了,还是说大家啊不敢提问,掌握了就很好,大家千万不要不敢提问,要把握学习的机会,好的我们继续开始上课,第四个链接就是这样,那我们把整个四步走完之后呢。

就得到一个可执行的文件。

这个文件呢可执行的文件,就是我们我们自己命名的,hello,点out,这就是一个软件或者是一个程序,大家平常所用的软件程序,都是通过这种方式来得到的,不过可能就是不是用我们gcc编译器,用别的编译器。

或者说不用经过中间的步骤。

直接得到最后的结果,我们再来看一下上面的这个图,就了解了这个整个过程,这个整个变形的过程是怎么样的,先是我们写一个c语言的代码,源代码还有点c,然后进行预处理,预处理之后呢,就去除掉一些注释啊。

还有些红的定义等等,得到一个预处理的文件,然后呢再进行编译,把这个预处理的文件呢编译,得到了一个汇编的代码,编译就叫,然后呢在第三步呢进行汇编,就把这些汇编代码转成机器码,转成二进制。

这是计算机可以理解的语言,然后呢再经过第四步,就是链接,我这个程序中需要引用的一些动态,链接库的文件,或者是一些别的链接文件,我把它包含进来加进来,然后进行链接,得到了一个最终的可执行文件。

一个最终的二进制文件啊,这就是一个编译的全过程,最后呢再给大家介绍一下g7 cc,另外的两个常用参数,一个是杠save temple,你使用gcc hello。c可以直接得到最终的结果。

但是它不会保留中间文件,你使用gun save temples,他就会保留下中间的文件,然后供大家分析学习,第二个参数是杠杠verbles,他就是输出gcc一个详细的工作流程,而不是只输出结果啊。

这两个参数大家可以自己去拥有,自己编写一个c语言文件,看一看,不一定要像我这样编写hello word,你可以进行别的,你就简单的计算一个1+2也可以,重要的是理解这个程序它编译的过程。

这是理解啊一个计算机的本质,然后我们进行立项呢,就是处理底层的,就是理解本质,然后这是一个编译的过程,编译的过程,大家发现生成了很多,这个c这个汇编的语言的代码,是不是。

那么我们第三章呢就介绍一下汇编语言,首先给大家介绍一下这三个编程语,三种编程语言的概念,就是机器语言,汇编语言,高级语,机器人是什么呢,是计算机的硬件,它是一种电路元件,大家都知道就是高电平低电平嘛。

二极管半导体半导体它只有输输入和输出,只能是有电或者没电,没电,也就是高电平低电平,所以计算机是根本上来说,它只能识别二进制,这也就是为什么说计算机采用二进制的原因,而不是什么十进制。

八进制就是为计算机硬件还只能识别高电平,低电平,刚开始的时候呢,计算机发明之初呢,为了能控制计算机完成自己的任务,就是编程,只能是编写零一这样的二进制数字串,去控制电脑。

它其实就是控制计算机硬件的高电平和低电平,那这种只是用零一来编程的呢,这种语言叫机器语言,非常接近本质,但是呢也非常难理解,之前在学校里面,老教授上课的时候,就说他们以前编程要什么打孔,用纸袋来打孔。

这个纸袋打孔呢实际上就是进行零一编程,有孔没孔就是零一,他只有这两种状态,这是最开始的机器语言,所以后面的发展呢就发展出了一种汇编语言,汇编语言是电子计算器啊,精微处理器等等,对于使用的一种低级语言。

一乘坐一个符号语言,但汇编语言是什么呢,就是用助记符代替机器指令的操作码,这就是机器码,这左边会员呢就是把这些代码,本来这些4889这些全都是数字,这还是16进制的数字,二进制的更难解,这些有什么含义。

非常普遍一记,所以就发展出一套助记符,555,就是这个这488915就是mol s p r b p,用这样的方式来助记,实际上汇编代码就是一个助记符,所以它仍然是很贴近于这个机器人的。

但是比机器人好记好编写,更加啊对人类友好,在不同的设备中,汇编语言对应着不同的机器语言,指令集就是汇编源啊,到底代表着什么,机器人是跟设备平台相关的,你要换平台的话,就要通过一个转换程序。

所以说汇编语言是和cpu架构相关的,不同的架构,x86 pop c arm cpu指令并不相同,这就是为什么,就是windows它上面有大量的电脑的程序,它是x86 ,它是不能移植。

或者说是很难移植到这个移动端的,安卓呀,iphone的手机都是arm,因为他们的底cpu的价格都不同,所以说你编写出高级语言再转成汇编语言,再转成机器语言,它里面对应的转换都不一样。

如果说有的人是使用的那个苹果电脑,m一的那个电脑,它是基于arm架构的,他虽然是电脑,但是arm架构它就非常难,和那个windows程序兼容,会出现很多问题,以前苹果是采用英特尔架构的。

你装个windows虚拟机,在苹果系统上还是比较容易的,但是现在它采用arm架构,你装windows虚拟机当然也能装,会麻烦很多,因为会遇到很多兼容的问题,这是汇编语言,汇编语言虽然比机器语言好听很多。

但是还是不太方便,后面就发展出高级语言,为什么存在高级语言就是编程员进的机器语言,汇编语言之后呢,人们发现限制程序推广的关键因素,就是程序的可移植性,因为机器语言汇编语言都是基于平台的。

因此呢就是同时他们也非常啊对人类不友好,非常难记,所以呢就需要设计一个不依赖于计算机硬件,能够在各种计算机平台上进行运行的程序,这就可以免去很多编程的重复过程,同时呢这种语言要接近于人类的数学语言。

或人的自然语言,其实这种需求呢就发展出了c语言,像java python c都是这基于不同平台,就是说我的c语言的代码我也可以放在linux,c市场,我也可以进行编译,在windows上也可以进行变异。

我的对于人要进行的工作,就是编写的源代码放在两个平台都能进行编译,那后面要编译,那编译器的事,它自然会生成适合于windows系统,适合于linux系统的可执行程序,这样是不是人编程的效率就大大提高了。

这是他们三个语言的一个特点,一个关系越来越复杂,越来越啊,人类越来越懂,但是效率是越来t的,大家这应该可以理解,高级语言,他虽然就是很利于很有益于人类的编程,但是它的效率相比会比人家机器还是低很多的。

同时c语言是比较接近于会员言的,所以c语言的效率又比python他们的高,但是python编程呢就比c语言简单很多,大家应该先python用起来非常方便,c语言用起来就是门槛要高一些,复杂一些。

但c语言编得好的话,它的效率是比python高很多的,当然对于普通用户的话,你用c编程,用python编程,你就看你是要是工作的要求,最终呈现效于普通人来说没有特别大的区别,那汇编语言有什么特点呢。

目标代码比较简短,占用内存少,执行速度快,就相当于高级原来是演的,但你相对机器语言,它肯定不能说是执行速度快了,它比机器人呢就更加便于记忆和书写,同时汇编语言是和机器相关的,大家不能直接。

我们后面会给大家讲这个汇编语言,他们常用的命令,但是不能直接套用,在这要进行一个转换,因为这是机遇,a t n t的其实差别也不是很大了,英特尔的就是木ax在前零在后,它就是零在前a在后。

就是这样一个区别,其实也是很小的区别,然后要理解汇编语言呢,关键一点我们要理解一个寄存器,这都是啊计算机底层的,寄存器了,它是cpu内部的高速存储单元,cpu就是中央处理单元吗,单元它是个集成的。

它集成的内容之一就是寄存器和,寄存器是cpu的一部分,它的访问速度比内存快,内存比硬盘快,内存就是硬盘,就是我们说的电脑存储空间500g1 t这些,那内存呢就是运行内存。

有的是4g8 g 16 g32 g都有寄存器,比这个内存访问速度还快,它就集成在cpu内部,当然它价格也很高了,就是这是一个层次关系,寄存器内存和硬盘寄存器速度是最快的,价格是最贵的,容量是最小的。

是最贴近于cpu的,寄存器呢可以分成四类,总共四呢就是八个通用寄存器,然后六个段寄存器,还有一个标志寄存器和一个指令指针寄存器,这里这个图给大家解释通用寄存器,这是标志寄存器。

一个叫e flag 32位的,就叫e flex 16位的操作系统吗,就是flag 16位的cpu,就是flags,这同样的指令寄存器16位的叫i p,32位的叫一ip。

64位的就是r e是32位这个命名关系,然后还有断机存器,通用寄存器呢又符合数据寄存器和指针,变质寄存器,大家看这些可能刚开始还比较晕,但是不要着急,我们后面一个个解释,它们是有逻辑关系的。

我们首先看这几四个数据计算器,一ax它的命名也是很好记的,ea 1 b1 c1 d,abcd这四个数据计算器,我们看一下数据寄存器,数据寄存器呢,主要是用于各种计算和数据的传送。

每个数据寄存器呢都可以作为一个32位,16位或者八位来用,为什么可以这么用呢,我们以数据计算器ex为例,它是32位的,你把截一半ax就是16,你可以只用它的一半,a x又可以分为a h a l。

h就是hi l就是l高位,低位它又能分为高八位和低八位,所以它可以作为一个32位的用,可以作为16位的用,可以作为八位的来用,都可以,ebx ec x d x也是同样的,它们的用途呢ex成为累加器。

它就是来进行算数运算的,eb x呢是一个基地址寄存器,是用来存放基地值,这里给大家介绍一个啊这个基地值的这个概念,因为在我们寄存器就在cpu里面,我们要进行寻址。

就是我要知道我下一条指令执行的地址是在哪,然后就相当于人嘛,你你明天做什么事儿,你是找谁,是班主任安排你还是班长安排,你需要下一条指令,然后有时候还要找数据,我要取得什么数据。

你要知道这些命令或者数据它的地址是在哪里,你才能够知道这个命令取到这个数据,是不是地址,怎么判断呢,怎么知道地址呢,地址是由两部分组成的,一部分叫基地址,一部分叫偏移,就是地址他不会告诉你。

其实这个我们用的也是很多的,就像你在学校,你别人问你什么事,你说啊那个东西在教学楼五楼啊,在食堂,其实这个教学楼五楼啊,这食堂都是一个偏移,它是什么偏移,它是在于你们就是。

基于你们湖南警察学院的一个偏移,是指债务,你们学校内部的这个教学楼五楼,他要说完整的地址是什么,中国什么省,什么市,什么区,什么什么地方,但是每次那么用不是太麻烦了吗,是不是。

所以就采用了一种基地址加偏移的一种方式,来定位地址,啊e c x c呢,那你肯定有为count c o u n t计数,它是个计数器,它可以用来保存这个循环的索引,就是大家平常用到一个循环。

for for i等于零,a小于100,a加加,那么i是不是要计数,要增长,这个技术就保存在c里面,ecs里面每运算一次,e4 x这个寄存器的值就加一,然后下一次再取e c x里面的值和这个100。

来进行判断,看程序决定下一步是往哪个分支走,e d x呢,它常用来保存这个整数除法产生的余数,这是它们的作用,这以上每个技能这个作用都是它的默认作用,但编写汇编代码是不是必须的,这个是什么意思。

就是大家在分析逆向程序的时候,基本上可以照这个理解,但不是百分之百的,一般都是按照这样来做的,但是你如果说你直接用汇编语言编程序,也是可以的,你就不按照这么用,你把ex作为这个计数器程序也没毛病。

但是因为大家所遇到的程序,都是用编译器来进行编译的,所以一般都是按照这个默认的作用来存储学习,这个寄存器是为了让大家能够更好地理解,我们逆向的程序,这是啊这部分数据数据寄存器。

那我们看这个第二部分指针变质寄存器,它也有四个,我们分别来看一下,这四个相当于第二类的,他们也是相关的指针变值计算器是什么呢,它可以按照32位或16位来使用,就s i e s i这样说。

但是不能像通用通用寄存器那样啊,再分割成高八位,低八位,这是不行的,他只能分分隔为16位和32位,那它的用途是什么,有四个e b p e s p e s i e d i,他们的16位就把前面的去掉。

就bp s p s i d什么作用呢,我们一个看ebp就是堆栈,大家理解一个堆栈的概念,我push pop这堆栈先进先出,先进后出,这些堆栈机制寄存器,只要bp还是用来防证堆栈中的数据。

它是保存堆栈的什么断机制,e s p呢是暂停指日,它就可以配合bp来访问这个站的数据,啊把这里理解成一个栈存在数据,e bp是站的机制,然后e s p呢是站点,我访问站点就得到这个数据bp再往下一位。

e s p再往下,这样就访问到站的每一个数据,所以e b p e s比他们俩是一个组合,来访问堆栈的数据的,下面来看第二个组合。

e s r e d r s就是source d就是destination目的地,所以s呢叫原址真切存器,d i就是目的均分期存器,他们俩作用都是用于内存数据的传送,我要把内存中的数据。

从一个地方传递到另一个地方,那我就要知道这个数据从哪来到哪去,从哪来,就是原地址,它有数据的来源,这里呢是指向数据的目的,为什么采用这种模式,这前面是基地址,后面是偏移完整的。

他们组合起来就是完整的地址,这个看这个字字母就应该理解s source d destination,目的地,这是指针变质的一些机型,说白了就是用来寻找地址的,我是要对战的地址。

或者是我转移数据的一个地址,那么还有一个计算,还有一类寄存器呢,就是段寄存器上面代码有六个,氮寄存器呢是16位的,他在16位的cpu中呢就只有四个叫cs代码的code,用蛋就是segment,cs。

就是code segment,这就是code,有代码吗,代码段,那同样的d date segment数据的,这是stack堆栈的,这是附加段,在32位的cpu数,它扩展了两个段,寄存器。

增加了f s g s实际上也是作为附加段来使用,这是段寄存器,然后呢是一个指令指针寄存器,e i p 16位中解决的ip,它是保存着,这相当于专用专用的一个寄存器,就是保存指令,保存了下一条指令的地址。

通过cs ip来制来访问我下一条指令是在哪,所以当这个程序在顺序执行的时候,为什么程序能顺序时间,它实际上进行的操作,就是进行这样一个赋值操作,e i p就等于原来e i p加上拟合指令的nice。

我现在这条指令是占了四字节,那我e i p加四得到了一个新的e i p,告诉我下次要从正定来执行,那为什么有的时候能够跳转,能扩扩一个函数,或者是跳转到什么地方。

遇到这个jump还接一loop这些循环啊,跳转的指令的时候,事实上进行的操作就是改变e i p的值,那我就不是按照你执行的这个命令的,nt字节数来进行增加了,我就直接指定e i p等于多少。

直接指定jump到哪里去,还记得我们上节课给大家介绍的这个本地标签,标签其实就是一个地址,那我直接降p到这个标签处,实际上就把那个标签的地址付给ei p,然后他就知道要执行哪里了。

这是顺序执行和改变和进这种跳转到循环,这种执行,他们是实际上是怎么实现的,就是通过改变ei p这个寄存器的值,这每个寄存器里面存的都是数据啊,所以说存的大于你,可你会存的这个数字,所以改变它的值。

也就改变了你的程序的执行走向,然后我们再看一下这个标志,寄存器标志技能,这就叫flags,32位呢就叫-1 flex就命名的规律,大家应该掌握了,32位就多个一嘛,因为四位就是r。

但是不管是32位还是六位的cpu呢,它这个标志寄存器都只用到了前16位,01236~15,每一位是什么作用呢,这里给大家总结了,所以这个标志寄存器,就是它是保存一些运算的结果。

比如说我比较两个数是不是相等,比较结果就保存在标志寄存器里面,我进行一个两个数相加或者相乘的运算的时候,我有没有溢出,也是保存在这个标志寄存器中,那么后面的程序通过访问这个标志寄存器。

它对应的某一个位数的值是零和一,就知道我有没有中断,有没有溢出,这就是一个标志寄存器,这每一个每一位的具体作用,还是这里给他写出来,但是大家真正要理解的话,还是要在逆向实际的一个破解程序。

逆向程序逆向分析的过程中,不断地对比着看,才能真正的理解,啊前面都是给大家介绍的标成员的特点,还有它的寄存器,就是这些就是数据存储器,它里面存储的是数据,这里面存储的是一些地址信息。

然后这个是一个运算的标志信息,这是指令信息,这是存折断的信息,这是一个寄存器,那么汇编的指令有哪些呢,啊汇编的指令,刚才我们可以看到声明声明段的指令,点text就是代码段,还是放着可执行程序的点。

date就是数据的,它放数据的,还有io date就是只读数据的,大家有的时候还会遇到点b s s,这是这这些数据都是在哪看的呢,都在我们的编译过程啊,在这里面有会出,可能会出现。

bs就是暂时无法确定的这个数据,点comment就是编译器版本信息,我们后面看到啊,gcc就是用gcc来进行编译,将这个eh frame是调试信息,这些是一些声明的信息,那具体的指令呢。

比如常见的move指令,move 1 a x1 b x,什么意思,就是将e b x的值赋值成一ax复制个ex,这是我们说是基于英特尔的处理器,因为汇编语言它也是跟你处理器相关的。

我们给大家讲的是英特尔的处理器,但是你把英特尔的掌握,你就x86 吗,x86 是最主流的,那么x86 掌握你在学习别的arm啊什么的,其实都很类似,就像大家学编程一样,第一门学c语言,你把c语言学会了。

你后面再学python java都容易很多,再就是push,push就是将ea x数它里面的数据送到站里面,它不会让这个寄存器送到站里面,寄存器它是个物理实体,你只能从里面取它存的数据放到站里面。

pop呢就是把站点的数据移除,把这个数据放在哪,放在e b x这个寄存器当中,这个逆了lee a呢就是取地址指令,就是把后面这个地址传给放在ex当中,把这个地址保存在ee ax当中,这是数据移动的指令。

第二类呢就叫做逻辑运算指令,诺,就是一些运算,add增加e x e c x就是把e ax和e4 x相加,然后把值放在ex当中,同样相减,也是相减,之后把值前一个减后一个放在e s当中。

还有常见的i n c increase,增加就自增,就相当于c语言里面的i加加嘛,d1 c就减少i减减这样的,and waxy就是逻辑运算与或异或运算,这个s h l s h r就是按位左移和右移。

它左移和右移相当于什么呢,相当于乘以二和除以二,但是比进行乘法运算会快很多,这是啊逻辑运算的一些指令,然后呢再就是流程运算的指令,流程运算,我们知道e i p计算器呢就存放着下一条指令,要执行的地址。

所以我们的流程运算呢就是改变ei p的值,比如说常见的jump jump到一个标签,他就是跳转到这个标签的地址处,把这个标签的地址放在1p当中,或者je je jz就大于小于等于。

这些命令属于条件跳转指令,满足条件就会跳转到相应的内存地址,括号括号一个function就调用函数指令。

P9:第7天:课程考核讲解 - 网络安全就业推荐 - BV1Zu411s79i

人家都没有放假的概念。

你们现在能看得到我的屏幕吗,如果看得见我屏幕的话,就打个一,是你们最后那个trs拿,最后哪个xs,你这是不是,哦我刚才自己做了一下,就刚才七点多钟的时候,最后这个吗,就是这个i这个与合法输入,最后两个。

那个游戏一共有几关,一共其实应该是有20关吧,好像但是他这里的话就只有只列了这么多。

这个。

这个存储型xs这个吗,你们课后有做,就是那几个实验实验室的实验,大家有错吗,第一个应该还是不难的吧,就是第一个这个存储型xss,我好像之前也做了一点点,第一个的话就是嗯他没有进行什么过滤。

三个实验都一样的对啊,他实验场景是一样的,但是它的嗯就是那个嗯,从从第一关好像是到第九关吧对吧,第二个这个存储型的话,它其实注入点在你就可以各种去试一下,然后他其实是在这个链接,这我们可以,插入一个。

这样插入之后再发布,他就有一个yee弹出来,那前面这个反射型的xss。

这大家都就是已经能全部做出来了吗。

如果能做出来的话,有人愿意分享一下吗,反射型的最后两个,那反射型最后两个有同学做出来了吗,如果有的话就扣一下一呗,没有的话就打一个二,最后这两个都没有做出来吗,就是后面这两个,最后个不会。

最后一个不会还是两个不会,最后一个不会啊,那你可以给大家分享一下,倒数第二个嘛,就是这个h这个这道题可以吗,我点这个举手的话,你们是不是自动开启去,你们是不是就可以举手了。

举手的话就可以能听得到你们的声音,你要不要来讲一下g wolfs,我也不太会读,啊你是输入的这个是吧,这个实体化,嗯那我那你看着我打一下啊,看看就对不对,就直接输入,要输别的东西吗。

还是就直接输入javasque ra,alert,xs,然后呢,然后把它们多进行一个实体化吗,行那我找个,就是将这个,复制下来ctrl v,然后对它进行一个实体化,用这个吗,这样是吧,是这样吗。

把它复制下来,把它这个替换掉,就这样对吧对吗,添加一个友情链接,然后点击这个友情链接可以哟,很棒,对其实就是这样,然后它其实是插入在了这个a里面,它有两个输出的地方,第一个的话就是。

这个地方还有一个是在这个a标签里面,然后直接输出在了这个hr ef的双冒号,这个属性里面,那其实这道题的话给了我们提示,就是这话是使用这个伪协议编码,之前上一节课的时候,我是不是有给大家就是。

发一个编码的那种pdf,然后有说如果他是在属性值状态下的话,它是能进行一个解码的,所以说在这儿你将我们刚才的,我们先将它进行一个解码,将它进行一个编码之后,然后直接存到了这里面。

这个a标签里面的这个hr a f属性里面去的话,那是不是这样,它就能进行一个解码,我们可以用f 12,来看一下这个友情链接,这,不是在这个地方,他现在已经没有了吗,哦哦他现在已经没有了,重新插入一下。

进行一个编码,将它复制,而且你要把它原本的那个let's try给去掉,因为它是直接拼到这个h r e f里面吗,如果你前面已经有这个let's try,然后再加上后面的话,他就不会成功。

这里添加一个友情链接,然后我们来看一下对吧,在这儿的话它就进行了一个解码,解析成了javascript冒号alert tiss,我这么讲对吗,这个,wolf,你有什么要补充的吗,你应该可以点举手啊。

点举手之后,我们大家就能听到你的声音,那样的话就能快一点,我这么说,大家有听懂了吗,然后这位同学,你有要补充的吗,没有,那大家有听懂吗,听懂的话就打个一,没听懂的话就打个二,你们是尝试了哪一些。

然后他没有成功呢,我们可以,就直接输入一个我在这儿,其实之前给的是这样的一个牌子的,就只对中间两个进行了一个编码,那如果我们不对它进行编码,直接这么这样子的话,我们可以查看一下它的右键,查看源代码。

这它是会,它可能是匹配了我们这个scream这个关键字,然后在这个中间的话插入了一个下划线,所以说我们只需要把它这个,这个p或者是t等等进行一个编码之后,它就那后端判断的时候。

它就不能正常的识别为一个script,这样的话它就不能插入一个下划线,然后从而达到一个绕过的效果,嗯可以看到我原本是这样的,那这个这两个拼起来其实就是一个t,这个116就是嗯阿斯克码的t字符。

五八就是冒号,我们添加一个,然后查看它的源代码,你可以看到在这边它输出的话,就是以这样的形式输出的,但是在我们的页面里面,它有进行一个解码,在这儿对吧,然后我们点击之后,它就能弹出一个对话框。

给我们警告框,给我们,那大家这一道题有听懂吗,如果听懂的话就打个一,没有听懂的话就打个二,听懂了,那自然这一道题能做的话,第九题是有什么哪里不会呢,哪里卡着的呢,我们来看一下这个反射型xss的。

最后这个这个伪协议编码,这个是吧,我们可以输入一下这个嗯,neo 8第八关的它的一个pload来试试一下,添加友情链接,在这里的话,它会将我们的这个,这是一个输出的地方,然后就没有了。

就没有地方输出了对吧,这是第九关,前面的话,在第八关的话,他除了在这里进行了一个输出的时候,他还输出在这个a标签的hr ef里面,这个是第八关的那个这个level 8 mp h p。

我刚才查看源代码留在这的,但是在第九关的时候,这这个的话大家有去查吗,这个是什么的实体店吗,嗯在这儿还不能进行解码,它没有匹配的,这个应该就是那个连接符号的实体编码对吧,我们百度1下就知道。

嗯就是这个连接符号,在这的话,它对我们的连接符号进行了一个实体编码,然后这个井号没有进行编码,数字也没有进行编码,就是对我们这些比较特殊字符进行了一个编码,那在第九关的时候。

可能从这从这个input标签,这我们不能突破,这样的话他说我们的链接,您的链接不合法,那我来添加一个正常的链接,看一下是不是就是合法的,我前面试的时候添加这个百度htv 3 w点。

百度点com添加一个有情链接,然后我们查看一下它的网页源代码,这个时候他的这个h e f,这它就变成了我们这那个友情链接里面的一个,呃,就是我们在这里输入的这个对吧,所以说他可能就是进行了一个判断。

如果说你这个就是你输入的这一串东西,里面还有某个前缀,比如说htp或者是3w点什么什么什么,它就将你认定为是一个合法的一个链接,然后嗯把它输出在这个h e f里面,所以说在这的话是不是就可以来尝试一下。

我在这儿有写的,这个这个就是今天其实发到群里面了,然后想将他这个hdp这个后面把它过滤掉,就是这个字符串我们其实是含有了的,就是含了这个字符串,我们添加一个,然后,你可以看到在这的话它就不会像前面这样。

像说您的链接不合法,然后只有一个这个内战的话,它就是成功把这个显示出来了,那就表明它可能就只是判断了,你这个字符串里面嗯,是否还有这个hdp这个东西,你如果含有的话,它就把它放在这里,内卷的话。

他同样对这个scream可能识别了一下,然后在中间加了一个下划线,那所以同样我们在这里对它进行一个编码,刚才是啥来着,嗯就是这个,然后在后面加上我们的这个http,哦我多打了一个题,对吧。

然后我们点击一下这个友情链接,就有一个这个flag给我们,我这么说,大家有听懂吗,如果听懂的话就打个一,如果没有听懂的话,就打个二,哪里没有听懂,就是他在第九关的话,如果我们就是用上一关的。

比如说用上一关的这个来生成一个,添加一个友情链接,你可以看到他在这里查看源代码的时候,他在这个后面直接就是您的链接不合法,有没有,然后他是没有,这在这个地方没有插入的,但是他除了这个地方之外。

还输出在了这样的一个地方,就是这个value值里面,但是这样的话,它对我们的特殊字符进行了一个编码,所以我们这儿就可能不能够进行一个绕过,所以说我们就尝试添加一个正常,我的是我做这道题的思路是这样的。

就是添加一个正常是一个网链接,添加友情链接,然后查看源代码的时候,这边的话,他在这这里就会将我们输入的这个嗯3w点,百度点com插入到这个h e f里面,而不是前面的那种,您的链接不合法,所以我就猜测。

后台可能是对你这边输入的一个内容,进行了一个判断,判断判断什么呢,可能就是判断你这个输入的这一串字符串里面,是不是可能判断是不是http开头或者是怎么样,然后才把它插入到这个h e f里面。

这个属性里面来,所以说我们就在前面那个po的基础上,在后面再加上一个hdp,嗯这个样子,就是让既让这个字符串里面能符合,有这个有这个htp冒号,两个斜杠这样的一个字符串,让它匹配到。

然后能让我们的我们输入的这个东西,输入的这一个字符串,输入的这些字符,能够到这个hief等于这个属性里面来,但是这个前面又有一个这个javascript alert 1,这样的话就能实现一个弹窗。

所以说这点添加友情链接之后,右键查看源代码,在这儿的话可以看到它因为有这个htp,所以他在这里的话,把我们输入的这个字符串添加过来了,所以说我在这儿再进行一个点击的时候,它就是有一个弹窗。

因为在这这个h e f里面,我们是有一个javascript为协议为协议的内容,后面是我们的一个嗯javascript代码,然后就是l,嗯然后这个的话就直接跳到第十关了,嗯那第九块的话大家有弄清楚吗。

如果弄清楚的话,就打个一,如果没有弄清楚,我的话就打个二,老橙子老橙子已经弄清楚了,ok应该大部分人都弄清楚了,这个是那我前面给大家发的那个靶场,大家有去做吗,就是那个y x cms那个,那个没安装好。

搭不上,那个就留言板发现了,为什么会答不上呢,内陈商同学,你能给我们讲讲吗,你可以举手吗,举手让我们听见你的声音,啊我这没有开那个,没有举手的案件,那你要不然在群里面发,老哥上对,快上呀,我一个人讲。

很没意思的,来说来分享一下你的一个思路,听得到吗,听得到听得到,你们能听得到吗,如果能听得到的话,就打个一就就敲个一,嗯他们也能听得到,嗯你说吧,就留言内容那里直接写一个弹窗啊,写一个怎么样的弹窗。

我就直接写的alert 1,写了一个alert 1 a script一就把这个,稳稳把这个对对对script的监控号,这样子吗,嗯去提交到后台,它有个审核,啊这样提交之后。

楼去后台查看后台他的那个留言板,啊,喂等一下我看看我当时写的嘿嘿嘿,等一下我看看我当时写的配乐的行好的,那大家还有还有同学做了这个题吗,就只有陈商同学一个人做了什么,对啊我的我的我的这个打不开了。

这一下子,你哪个打不开,是你这个界面打不开了还是什么,我把他端口换了一下,我现在调回来啊,好吧,安装后是这个样子,查一下这是什么错误,哦可以了我啊可以的是吧,防漏的那个防漏的事件,网络的世界啊。

你现在说,我用的onload事件,然后给他一个弹窗,就加载完毕之后直接触发哦,那你是用了什么标签呢,还是没有直接一个漏的,用了svg,嗯s vg,然后呢,然后杠一个unload标签弹窗lt 1。

这样子吗,对,然后来到他的一个后台是吗,对,嗯然后这边编辑的话就会直接触发,嗯我这为什么没有触发不动,我就是可以直接触发,对可以的很棒,好下了,可以可以,那之后那你之后有没有去尝试。

就把它发到发到我们平台上面,就是那种接收平台上面,会觉得他的一个cookie什么的,后面的步骤有进行吗,陈翔同学,没有你p trs平台还没搭,好好吧,就只有陈翔同学一个人做了这个题目吗,还有同学做了吗。

想要分享的,我搞定了,打开了,诶真棒,那你教一教g wolf,是同学吧,这我写了一个,也就是我自己尝试的一个过程,你们,就像他说的那样,把注释把它注释就好了,好吧,那我带着大家,如果大家没有做的话。

我来带着大家来做一下吧行吗,嗯那在这的话这个留言地方我最开始也是比较,就是尝试了一下这个,8420,然后提交之后,在这边管理,这边的话,直接进到这个结构管里有一个留言本。

它会在这个地方看到我们留言的一个信息,那在这的话有一个编辑场嗯,先不点击查看,就我们先来看一下,因为我们右键查看源代码的时候,他的这些这些留言的信息应该是动态加载的,然后在我们这边的话。

在这个页面里面是没有显示的,比如说我这直接输入刚才的那个ellent 1,可以看到在这的话它是找不到的,所以说我们可以直接使用f 12,然后点这个来选取元素,看一下它在里面是怎样的内。

在这的话可以看到在这个地方我把放大一点,在这儿的话,它是会在我们这个中间加上一个左右尖括号,一个x这样的一个标志,那可能就猜测后台的话,他可能就是对这个scream这个进行了一个判断。

如果你这有一个scream的话,我就在中间加一个这个x,所以的话这样的话,那就不能使用这个scream这个标签了,那我们就尝试一个别的呗,比如说一个image标签,src,然后,ero等于l,4278。

提交,然后同样来到一个他的留言本,这个地方同样进行一个编辑查看,嗯你在这的话可以看到它在这个on事件这,然后页入这中间也是加了这个x的,那刚才那位同学又说他说编辑查看之后嗯,它这就有一个弹窗了。

我们可以就是来看一下,应该是在这个地方留言内容,这你可以看到就是在这个地方的话,它中间那个前面中间这个on ero,中间不是插了一个左右尖括号x吗,在这的话它就并没有对它进行一个过滤了。

所以说他在这里的话就进行了一个ent 1,就弹出了一个一的一个警告框给我们,嗯这大家可以想一下,那么如果我是想绕过的话,有哪些方式呢,就是在这这里的时候,就是不点不让他点,就是即使他不点这个编辑查看。

也能让他有这个弹窗嗯,这样的话就可能需要大家去想一下有哪些啊,可以进行一个绕过,嗯那在这里的话,它除了它,既然我们编辑查看之后,它是可以有一个弹窗的,就是在这个后面。

它是就是那个on yroll中间就不过滤了嘛,那所以我们在这个前面是不是就,人在这里,这个后面我们加一些image。s r c这种,你们之前实验做实验的时候,是不是做过这种,就是做那个xs s啊。

原理与实践的时候,那个实验,在这里的话我们就可以输入我们的那个,local host,那在这的话我就直接用蓝莲花的吧,这个平台。

这两个这两个是一样的,这两个js都是一样的,只是它们名称不一样,在这里生成po的,把他的这个src复制下来,然后直接粘贴到这个地方,把这个复制下来,然后这边6852提交之后,来到留言本,然后编辑查看。

这样的话他并没有一个什么,不是我们之前啊,如果他能接受的话,他在这个title这就有一个收到一条消息吗,那在这没有显示的话,可能是说明失败了,那我们来看一下,嗯可以看到在这个地方这个on ero站。

它从我们这个空格这里就直接将它断开了,就它自动加了一个双引号,它的onerror就等于new,然后image。source就等于后面的,然后我们看source的话,呃,network的话。

这里面也是没有对那个js进行一个加码加载的,我们这里是用的,哪个po的这个test。js,我们可以在这个这边找一下,他也是,嗯在这个地方它是有有发出去的,这里他去请求了,而且是一个200。

但是我们在这并没有接收到,嗯那所以他在后台的话可能做一些限制,或者是怎么样,那阵的话就我就可能想了,另外一种方式就是,将它们进行了一个拼接,大家看得清吗,就是在这个,on eua,这里,在这里的话。

我直接在document。body。append child,我可以,嗯我直接把这个pdd输入进去给大家看一下吧,就看一下效果,它会是怎样的,嗯可以看到在这的话它就有一个提示,就是收到一封消息。

改到接触面板,这,就是刚才收到了吗,4月3号08:47,然后在这的话就有他的一个cookie对吧,那我们来看一下在这个留言内容,这它最终,是什么呢,就是在这个on euro这document。body。

他就是选取了我们这个body html里面,不是第一节课的时候给大家说,就是头部和玻璃部分吗,然后在这的话他加了一个标签,然后使用srt,因为他后台是顾虑了squt这一个字符串的。

它们连在一起的一个字符串,所以在这里的话直接使用加号,将两个分开,然后用加号,然后把它们拼接起来,就是一个scream的一个字符串,只是他们嗯输入的内容就不是连续的了。

然后这个create element的话就是创建一个script这个标签,然后这个script的src,就是引用外部的一个js代码吗,那在这的话我就直接输入了一个,我们这边接受平台的一个地址。

你可以看到在这个下面,在这个地方的话,他就创建了一个cript的,的元素,然后它的s r c就等于这个,这个就是当如果这个图片加载失败的时候,就是出现错网页游的时候,这个我刚才输入的这一串代码。

它最终执行的效果,就是生成了一个cript的一个标签,然后它的src是这个样子的,我这么说,大家有听懂吗,没有人理我,如果大家有听懂的话,就打个一,如果没有听懂的话,就打个二,锤商听懂了。

就感觉好像就这么操作就可以,但是就是有点懵,啊我不知道你什么意思,原理懂了,回头再研究一下这个写法,可以的,有些东西是也是需要靠积累的,然后就是积累一下别人的一种姿势或者怎么样。

然后自己就进行一个模仿改造,可能有些东西就能进行一个热锅了,那在这儿的话之前,不是说我们这个前面要点开之后,就依靠自己,他后台在这边可能没有进行一个过滤了,然后有就直接这样给我们有一个弹窗了吗。

那我们有没有办法进行一个绕过呢,嗯那在这的话其实有一个绕过方法,可能是他后台那边没有处理得,当,然后造成了这样的一种绕过,我这是也有写,就是后台可能识别的事件,那如果把on和后面的load on eo。

就是unload on eo这种字符分开的话,他是不是就嗯不能检测到,然后就不能插入那个左右键,括号x那个东西了是吧,然后可以有一种方式,就是在这中间插入一些,sc等于,在这的话插入0%a的话就是。

0%a和00d就是回车换行符,有些时候你中间加这个,它还是能够触发的,所以在这里我们也同样进行一个添加试试,看,看看能不能有一个效果,因为这样的话就能将它们就是两个,嗯隔开嘛,然后让它不匹配到。

然后不让他插入那个左右肩宽和x,在这里看一下,嗯他这里的话还是把0a插到了这个on error里面,所以说他也没有一个弹窗给我们,那在这的话可能这种方式就不行,那我们尝试另一种。

我直接在这个中间加入一个回车呢,他能不能行呢,在这个留言板这里,然后这个也是没有弹窗的,说说明还是不行,看一下这里的话,它中间就有一种这种空格,然后对形式展示给我们,然后没有把这两个字符连接起来。

虽然它中间没有插入那个左右尖括号x8 ,但是他也不能进行一个触发,所以的话在这里的话就不行,然后就胡,也是无意中发现等于一,在这个中间加一个反斜杠,这样也是将他们进行了一个隔开内。

看一下他们是惠普能不能起作用的,因为反斜杠他的意思就是在程序里面的意思,就是转移嘛,那我后面那个字符本来就是一个字符,并没有需要转移的,所以说它还是原本的一个字符,但是又在字符上面上面将它们隔开了。

可以看到在这的话它就有一个弹窗给我们,我们可以来看一下,嗯这样的话就把它连接起来了,然后起到了一个alert一的一个作用,后续的操作的话,所以说在这即使我们后台后台的管理员。

只要打开这个留言本本这个标签,然后他就有一个一弹出来,所以说在这其余后面的那些操作,这种这个就跟前面的一样,嗯我到时候把这个,我简单写的这个东西发给大家吧,其实刚才都有讲,这个还需要发吗。

如果需要发的话,就扣个一嗯行,那大家还有什么疑问吗,嗯可能你们比较忙,然后有些地方没有,就是自己没有亲自去尝试一下的话,还是可能差点意思,那大家嗯星期六星期天的时候,大家就尽量去尝试一下。

而且我们之后老师估值时,会带着大家进行实践嘛,求大家好好学,像这种双引号实体编码后是不是就不行了,嗯可以这么说,因为你要看他输出的地方,如果他输出的地方,就单单只是在那一个属性里面进行一个输出。

就比如说在这里的话,它只在某个属性里面,某个value属性里面进行一个输出,然后他又对你输出的一个内容,进行了一个实体编码,那这样的话,你无论如何也跳出不了他的那个属性值的,那个双引号,就你无法闭合它。

然后插入自己的一个嗯代码,所以说的话就可能不能进行一个绕过,大家还有什么问题吗,我这么说,大家能懂吗,这样就能防御了,但是并不是并不是每一个,就是你要看它的一个业务功能,它并不是每一个都输出在属性中。

他有时候可能输出在多个地方,那你可能如果有些地方他没有进行一个嗯判断,或者是露露的话,还是,就是有疏忽的话,我们就还是能进行一个绕过嘛,当然他如果做得好的话,那我们也没办法。

或者是说嗯可能我们技术还不达标,然后还要继续学习,看一下是不是有其他的一些方式,嗯大家还有什么问题吗,实验的话大家有问题吗,就是,实验其实实验指导书说的都还蛮详细的,应该不会有什么问题,那个进阶123。

xs s进阶123,其实在那个如果大家不会的话,xs s进阶123吗,不是给大家布置的,然后在这个xs基础防御对策里面,基础防御对策123里面,其实他给了给了我们能够注入的牌楼的。

嗯在这儿他就教你怎么样来进行一个测试,以及怎么样进行一个防御,就是这个基础防御对策,123这三个实验里面对这个xs s进阶,123的那些实验进行了一个讲解吧,大家还有什么问题吗。

你不是你不是直接你不是用ph p study打开了吗,我不是看你,那p h p4 那里的话,它默认就是mysql,mysql数据库啊,已启动了吗,你们俩都是这样的,怎么会呢,做环境的话。

我待会我待会给你们查一下,那课程内容的话,大家还有什么问题吗,ph哎嗯,是单独开启的,你重启试一下呢,要不换这个mysql,5。7。26试试,这个装环境的话,后面再说,那今天的课程直接下一步。

他应该不会让你直接下一步吧,那你直接下一步试一试,你这他不支持的话,他应该不会让你直接下一步,不会有不会有什么问题了,你大不了就重新删掉了,然后重新解压吗,嗯他让你进来了,那好吧,那你那你继续吧。

啊那你就嗯输入数据库名啊什么的什么的,嗯那大家应该就没有什么问题啦,那今天的内容又没有人提的话,那今天暂时就先到这儿,大家星期六星期天的话好好跟老师一起学,好吗,那今天就到这儿行。

那今天课程内容就到这儿,大家嗯再见,好好学习。

P90:逆向工程--常用逆向工具 - 网络安全就业推荐 - BV1Zu411s79i

是把被调用函数入口的地址付给这个,r e t就是返回返回上层函数,就把上层函数的地址,就是这个子函数被调用之前的那个地址,给e i p,那么一ip就知道下一步要执行什么命令,这是一个汇编语言给大家啊。

再回顾一下,首先是一个总体的一个介绍,再加上介绍了这个寄存器,每个寄存器都是一个什么样的作用,然后常用的指令指令就分为一个声明的指令,数据移动运算流程控制这些类型,然后我们现在进入第四部分。

就是一些逆向工具的一个介绍,首先是一个常用的二进制工具,就是我们这些二进制文件,我们要查看的编辑也需要一些二进制工具,比如说有win hx 16进制查看工具,所谓的二进制查看工具就是其实就是16进制。

查看空间是一个意思,因为二进制不是零零来显示0101,这样显示是16进制来显示的,是不是上节课给大家说,因为16进制和二进制是一一对应的关系,但是16进制更容易被人类理解。

所以采用16进制来表示二进制的数据,二进制的文件,嗯在这u一啊,然后010editor,这些常见的工具可以查看二进制文件,也可以修改,也可以对比两个文件。

我们还是在虚拟机里面看一下,比如说我们看到这个,我们今天要破解的这个程序。

我们可以用ue打开看一下,这就是这边是它的一个16进制的程序,这是对应的那个看16进制有没有对应的字符,有多少显示,没有的话就是乱码,它这里面有一些字符串,也有很多乱码。

这些乱码呢是因为它是机器要执行的指令,它不是数据,但是你用十进入直接打开的时候,他并不知道哪些是数据,哪些是指令,它全部按数据给你显示的,这里也可以进行修改啊,看七零改成七一也是可以的。

我们把它改改回来,你可以进行任意的修改,这里用u e,然后呢也能u e,还有一个配套的叫u uu e compare,它可以进行一些文件的,也有比较,因为比较可以比较两个文件它有什么异同。

我们比较嗯比较一下,比较一下跟他一个非常相似的一个文件。

我们重重新比较一下,先把这里打开关,怎么点关闭。

新的比较,我们用二进制的来比较。

还有拖动,就是对比着看这两个文件,看它有什么差异,这是一个比较的一个功能。

刚才给大家演示的是ue,这里给大家贴图是nearly editor,都可以用,但是可能要有些可能要经过付费或者是破解,这个大家啊都理解,然后第二个是可查看可执行文件的属性的工具。

比如说study p刚才给大家看了,就是一个查看pe文件的一个分析形成工具,pe就是portable executive,就是可执行文件,windows下可执行文件其实都是pg文件。

比如说我们看到这个reverse me,其实就是啊我们今天这correct me这个程序,那么他用pe来看呢。

它就会我们直接打开看一下。

我们刚才p一看了,他就告诉我们,这是一个32位的pe文件,那么我们后面再进行动态静态分析的时候,都有32位,ida 64位a d这个x64 呢,这debug也也差,debug也有32位u4 。

你就知道用32位的能打开,还有这个文件的哈,希值md 5值下one的值,如果对这个文件进行任何一个改动,它这个值就会变,可以用这个值来保证这个文件没有经过改变,然后下面有文件类型。

这个t a s m和m sm,这文件位实际上确实它是一个汇编的文件,就是它没有加壳,如果加壳了,在这里文件类型也可以找出来,大家不理解的话,没关系,把这个文件类型复制出来,在百度里面搜一下。

就知道你查看不同文件,它是什么,代表什么含义,所以说这道题我们是讲解的,是一个比较入门的题,它没有加壳的,我们可以直接进行分析。

利用,这是在windows里面,那么在linux里面用什么查看呢,就选择read e r f,e l f就是linux里面的可执行文件。

我们在这里看一下,使用read e l f,然后使用杠a这个参数就是查看所有的信息,然后你要查看哪个文件,就是我们刚刚生成的可可执行文件,hello,点out,他就给我们显示出这个信息。

这个信息还是很多的,因为a就是所有,啊这里给大家截取一部分,像什么版本啊,编译的一些,你看他是在什么,在x866 64位的机器上编译的。

这些信息都有。

这是整体来查看文件的一个属性的,和windows linux两种系统的一些工具,然后呢就进入我们的ida工具,i da简称是d你全程的ida pro,它是交互式反汇编七专业版,简称就是i d a。

它是目前的最强大,也最流行的一个静态反编译软件,是我们安全分析必不可少的力气,它的功能确实很强大,这个这个软件也是,之前也是上传到群文件里面的,大家如果之前装了,那就可以直接用,没装的。

就可以把群文件里面的那个文件下载下来,然后解压缩就可以用。

解压缩我给大家看一下,i da诶我这id是,解压缩之后就会得到这样的软件,这样你就会看到这样的文件,然后这里面有个ida和一个ida 64,以32位的,你用ida这个打开64位的程序。

你用ida 64来打开来进行分析就可以了。

这是个免安装的,非常好用,大家直接下载下来就可以用。

使用ida打开之后呢,它会对打开的文件进行自动分析,我们这里给大家看一下,比如说我们就打开这个ida 64,大家可以new就是新打开一个文件previous。

就打开之前的某个文件,你打开也可以,你go直接点一个,就是暂时不打开文件,然后你在这里面可以选择打开,这是一个ida的界面,然后我们打开一个分析软件之后呢,它的这个窗口可以分为这几步。

可以分为这几个窗口,大家可以看一下,第一个窗口就是下面这一横条,它是对不同的代码块使用不同的颜色区分,你直接点击对应的颜色,就可以定位到不同的代码块,然后第二个窗口就这里,左边这是一个函数窗口。

就是ida分析出来的函数,然后右边第三是id的主窗口,这是显示它里面有哪些命令,或者是一个程序整体的一个概览图,整体的运行的图。

然后第四个是函数的一个控制还是缩略图,第五个脚本终端。

我们看一下,这是我们i da打开的,我们要分析的quick me程序,这上面是不同的代码段,看都是可以直接点击跳转的,这里面是他分析出来的函数,他分析了start函数,这是现在这个程序的入口啊。

这这里是主窗口,可以看到各种命令和程序的一个情况,这里面是一个缩略图,可以你拖动这个思维图,可以调整这个框的内容,显示内容,然后这里面呢是一个脚本,这i d a是支持python脚本的。

你进行一些操作可以使用脚本,或者说你发现一个应用的时候,可以导入脚本来进行工工作,这里是一个显示信息,output显示的一个窗口,下面我们重点看一下主窗口,主窗口包括什么呢。

我们啊还是直接对着这个i d a来看更清楚,首先这个i d a v u a这就是war,就是显示当前函数的控制流图,它这个每一步可能跳转到哪去,前面这hx是16进制,你可以打开多个,就是v u123 。

这样以16进制的形式来查看这个代码structure,这就是分析出来的结构体,这是ida分析出来的结构体,i da是个很强大的工具,它分析的一般是正确的,但是它也是只是一个参考。

不一定他分析这个结构就有,也不一定他没有找到的就没有,我们作为初学者的话,还是就相信i da就行了,如果你就是以后水平越来越高了,你要知道i da它也不是百分之百正确的,它是最强大的,但是不是绝对正确。

这是枚举信息啊,因为我们这个程序要简单,所以这里没有这个导出信息,import导入,这就是这个程序导入的一些函数,就是我们之前link是不是link,它要导入一些函数,导入了。

然后像我们correct me这个函,这个程序编译生成的过程中,也要导入一些函数,那导入了哪些呢,i da就给他一顿分析,然后就分析出来导入了这些函数,然后这是导出函数,就是输出的最后存在的一个函数。

因为它本身整体就作为一个函数,就是start,这是一个i da,它的主窗口的一个每个栏目的一个作用,主窗口介绍了之后,我们介绍一下i d常用的快捷键,f2 下断点。

这里虽然说把i d a作为一个静态的工具,但是随着这个工具的发展,它本来是一个静态分析工具,它现在功能越来越强大,现在d也具有强大的动态分析能力,我们后面就用i d a来进行分析。

动态静态动态都用i d非常方便,然后它的宽容快进到f2 下,断点就是动态分析的时候暂停的地方,单f7 单步步入,它会它只单步单步的执行指令,每按f71 下,它就会执行一个单的指令,f8 也是单薄。

不过还是不过f7 f8 的区别是什么呢,你之前f7 的时候,括号一个函数,它会下一步会进入函数内部,f8 呢它会把括号那个函数整体作为一个命令,它不会进入子函数的内部,f5 是查看反汇编生成的伪代码。

f9 呢是运行程序,它会一直运行,直到遇到断点,或者说程序最终结束,e s c呢就是那个键盘上esc键,就是返回到之前的位置,这是个id,然后后面,然后这也给大家介绍一下,我们这个动态的一个分析工具。

动态分析工具就是,运行起来来看是吧,我们这里给大家介绍的是一个o d o d t bug,给大家发的好像是那个差xd bug,因为xd bug它也能分析64位的程序,o d的话只能分析32位。

不过他们的分析方法都是差不多的,这里给大家介绍一下这个o d呢。

它是分为这么几个窗口,你打开之后,我我们这里,打开一个o d,比如说我们打开x32 debug,它其实,我们可以把我们要要动态分析的程序给放进来,放进来之后呢,大家可以看到这边是一个返回边窗口。

他本来这些都是神六进制的,其实也就二进制的代码嘛,然后程序就把它反汇编出对应的汇编代码了啊,这边是寄存器窗口,保留要寄存器,我们刚才给大家ex 1 b x1 c x e b p s p。

这些寄存器它的值是多少,然后这里面是一些输出,就显示信息窗口,这里呢这个是数据窗口显示的那个内存的数据,内存地址,这一块地址的数据还可以看多个,我另一块地方内存,它现在是什么数据,这是一个啊数据窗口。

然后这是堆栈的窗口,现在这里站里面有哪些信息。

这是我们一个动态调试工具,基本上都是这些窗口,它们的界面是比较像的,用法也是很像的,就是这些窗口啊,嗯那现在04:20,我们还是啊休息十分钟,四点半开始上课,最后最后一节课就是带大家实际分析一下。

crack me这个程序,最后进入到实战的环节,诶今天最重要的一个环节。

P91:逆向工程--逆向分析实战(一) - 网络安全就业推荐 - BV1Zu411s79i

就是我们给大家举个例子,这correct me这个软件它的md 5值是这么多,这md 5值是为了保证咱们用的是同一个软件,他们破解的是一个同一个软件,这个软件的名称是可以随便重命名的。

但是它的md 5值是固定的,我们这节课呢就也就带大家一起做一遍啊,这个程序呢之前是已经发送给大家的,就quick me,这个点击x e,我们所用的工具呢也发给大家了啊,大家下载了的同学。

我们今天现在就一起把这个题目做一遍,首先我们把这个工具都放在我们的虚拟机里面。

进行操作,这样我们就不怕中病毒,在虚拟机在虚拟机里面我们直接运行这个程序,它会感冒啊,已经过期了,out of date,让我们购买这个凭证,大家在使用软件的时候,经常会遇到这个问题。

就是需要输入序列号什么的,这是第一步,然后第二步呢我们用study pee这个软件打开,看一下,看一下它的信息啊,这你刚才也给大家看过,发现它是32位的,然后没有加壳这两个最重要的信息。

那么它是32位的,没有加壳那行,那现在分析就比较简单了,直接用ida 32打开这个这个程序。

这里我们之前已经打开了,打开这个程序呢就看到,这样一个,等一下看到这样的一个显示结果,这里是它的一个程序代码,i d a呢会把入口点自动命名为start,那我们就点击start就进入了。

他到这儿就这里呢就是程序执行的起点啊,这个程序啊大家不要产生误会,不是我之前给大家演示的编译的程序,print hello world,这不是,这是一个相对复杂一点的程序,那是个最简单程,这是不一样的。

现在我们就要弄清楚这个程序的机制,然后破解它,这是我们这节课的一个目的,怎么破解,怎么破解呢,看这里是不是有很多程序的分支,我们先总体来看啊,不要一开始就一句话一句话看,你这样你陷入了细节当中了。

你就很迷茫,你根本不知道这每个命令是要干啥,我们需要先从总体上把握这个函数这个程序,然后再分积分到几大类,然后每个函数,然后对重点的函数,我们再进去逐步逐步的看它的语句,不要一开始就看具体的语句。

看每个句句的,看你这样就陷到细节里面了,你就很迷茫,根本搞不清楚要干什么,那么我们可以看一下它,就它首先在这里会遇到一个分支,进入这两种,然后呢如果说进入这个分支。

大家看看这里面有什么什么字符可以firefers me,你会吗,valuation period out of time,purchase new license,是不是,这是不是我们刚才显示的信息。

我们直接运行就显示这个信息,如果说它不跳转到这儿,它跳转到这里的话,我们可以拖过来看一下,然后下面又会进行一线的跳转,那最终呢最终有两种,一种是跳转到这儿说kefile is not value。

这是无效的,要么就跳转到这,you really did it congratulate,恭喜,那么这个程序的大概的情况,我们是不是就已经把握了,要么刚开始就错了,在这告诉你,out of date。

要你购买这个凭证,要么在这一步成功了,然后后面的时候又可能出现一个错,出现错了,就是说这个k f无效的错误,如果这两种错误都避免了,那么就会进入到一个正确的结果,就是做对了,因为这是一道题。

所以说会显示这样正确的信息,如果说是一个普通软件的话,就是说你你已激活啊,您可以正常使用,或者是它让你登录成功进入,看登录成功之后的东西,这是一个这个函数的整体情况,我们进行了一个把握。

那么我们看首先看第一种错误,是不是我们直接打开运行就会遇到报这个错误,那说明在这里面进行跳转的时候,如果说直接运行的话,它会是不是就会跳转到这里,因此我们就要分期这个跳转这附近相关的代码。

看它什么时候跳转,什么墙体条件下进行一个跳转,我们看这个附近的,也不也别从从头开始看,那代码量太多了,然后很容易看云,我们就看这附近的,我们可以看到这这一段前面的有个kefile,reverse me。

这个kefile是什么,我们现在还不知道,然后我们再往上看一点,发现这里有一个push offset file name,push就是入站啊,file name入站,file name是什么值。

这个id已经帮我们识别出来了,是一个字符串,就叫k fire。date,然后括括号去调用函数create file,他就调用这个create file,这是个识别的函数,系统识别出来的函数,然后。

产后再进行一个比较,这个aa 1 ax和这个比较,如果说jz不等于零的话,它就跳转到这里的,40109a这里note 40109,这是个标签,就跳转到这,那说明等于零的话就跳转到这,说白了这是什么意思。

他就是要看有没有这个k file这个文件,如果有的话,它就跳转到这里之前,如果没有的话,他这里就会给你报没有这个文件,因此呢我们可以创立一个kefile。date,这样的文件。

我们在这crack me这里面,我们新建一个文本文件,这个文本文件就叫kefile。d,我们看一下这个名称是不是和这里的,识别出来字符一致,k f2。6的是一致的,那那么我们再执行一下。

他就报kefile is not valid sorry,这说明什么,他已经过了这一步,它进入了这里,就前面这一段都是正确的,进入到这里之后呢,他没有跑跑到最终正确的地方,他是跳转到了一个这里的错误。

kefile is not very,他到这里是哪种情况呢,大家可以从这个箭头,可能有好几种情况都会到这,要么是这里跳转了,这里也可能跳转,然后这里也可以跳转,说明多种错误都会导致这个kefile无效。

其实这里也好理解了,因为我们建立了这个kpi了,它里面是没有内容的,就是这个时候就可以自然而然想到,它需要识别这个kefile里面的内容,是不是,那么我们现在就要通过这个程序来判断出。

这里面的内容必须是什么,才能通过它的检测,我随便说个内容试试看一下效果,他果然说这个k file是无效的,说明是不能随便输入的,那么具体有什么要求呢,从这里有多个箭头指向,这说明它有多个要求。

你不符合哪一个要求,它就会导向,这是不是你都符合了,它就会导向,最后这里成功,那我们再一个一个的看,先到正,他现在已经跳转到这里了,他肯定是到这儿嘛,要不然他不会爆他,要不然他到不了。

到不了这个最后是不是,所以前面这一步我们已经成功了,不用管了,到这里从这里从这个框开始看,从这框呢它就看它有两个分支,就两个分支,如果是这个分支的话,跳到右边这个分支必然导致错误。

如果说跳到左边的分支的话,有可能会正确,也有可能错误,说明这个跳转它就是一个验证条件,如果这个条件符合,他再进行下一步的验证,如果这个条件不符合,直接就报错,那么我们看这个条件是什么。

这个框里面只有啊七八行语句,含义是比较简单的,我们可以逐条语句看一下,用push把站压进去,这些,嗯然后这里有个谱写4646h。

这是16进制的46,这是什么意思呢,我们,我们在ae里面看小f是66,那那这里如果说是输入四六呢,你看大f它对应的16进制编码,16进制字符就是四六,是不是这点可以理解,16进制就是四位。

因为以一位是一表示两种嘛,零一吗,16x2的四次方,那两个16进制这个数字,这是一个八位,八位就是一个字节,一个英文字符就占一个字节,所以一个英文字符就用两个16进制数字,来表示。

这里i da也把我们识别出来了,就是f然后这lp buffer buffer是什么意思,下一步是就是一个指针,说白了就是这个意思,或者说一个句柄,就是后面来操作这个函数啊,或者操作这个地址。

然后push ex ex数据入账,然后coread file refer,你从这个名字就可以知道他读文件,他这里已经要读我们刚才的kefile这个文件了,是不是,然后它比较什么ex和看ex是不是零。

如果说不等于零的话,就跳转,这里它实际上比较的是什么,test,就是,验证它这两个是不是相等,这里实际上的啊,实际上的意思呢,这是什么,就是验证这个f,uf它是15的意思。

它就是要读取这个句柄处的15个字节,然后看它读取成不成功,如果读取成功的话,在ea x就不是零,如果读取不到15个字节,ex就是零,那么test ex它的结果就是零,然后就会跳转到这里,就为假。

实际上这个我们先这么理解,然后后面再进行一个动态执行,大家就更好理解,说明他这里面对我们的我们这个k da,对这个文件它的数量,它里面的字符的个数有要求,所以我们要多输入一些啊字符。

他就不会不会跳转到这儿了,他又会进入这里,进入这里呢,这里又会进行一个比较,你看number of beast read,它读到的字符个数,它会和谁比较,和10h比较,10h什么16g h代表16进制。

10h是多大,就是16,是不是十进去的话,就是10 16进去他就16,它会和16进行比较,如果说这g l l是nice,如果说你小于这个十的话,它又会跳转到这儿,如果说大于这个是不是不小于这个一零。

h就是大于等于16个字符的话,它就会跳取到这,这是第二个验证,第二条线,然后第三跳到这儿了,仍然有可能跳到这儿,我们看一下,如果说到这里面之后,但是他有可能跳到正确的,有可能跳到错误,那关键是什么呢。

我们看分叉的点是在这个框是不是,那我们在这里看它是比较什么e si和八,cm p就比较,那说明它要比较某个值是不是八,然后gl就nice是小于八还是大于八,小于八还是大于等于八,如果是小于八的话。

js就跳转到这这个4010f7 ,这个地址处就会报not valid,如果是大于等于八的话,就跳转到这个401205,也就这里啊,这里他就会最后报你成功了,顺着执行是不是。

所以我们就知道这个e s i的值要大于等于八,这是我们的目标,怎样才能让它大于等于八呢,我们前面已经到这了,我们继续看这里,从这一步到这儿是必然的,这里啊到这是一个一个判断,是不是它判断是什么。

我们常面从这到这,你看整体结构还要么到这里,要么在这边,在这边呢又会回来,说明这是一个循环的结构,我们看它循环的一个内容是什么,循环的这是什么呢,到这一步,他是,ccmp就是还是进行了一个比较。

他是把什么比较出来,它实际上就是把这个b x就是和放到a l当中,然后和a l比较,就是判断是说白了这个意思就是他在读文件,看你文件是不是到头了,文件是不是到最后了,他如果事到最后了,就跳到这里,没事。

到最后就继续读,继续读,读的是什么呢,他把读的结果是a l,这个零就表示这个文件的结尾吗,他如果不是这个零的话,到这里就比较和47h,47h就是g和g这个字符进行比较,看他读写字符。

比如说我们这里是不是有d r h什么呢,他跟读的字符是是不是这个大g,如果说是的话,就是比较为真,那么这个这里看一inc上节课讲过是不是自增,i n c就增加一,要否的话i n c就不增加一。

然后进行执行,所以这个区别关键就在于i e s i,它是不是自增,而这里呢是要判断e si的值是八,要大于等于八,是不是,所以我们就希望他能够每次就经过自尊的这啊,不要跳过它,这是我们的目的。

我们需要程序执行到这之后,到这里面,然后每次都能够自身自身的阅读越好,这样你把文件读完之后,那你判断usi就大于八了,是不是要使得字字呢,就要使这个字符等于记,那么我们这个时候就可以在这里面输入。

尽可能多的大g多输入几个吗,那这样的话这时候再判断e s i,等着循环组完再判断e s i,那就大于等于八了,那跳转到这最后就可以报你执行成功了,我们现在在执行一下,我们已经把这个全部输成g了。

前面有判断一个10h h 16,我们这肯定是多于16个了,所以都可以,这些绕过这些条件,我们都满足了,我们再执行一遍,看一下执行的结果,现在就可以执行情况。

you really did it congratulate,那么这个程序他就被我们破解完了,他所需要的条件就是需要一个kefile,点d e t这个文件文件名是不能改的,然后它里面的字符需要很多个g。

但是现在只是粗浅点,具体的需要多少个g呢,具体需要八个g,就这里面要含有八个g,它实际上是一个什么过程呢,就是读这里面的文件,然后读了就判断这里面从第一个字符开始,是不是g是的话,e s i加一。

不是的话,再读下一个,然后一直读到文件的最后,他这里是实际上只读16个,读前16个字符,看看是不是大g然后e si是保存的数量,最后记保存下有多少个大g,然后这里再进行验证。

如果说你的g的数量有八个或八个以上,那就执行成功,否则执行失败,验证是验证失败,啊这就是这个程序运行的一个过程,那我们这里在动态的看一下,动态来看一下,我们为了有一个动态的效果啊。

我们这里就不全输入g的,随便都要输一些,但是g的数量也要是够的,假设现在开发data是这样,那我们动态曲线看是它怎样的一个过程,我们还是先假设没有这个kpl啊,一步一步的,比如说我把这个ky名称改了。

然后我执行执行的时候,他会在这里就会报错,是不是,所以我要在这里是不是在这里下一个断点,add breakpoint,可以下一个断点,然后我来调试它用i d a,我说了,这本来是一个静态分析的软件。

但是它现在功能越来齐全,它也可以动态分析,而且动态分析能力也是很强的,我们就直接用r a进行动态分析,因为这样动静态一起看,非常的方便,你用那个温度debug啊,x x86 debug。

那都都可以选择分析器,就因为这是windows的程序,我们就选择一个local windows debug,然后我们点击执行,yes,它就会直接运行到我们下端点的地方了。

而且他这里会大家看到没有一个跳这个闪烁,闪烁就表示就表示他告诉我们,下一步要跳转到这里了,我们可以点击,单步执行诶,这里快捷键,我们可以点击单不值f7 或者f8 ,f其实不仅进入子函数。

f8 不进入子函数都在这里都可以,我的这个f7 怎么是把旁边的界面给调出来,这里啊到这里呢之后呢,我们也可以看一下,这是这些技术这个站,然后还有这个县城,我们先不用管这,他使用的模块先不用管。

然后各个寄存器里面的值是可以到运行状态中,只有我们是可以随时来读取的,哦我看一下这个,快捷键这里,f7 f8 都是可以的,他现在就跳转到这一步了,诶这,我的这个快捷键去哪了。

啊那我们就在debug里面看也可以,然后我们继续下一步,是不是他已经到这里了,那么后面就会继续报错,这种直接运行结束,它就会给我们弹出一个out of date,所以这是第一次试验,那没关系。

这次我们就通过动态执行也可以发现,他需要一个kefile date这个文件,那我们就把这个文件,现在放上这个文件,我们再进行执行,这时候大家看他跳跃的是右边这个箭头,说明他现在不会进入到左边了。

他下一步要到右边这里,我们决定关键的地方,我们在这里下一个断点,然后我们继续运行,大家看,因为我们的这个qfii里面是有文件内容的,就会跳转到左边,如果没有文件内容,就会直接到右边,然后报错,是不是。

然后我们还是跳在关键的地方下断点,大家跳转的地方我们点击运行,你点击运行,它会直接运行到你下断点的地方,如果没有下载的地方,它会直接运行到程序结束,是不是他这时候他实际上检测的字符有没有。

10h课就是16个,因为我们的字符比较多,大家在下课后可以自己做一做测试,自己拿这个k file做一下测试,当你这里面字符比较少的时候,你看它是不是会跳转过来,会跳转到这里,因为现在我们字符是比较多的。

符合16个的要求,它会跳转到这是不是,然后我们在关键的地方再下一个端点,这里跳转这里是验证什么意思,这里就是看文读取结束了没有,还没读,读到最后一个字符,所以它在这边读。

然后再决定这个e s i是增加还是不增加,大家可以看到现在e s i是等于零的,yes i的指示在这他决定看你这个等于几,大几还不等于大几,来决定是否增加,那么在这个地方再下个端点。

看读到第一个字符是等于大g的,因为我们这个第一个字符是g,那他就要进行到这里就要增加,那我们继续看,因为这是个循环啊,我们继续执行,它又到这儿,这还没有结束,又到这里面,我们下一步唉。

第二步看它是跳过了我们前面一步,增加1e si已经等于一了,因为我们第二个字符它不是大g,是大h和那个大g不相等,所以他进行他跳过一三,这样e si就不增加,他就这样一步步执行,最后独立完之后。

判断e si是大于八还是等于八,e si就g的个数在后面的啊,大家应该都会,那我们就把这个断点取消掉,我们已经搞清楚,这个过程就不需要下这么多断点了,我把这个带点删除掉,然后直接让它进入到这里的时候。

我们在下一个在这个地方下一个断点,把这里的断点也取消掉,这样我们就不会在循环里面一直在运行,他就这个整个循环过程就运行完了,然后到这里他判断usi的值,usi的值是bb就是多少,a就是十。

因为这是16进制b91 ,那还有11个81个g那就比八大,所以它跳转到这里,跳转到这里就是啊,另外一个同学有什么问题的话,就在聊天里面提出来啊,不要那个打开语音,要影响到其他同学上课。

看这里有个就闪烁的告诉我们,下一步需要调整到这里,因为它已经大于八了,然后就会继续跳转到这之后,boss执行成功,后面就是说大家推荐大家把这个kefile。data,这里面进行各种的输入。

来验证他会走什么样的一个程序,这个流程程序的流程是会怎样跳转。

然后我们把它结束掉,那么通过刚才这样的一个过程呢,就这个本来是我们是没有这个license,没有使用权限的一个程序,我们就构造出了它的一个验证了一个文件,文件名,文件内容我们都构造出来了。

那么就可以正常的使用这个程序了,这是一种软件破解的方法,就是你要附带上这个文件。

那么我们还有一种软件破解方法,就是有个软件是破解版。

P92:逆向工程--逆向分析实战(二) - 网络安全就业推荐 - BV1Zu411s79i

你直接用它就可以了,这种是怎么做到的呢,这里,给大家推荐一个插件,在我们的,在我们的edit里面有一个kp,大家使用这个插件可以修改这个程序,所以修改程序呢,就是程序本来是这些二进制文件嘛。

我把这里面的字符进行一些修改,那么程序就进行修改了,现在我就要实现我能正常使用这个程序,但是他不要进行一些验证,就是像刚才一样,不要验证有没有规范,也不要验证那个g的个数是不是大于等于八,我就想直接用。

不需要他必须配合一个kefile文件才能用。

这个是怎么做到的,这个我们就要进行一些验证,比如说我们现在,先把这个kpi文件重命名。

相当于现在没有kpi文件了,当然你以为只有这个correct me exe这个文件,那怎么做呢,我们还是让它执行,他第一步到这儿,是不是因为我们现在没有开发文件,它会跳到这儿,他会报错。

怎么让它不跳到这里面呢,我们可以对这个命令是接n z n就是not,就是非,那么可以对这个命令进行修改,对整个key patch,可以配起大家定期这个patch,这里面就有这个指令。

大家可以把jn z改成jz,那么它现在跳转的方向是不是就和原来相反了,然后点击一个patch,就你现在就变成了jz了,他就不会再跳转到这儿了,是不是,你看他现在尽管没有k file文件。

它还跳转到这里面来,跳转到这了之后,你看现在又有一个问题,他要通过这里来跳转,跳转到这儿直接报错,同样的道理,我也不希望他进行这样跳转,这里是因为我们没有这个文件内容。

我们这里是读取k f里面的文件内容,我们没有他就要跳转件报错,这同样的我们选择这条命令,然后右键,然后k fk patch,然后进行patch ph就是修改打补丁的意思,你要把它的判定条件进行修改。

在这里改了之后,它就自动的进行了相应的二进制文件修改,不需要我们改二进制,就不需要我们记住jz是一个二进制命令,是什么,jn z2 进制命令是什么,就不需要我们直接这样修改,后面这个不用管。

那么这条命令是不是进行了修改了,我们再点击运行,它就不会跳转爆头,它会跳转到这儿,跳成这,它如果不修改的话,它跳转到哪去呢,跳转到这儿还是报错,那么怎么办,同样的道理,我们进行了一个修改。

这里进行一个patch,改变它的跳转,就是说他g n z你敢接z吗,jz就g n z吗,你就加个c就行了,有有飞的你就去掉,没有的你就增加,这样你就改变了它的跳转的方向了,然后因为这里面我们下到你。

所以我们不怕它直接执行完,我们直接运行,你看它就不跳到转到原来在这儿了,才跳转到这儿,到这儿呢,它是比较这个ei是不是等于八,e s i肯定是不等于八的,因为我们的这个文件都没有。

当然也不可能读出8g的个数大于等于八,这是不可能读出来的,那么这时候他还是会报错,怎么办,还是进行修改,同样的方法,同样的方法进行一个修改,那么我们啊,他现在应该就会跳转到这里面。

我们在这里下个断点看一下,是不是现在就到这里面,然后下一步就正常执行,就正常结束就可以了,执行完了就会给我们报,你成功了,这就是我们对文件进行修改。

然后我们再点击这里这个啊editor里面有个patch program,我们应用把刚才的修改应用一下,然后这里注意点击一个crack back back up,其实相当于把我们修改后的程序保存一份方案。

修改之前的程序也保存一下,这个修改后的就叫crack me,点e x c e,修改前的这个备份呢就后面加个点b a k备份。

我们点击ok,那我们现在这k file这个相当于还是没有啊,因为它叫1k file,是不是我们现在直接运行这个程序,是不是直接就可以用,我们把它复制出来,卧室移动我们要复制,是不是就可以直接用。

然而它原来的修改之前的备份是在这里,我们又,这个studp打开这个备份,是不是md 5值和之前的一样,这就是两种破解软件的一个方法,一种呢把它条件找出来,第二种呢我修改它的判定条件,这两种方法各有优劣。

第一种呢你找出他的条件,优势就是你没有改变他程序原有的执行路径,这样程序的功能发挥是很正常的。

缺点就是你要精确的找出这个条件,它的花费的功夫大一些,然后像我们第二种方法呢就是修改判定条件,优点就是比较简单,你可以修改它的判定的走向,你想让它走向哪里,修改到哪,缺点呢就是对一些复杂的程序。

这样做的话,会使程序无法正常运行,因为你前面比如说前面这里要读kefile,这个文件,你没读到,它会报错,你虽然可以跳过报错,但是他如果后面一些正常的功能,需要使用这个文件里的数据。

那这个正常的功能就没法发挥了,啊这是两种方式,各有优劣,这个详细的过程呢也是给大家写在这个,我们这个第五章里面,让大家回顾一下,第一步呢就是,尝试运行,然后发现他会要到我们这个证书已经过期了。

让我们重新购买这个license,第二步呢,使用stp发现它这是一个32位的文件,然后没加壳了,然后我们就根据他这个32位,我们选择ida 32打开这个软件,还有64位的pe文件。

就用ida 64打开这个软件,然后进行静态分析,入口点呢i da会命名为start,通过start呢就可以看到程序的控制流图图,就是我们刚才看到各种跳转的框,这是一个程序的控制流图。

然后就发现在第一个分支处,实际上尝试打开k放点date这个文件,那我们就创建这个文件,再次打开的时候,它会报这个错误,然后找到这个错误的位置,然后看有哪几条路径会导向这个错误,然后我们就进行。

在每个路径导向这个错误条件处,我们就发现它真正要验证的是什么,要读取15个字节,然后验证这里后面一个下读取16个字节,这里是一个略微的差异,因为有一个是验证的是f,有个验证是10h,包含16个字符。

然后呢他发现包含16个字符满足之后,它就会进入这个循环,在这个循环里面判断这个g的数量,然后保存在这个ei容器当中,然后跳出循环之后比较e si寄存器,这个寄存器是否为八,或者是否是大于八还是小于八。

还是大于等于八,如果是大于等于八的话,就会跳转到执行成功的这一个对话框,所以总结起来这个破解correct me的条件就是啊,这也是条件,在同目录下存在这样一个kefile。data这个文件。

这个文件呢第二个条件就至少包含16个字符,第三个条件呢,这个字符中至少要有八个是这个大g这个字符,满足所有条件的k file。date就可以被他认证成功,实际上别的程序来认证那个序列号。

也是通过这种方式来认证的,类似的方式,这样就破解了这个quick me的验证,然后这是第一种方法啊,后面给大家讲了一种,相当于比较投机取巧的一个方法,第一种方法是正统的,最完善的。

把这个程序搞得最清楚的,第二种方法就是我直接跳转,这种话比较简单,比较巧,但是它也有它的作用,直接跳转有时候就能直接达到我们的目的,甚至有时候做c t f提的时候,比如说他就让你显示最后的这个。

把这个弹框显出来,那可怎么办,中间这个程序太多了,我搞不清楚,直接在这里修改,这里不是j j z吗,它跳转我不像他进行这样的跳转,跳转到这个,他这个结论是判断,要不要跳转到这个40109a。

这我直接不进行判断,直接接mp直接降p到哪,降不到这401205站也可以,这就相当于一个投机取巧这一另一种思路,这两种思路啊都有用,都适用于一个不同的一个场景,这个实战破解就是这样。

大家下课后自己去操作一下,不管你没理解,都要自己去操作,就是理解的要自己操作,这样子自己做过,你才能熟悉,才能真正的理解,如果说美女有什么问题的话,也可以在群里面,我们不是有qq群吗。

也可以在群里面提问,这是一个实战破解,然后最后定,然后第六部分就是一个逆向的一个建议,逆向分析的时候,第一个逆向分析建议要注意一个编码的风格,最好大家有一些编程的经验,你知道开发者怎么编程。

你在逆向的时候,你知道就是你知道正向是怎么样的,你在立项的时候,你就更容易理解程序,第二个是集中原则,就是程序员在开发程序的时候,往往将公民相关的代码或数据写在同一个地方。

所以说这一块地方这一句话你不理解,你看看相关的,它这一块地方可能具有相同的功能,相似的功能,第三个特点呢是一个代码复用,在编写程序,代码复用是很普遍的,这种其实总体思路就是。

大家知道开发人员是怎么开发的,编程的人是怎么编程的,那我们进行第项的时候,就更容易猜测出,判断出这个程序的功能,所以说七分逆向,三分才满,这逆向它必须举有一定的猜测,但也不是瞎猜,你要根据经验。

根据他的语句进行猜测,猜测之后还要进行验证,还要区分代码,就是说拿到返回页面代码,你要能区分哪些代码是人为编写,哪些是编译器自动附加的,就像刚才说的id很强大,但是他也不是百分之百正确的。

最后一点要有耐心,因为逆向的话确实它有一定的难度,尤其是刚开始大家对这个印象的流程呢,还有汇编的语言啊,不太熟悉的时候,可能做一个简单的题都要几个小时都有可能,这是很正常的,让大家坚持去做。

这就是一个熟练熟悉的过程,然后大家学习相关的一些书籍,也给大家推荐一下这个c和指针,这是讲c语言里面指针的,因为指针可以说是c语言的精髓,指针在汇编里面它就叫寻址,寻址也是汇编语言的核心内容。

然后就是汇编语言,第三版就是清华出版社出的吧,我不知道现在有没有更新啊,我以前看的第三版,这个时候讲汇编也要讲得非常好的,然后还有恶意分恶意代码分析实战,给我们讲了非常多的方法工具,深入理解计算机系统。

c加加这些加密解密安卓的啊,这些书不是说大家啊一天两天要看完,大家闲下来有时间学习时可以看看这位数,然后最后呢就是我们的一个作业,作业呢就是三个题,就是我们和天王实验室立项游乐园的1~3关。

我们可以看一下这个这个作业,给大家准备的还是比较好的,大家可以登录之后可以创建实验机,这个和电玩实验室灯大家应该都会用吧,啊不会用的话也可以在群里提出来,都会教的,大家可以创建实验机。

实验机就给大家准备好的模拟环境,题目和工具都在这个实验机里面,实验机就是个虚拟机吗,然后这里面实验简介,预备的知识,还有实验目的,实验步骤都有给大家讲的还非常详细的,这不是为了考导大家。

主要是为了让大家练习这个逆向,啊这是第一关,第二关,第三关也是类似的,大家去做就行了,呃今天课程的主要内容呢就这么多,我看到刚才有人有同学举手,是想问问题还是点错了,想问问题的话,就是就把问题问出来。

你发在聊天里面,我能看到,大家是大家应该是能发信息的,之前有同学不是发了一吗,可以,有什么疑问都可以问,包括今天讲的课程内容啊,这个后面作业啊都可以问,这个课件呢后面也可以给大家。

然后大家那个下课后自己再消化吸收一下,大家都没什么问题吗,为什么我在啊别的地方讲课的时候,他们都有很多问题,而且都是,这很珍惜这个体育问题的时间,基本上下课了,还会一直在问,可能问个一一小时,一小时多。

那都是有可能的,大家是觉得这个内容是太难了还是太简单了,因为我理解就没有问题的话,就要不要太简单了,啥都会,所以没有问题,要不就太难了,什么也没听懂,哎如果这些东西如果掌握了,那很好,如果没掌握。

也没什么可怕的,你们不是刚才上大学吗,还没多久,比较年轻,年轻就是资本,这些都逆向工程,是我们网络安全中最难的一块,和胖是相关性很大吧,是胖和逆向就相关很大,相关性很大,是最难的,就是处理二进制。

用二进制它就是多少有点反人类的,不那么直观,所以说其实现在有些什么不理解的,那也是很正常的,没啥问题,多练习,多学习就可以了,这是最难的一块,这一块花的时间要多一些,但是这也是非常强大的。

也可以说最强大的一款,门槛是最高的,当然大家学会之后,作用也有最大,有什么问题都可以提啊,然后群文件里面呢有个da da pro的软件,大家想需要的可以下id app,是我们进行逆向分析的核心的工具。

逆向分析还是很强大的,他连操作系统都可以调。

还有很多进阶的内容,比如说嗯那个多机调试。

我们现在调试的啊,这个程序就是在本机上。

就是在本机上,但它也可以,比如说这个卡里虚拟机里面有个程序,我也可以在这里面,在windows这个机器上来调远程调试,甚至调试卡,你这个操作系统都是可以的,嗯暂时有些地方可能没理解。

反正先把工具保存着啊,先把课件保存着,以后想用啊,想学的时候都可以拿出来看,拿出来用,怎么看有没有加壳,就是,这是我们要分析的程序,你把你要分析程序,通过这个比如study p。

当然有别的查看工具可以看,你能看得出来这里面有一个文件类型。

像这个就是一个汇编的,没有加可的文件类型,你可以在百度里面搜一下这个文件类型,他这个加壳是壳也是分很多类的,有加压缩壳。

加密的壳,还有很多细分的,也就是从这个studp的文件类型的结果,你放在百度里面看,你就知道每一种文件类型代表什么,是加密加壳的,其实你分析的时候也可以分析出来,因为加壳呢它程序的你静态看。

你看不出什么内容,因为它是前面是壳,后面是压缩的内容,你看不到真正执行的程序。

放到id里面,有很多分支很复杂,怎么找到突破点,后来d里面就是i d a,它会生成这个程序的入口,你首先要看程序的入口在哪,然后这个程序的这个流程或者流程图分支,是可以这个放大缩小的,要从总体上把握。

你看你最终想要到到达什么地方,没有我最重要的,这这是成果,那只有这条路线,在这这里啊,这里有个分支,正向看,反向看都可以,所以说这个做逆向分析需要一个耐心,比如说一下子能看出来你正向看它,这有两个分支。

这两个分支代表什么呢,因为这个题比较简单的,这里直接就没有了报错了,所以这个分支肯定是一个走向报错的分值,那我就要尽量避免逃到这儿,我要让程序走向这了,你正向反向结合的看,然后再花一些时间。

你就能把正向反向走通了啊,你就知道到这儿看到这儿,他这里还会报错,所以要到这里来,到这里来,这里还报错,要到左边来这样一部分,你就知道正确的流程是什么,正确的分支是什么,或者说有些太复杂了,没关系。

你执行一遍嘛,你可以动态调试,我还是推荐大家就用ida来进行动态调试,ida真的很强的,尤其是大家后面学到要调试一些操作系统,操试系统内核的时候,用i d远程调试这个remote。

远程调试可以调试系统内核,这样比如说别人装的那个木马,它是放在隐藏在系统里面的,这样都能找出来,嗯大家还有什么问题,没关系,大家尽管问,不要怕耽误我的时间,大家有问题就问。

那如果说大家就是暂时没什么问题呢,那就先下课了,然后把课件也会放到群文件里面,大家自己在看课件,然后有问题就在群里面提出来,那我们今天的课程就到这里,就不给大家拖堂了,好的,那就下课了。

P93:逆向工程--逆向工具培训 - 网络安全就业推荐 - BV1Zu411s79i

第三章,那我们再进行一个一项分析的时候,首先要看一下这个文件的一个基本的情况,可以使用这个使用禁止查修改和查看的工具,比如说这里给大家指的是u1 u1 editor。

丢失edit,这个工具可以查看16进制情况,可以进行一个修改。

也可以比对文件,是吧,这是我们是在一个虚拟机里面做的,大家,大家在进行逆向的时候,最好也是在虚拟机里面做,因为大家分析的这个程序很可能是带有后门的,如果说你在主机里面做,你被抓到后门。

到时候清理非常的麻烦,所以说最好专门有一个虚拟机来做,然后这是我们的一个优异的程序,那么我们今天要分析的这个。

啊先把之前的东西删了,这是我们今天要分析的程序,我们可以在ui里面打开啊。

这是通过16进制查看,那情况也可以进行一个修改,但这时候修改是修改不了什么的,因为我们还不了解这个程序的机制,不知道在哪个地方进行修改。

啊那么大家都是高材生,这这方面这些简单的工具,应该就不用过多介绍了,这是u e和下面那些u e compare,就是比对两个文件,你可以在进行一个程序修改的时候比对一下,看你修改的是哪个部分。

这个有红色的地方,就是有差异的地方,然后呢我们再给大家介绍一个工具,就是这个studp,它是一款pe文件的分析工具,我们打开这个是,然后打开一个文件,这是我们要分析的这个程序,我们先看一下。

从从这里就可以看到,它告诉我们这是32位的pe文件,那么我们后面再进行分析的时候,比如说你用i da来看的时候,i da有i da,它就是三查看32位程序了,还有i da 64查看64位程序了。

你就知道要用ida打开,同样的这里是如果是64位的话,你用d n64 来打开,然后下面这里有个文件类型啊,这就是没有价格的,有的时候它有价格的,有一些u p s以及其他的,你查看这个p的文件头。

然后他的一些躯干等等信息,都可以通过这个studp来进行查看。

这是我们这个sp这个工具,那么在linux中可以使用read e l f,来查看这个e l f文件的属性啊,这里是这个a。out,就是很简单。

就是hello world程序就prenf hello world,这是因为linux里面是e l f文件嘛,刚才3p是一个windows平台下的一个工具,可以看到这只是1f64 位。

然后其他的一些信息等等,啊,那么前面是给大家简单介绍一下,我们一向相关的一些情况。

P94:逆向工程--IDA Pro介绍及实战 - 网络安全就业推荐 - BV1Zu411s79i

本次课程的主题就是ida pro的一个介绍,ida pro呢首先介绍一下,后面是在实战演示一下怎么使用,那么ida pro呢就是一个交互式的反汇编专业版,或者你检查i d就可以了。

i da就是交互式反馈编,是目前最强大,最流行的一个静态反汇编的一个软件,这个软件其实是要付费的,但是也有嗯激活的办法,反正大家都知道i d pro它的功能是非常强大的,这些描述性的话就不介绍了。

我们看一下它的一些窗口,那么使用ida打开程序呢,会对打开的程序进行自动分析,尝试识别程序中所用的函数以及所用的一些库,还有数据结构,那么会呈现给我们这样一个界面,那我们边介绍的时候。

我们就边用ida来打开看一下,因为我们刚才已经分析出来,他是一个32位的程序,看到它是32位程序嗯,然后呢它是没有加壳的,所以我们可以直接进行分析,我们打开i da,然后我们open这个文件。

我们需要分析的程序,这里他会帮我们自动识别,这种自动识别一般都是对的,大家可以直接打开就行,大家可以看到这,这里面呢就是我们的一个主要的分析窗口,这是一个嗯程程序的一个执行流程,这是start吗。

程程序的入口啊,执行,那么执行到这里呢,就会有一个跳转,它根据运行时的一些情况,他可能往左边跳转,也可能往右边跳转,但如果往右边跳水,下面啊也有各种情况来进行一个调整。

然后呢这里呢是这个框是他帮我们分析出来的,一些就这个程序使用到的一些函数,比如说这是start函数,它就你点击它进入到这里,然后这边呢是一些windows api的一些函数,可以的。

还file app都可以定位到,你如果想看男孩子都可以定位,导致,然后下面这里呢是一个我们这个图的流程,图的一个缩缩,越,因为我们这个程序的刚开始给大家介绍,是介绍的比较简单,它的流程呢也是比较简单。

基本上我们在这里面看的也也是可以看清楚,有时候大家后面要分析的程序可能是非常大的,你直接在这里看到就是太多了,可能太久,所以可以在缩略图里面进行一个拖动,而定位到你所需要观看的地方。

然后正面是一些信息的窗口,有时候你比如说什么操作出错了,你会在这里可以爆出,下面这里有个pyth,就是i da呢,它是支持你编写python脚本的,可以执行一些python的命令。

那么我们课件课件当中啊,也是给大家写的,第一个呢是不同的代码块,这里的一个使用颜色进行一个区分,然后第二块这里是一些函数,另一个i d a所分析的函数,第三块呢是这里是一个主窗口。

然后这里是函数控制流图的一个缩略图,然后第五这里是一个脚本,然后主窗口当中它还有多个项目,我们看一下,这是我们刚才看的主要问题,还有这里可以看hx,hx就是16进制吗。

这跟我们用ue打开这个程序是一样的,可以看他16进制的一个情况,然后它的一些结构,因为我们这些比较简单,这些就基本上没有,然后import import就是导入,就是这个程序它引用了一些函数。

比如right fire这些,这都是库函数,这属于windows的库函数,并不是这个程序自己写的,是这个程序导入的函数导出的,就这成绩他自己写的函数就是start,当然复杂程序这里面导入导出。

就有更多的一个函数,除了这些窗口以外,这些窗口如果说不需要的,你可以点击叉掉,把它关掉也可以,那么有的窗口你还需要看,但是又没有默认显示的,大家可以在这个vu里面可以open stu。

你可以把一些别的窗口没在这里显示的打开,比如说我们这里后面要用string string创口是什么呢,它就提取这个程序当中出现了一些字符串,比如说这些字符串它会提取出来,然后在什么位置。

我们先放在这后面会用到它,这是对ida窗口的一个介绍,然后它的一些常用快捷键,因为给大家说多了,大家可能也记不住,其实最常用的就是f2 ,就是这些f2 呢就下断点,因为i da也是可以动态执行的。

包括我们后面的mod,其实它们的快捷键有很多都是通用的,都是同一套模拟器,f2 呢就是下端点,然后呢f7 呢就是单步步入,就是一步一步执行,执行汇编代码,一步步执行吗,如果说遇到一个函数括号一个函数。

那么f7 呢就会进入这个函数内部,我们看一下这个这里面是不是有有矿这个函数,这个函数也是可以点进去,就可以进入这个函数内部,这是f7 ,如果像这种不是调用函数,它就正常一步一步执行。

那f8 和f7 的区别呢相同点都是单步执行,区别呢就是单步步过,对于一个函数,我跨一个函数,它把这个当成一条命令,它不会进入函数内部,它直接执行下一条命,这是f7 和f8 的一个区别。

有的时候我们需要进入这个函数内部,查看一下这个函数就行了,这可能是我们很关键的一个函数,那么你要f7 进入函数内部,但有的时候这只是一个windows库函数,那我们了解一下这个库函数。

它的输入输出是什么就行了,就不需要跟进去一步一步执行,因为库函数一般是比较复杂的,那么不需要跟进去的时候,就是用f8 ,那么f5 呢就是查看五代码,因为我们这里看到的就是一些,这些都是汇编的秘密。

然后汇编命令转成那个c语言的伪代码,就是f5 f9 呢就是直接运行程序,他会遇到我们前面下的断点会停下来,或者说没有断点的话,会直接运行的程序结束,然后esc那就是跳转到返回到前面的位置,就退出嘛。

就是啊最常用的快捷键,当然还有很多的快捷键,这个因为这些东西说多了,就是我们不能像文科一样去背诵这些东西,就跟大家写程序一样不存在,我要把这些常用的函数背下来,都是自己写,自己用使用的过程熟悉。

然后有些不清楚的也是查手册,就是这样,然后呢还有一点就是显示地址,大家可以看到,直接我们打开它,这里是不显示这个他这个我们显示这个命令,但是不显示这个命令的地址的,所以这里给大家介绍一下。

怎么样把这个代码的地址给显示出来,就是在我们,这里option我们打开看一下,vin general,这里面在课件上也给大家写,我们勾选这个nine perfect这个前缀啊。

ok那么这个每个代码相比刚才呢,它的地址就显示出来,那我们这么分析的时候,就更好定位是哪一个代码,或者说你有时候跟别人协作的时候,你会告诉你,我分析的是哪一块,就是显示地址的一个方法,啊。

那么前面给大家讲了一下,i da的一些介绍的情况,那么下面呢就是一个实际破解程序,因为这些工具的使用,只有在实际使用当中才能体会到它的作用,才能熟练使用,然后这个破解程序呢也是可以。

在我们和天王实验室可以在线做的,我们看一下这个地址,啊当然之前应该用过这个黑玩实验室,就你创建实验实验机嘛,然后这里面也有一个教学视频,如果不太清楚的,也可以看一下视频,然后等待这个实验机创建。

那么根据这个网络情况,有时候会比较慢,要等一会儿,然后在创建过程中,大家用的时候可以看一下这个实验指导书,实验步骤啊,实验目的这些,那么这个实验呢,就是我们今天要破解的这个程序,大家在课后呢。

可以自己登上这个实验室来做一下,我们创建了虚拟机之后,这个整个的实验环境都是有的。

工具都是有的。

这idea以及这个程序。

这里面是,在实验指导书里面都会写案,我们要破解程序是在哪里,啊需要破解这个程序,这个呢就是大家课后自己去实操一点。

那我们这里呢就是在我们本地的一个环节里面,讲这样一句话,就是更快一些,不会受到网络的一个波动,然后大家课后的话,自己在我们实验室里面进行一个练习,实验室的这个实验的地址呢就是在这里。

好那么我们就开始分析我们这个程序,我们先把之前的,这些东西关了,包括把这个也删除了,我们从从头开始分析,走一遍流程,那么我们遇到这个程序呢,就是一个破解它,这个程序我们可以先试着运行一下。

当然如果你知道这是一个很危险的程序,你就不要直接运行了,那么我们如何直接运行这个程序呢,它会告诉我们这个valuation period out of date是吧,就是过期了,要我们购买这个品证。

就很多软件都会遇到这个情况,那么我们现在就是在不购买纯电的情况下,来破解它,首先呢还是使用studp来打开一下这个文件,那么这里就知道了,是32位的,然后呢是没有加u p x,没有加壳了。

因为u p s是最常用的课,后面会再给大家介绍一下,这个区段里面也是没有任何可乐信息的,那我们就直接进行分析,我们使用32位的id来打开这个程序,open fi,然后我们进行一个分析。

这个流程呢也不是很复杂,大家可以自己看一下,如果说遇到复杂程序吧,根据我们我们现在假设它是一个很复杂的,就不能够直接我们一个一个看,因为这个本身不复杂,那我们就可以像刚才呢我们在vue里面。

我们打开一些他这里没有默认显示的窗口,我们打开string窗口,发现这里面字符串是不是,那么这个字符串呢,revaluation period out of date,那么就是我们刚才直接运行。

看到这个字符串,那么这我们就要跟踪一下这个字符串是不是,我们点击一下我们跟踪到这个字符,这个字符串的地址,我们点击一下ctrl x ctrl加x,然后呢就会跳到这里,就是引用到这个字符串的地方是哪里。

用到了它,我们要跟踪进去,我们跳转到这里来,发现是在这里面使用了这个字符串,那么我们再看一下这个相关的,它附近的一些代码,大家可以看到呢就是从这里进行一个跳转,来跳转到左边,左边呢,就是显示一些信息。

然后呢这是一些字符串,是不是push入栈,然后扩一个函数,从这个我们可以知道前面push的是不是,我们这个下面函数的参数,就是把前面的值,前面这些量作为后面这个函数的参数,放到这里面。

然后再调用这个函数,那这个函数呢可能刚开始不知道什么意思,不知道什么意思的时候,这大家可以看到他这个经验吧。

这明显是一个windows的库函数,我们可以查一下这个库函数是什么意思。

其实遇到别的库函数也是这样的,我们不要进入库函数里面分析,这样的话效率很低,我们直接查这个库函数,message bo,那么这个函数就直接给我解释,它显示一个模式对话框,会显示这些消息嘛。

状态或错误信息,让它的语法参数,这样的话相当于是我们是正向的来看,会比逆向的来看会容易很多,所以像这些库函数直接就查一下,跟别的库函数这里都有,都可以进行一个查询,他就弹出一个对话框嘛,然后显示信息。

那么结合我们刚才的职业运行,是不是可以知道,那么这里面呢实际上就是弹出了这个valuation,period auto date,就弹出这个信息,那说明如果说程序直接运行的话。

是走的左边这条线是不是要弹出来,那反过来说,如果说要使这个成绩能够破解,那么它就应该走右边的这条线,因为左边这条线这里就没有一个跳转的判断呢,它都是顺序执行,它就必然要出错。

所以这里的关键点就在于这上面,这部我们可以在这里下个断点,就在跳转之前,这是问题的关键,是目前我们知道问题的关键,当然有可能前面的代码也有有,那么后面可以再分析,这一切那个步骤啊,在我们实验指导书。

在我们现在这个课件当中,也就给大家详细写了,是吧,然后才退出进程,然后我们看一下这里是关键,那么这里面既然这里面,我们就分析一下这附近的代码,不要分析太多,如果你看的太多或者不相关的,你就很容易绕进去。

半天找不到一个嗯逻辑,一个节奏,那么这里呢它减z就是不相等,就跳转,是不是那部下的是什么不一样呢,是上面标明是ex和这个0f f f就是-1 ex,就寄存器的值和这个值比较是否相等,比较是否相等。

我们再往前面看,前面是框,这又是个库函数,那么这个ex呢就是这个库函数的返回值,但很多时候,这个函数的返回,是默认放在ex这个计算机当中的,这个大家就是在我们这个汇编语言,这个里面会简单介绍一下。

所以说那么现在是不是我要看一下create fa,这个函数是干什么,这个还是你清楚的就可以清楚的,你不要他进入函数内,他这不函数,我们直接进行一个搜索,那么这里面就给我们写的,它是一个打开,它是。

它是创建或者是打开,这个不太不太稳定,它是创建或者打开文件,或者是一个输入输出设备,这个函数的作用,那么前面的这些push是不是就是这个函数的参数,你如果是仔细分析的话。

你可以也可以下面对着这个函数有哪些参数,每个参数什么作用,可以仔细的看一下,那么一般情况下呢,我们是不需要看得这么仔细的,我们可以先大概看一下,因为这里我们是否需要深入的看看,现在还不知道。

我们现在大概了解它的功能,把程序把整个程序的一个大致的功能了解清楚,然后后续再看哪个地方是我要仔仔细分析,他每一个代码都要进行分析,如果你一开始就每个大白金分析,那就就是工作效率就很低。

那么这就是它的参数,那么这里呢就传入了一个file name,是不是file name,这个它的数据的值呢就是可以发点d的,这也是出现在我们一个我们来联发现的,他用了一个字符字符串常量。

接下来都是使用的一些字符串常量,他就要导入这个文件,是不是,然后调用create file a,也就是说要打开这个文件,那么现在我们就可以知道问题在哪,因为我们现在这个文件里面。

我们刚才直接运行的是不是不存在,它只有quick quick me,点击f c e这个文件,它是不存在可以fail。date这个文件的,所以他就出错,然后他就跳转到左侧,这时候我就可以想。

如果说我有这个文件,那么它是否就会跳转到右侧,我们这里可以测试一下自己的想法,我们新建一个文件,那么文件名呢就是刚才看的文件名可以fail,点d,那么这个文件呢是没有任何内容的。

我们优优e打开来看。

这完全是一个空文件,但是不管我们先创建这个文件,然后啊我们再把这个程序我们再运行一下,唉现在给我们显示就变了,原来是这个out of date,是不是现在是not valid是无效。

那说明我们创建的这个文件它是起到了作用的,至少是改变了它程序的一个执行流程,那这个可以fail is not value是在哪呢,我们按照刚才的方法来看一下,我们在这个字符串传口中看到还有这一项。

我们点进来看一下,kefile is not mine,sorry,就是刚才显示的内容,同样的我们ctrl加x,ctrl x一使用这个快捷键,然后呢就是使用这个字符串的地方,我们点击进去看一下。

还在这里进行一个使用,那么这里哦我们可以先在这里下个断点,然后作为一个标识,我们这里把这个地址给显示一下,好是在这里进行一个使用,那么到这里使用,大家可以看到有三个箭头,说明三个方向都可能会走到这一步。

相当于这是我们目前程序运行的一个终点,那么程序现在现在是不会运行到这儿了,所以现在会运行到这里,就这里是我们能够确定的,我们确定程序会到这,然后呢最后又回到这中间是走哪条线,我们是不确定的。

就前面的流程我们已经知道了,是不是,因为前面只存在一个跳转的地方,我们加了kefile。date就会跳转到右边这里,那右边的就是顺序执行,这里面也就调用一个函数,然后做一个判断。

判断有不同的分支就可能到这里,那具体哪个分支到这里呢,我们现在还不是很清楚,所以说我们要看一下这一段代码,这种少量的就是可能7878行的,这种汇编语言,我们可以逐行的看一下。

这里面的这个look 40109 a,这是标签,这不是一个代码,我们前面跳转的,这是相当于一个地址嘛,跳转到这个地址这里,然后第一个代码,这就是几个破解,这是传入参数,把函数的参数放到栈中。

然后呢调用这个函数,这个函数同样的也可以查一下,当然不查也可以,基本上你看到这个名字,你也知道是什么意思,read file,我读文件,然后这里面是它的一些参数是吧,这里面写的number of b。

number of beats to read,那么这是i da给我们自动加的注释,就是i da我们识别出来的这个参数是什么意思,那么它使我们使用工具,就要利用它给我们的帮助嘛,它识别出来。

我们就直接看number will be to read,这个顾名思义就是我要读多少个字节,是不是这里是46h46 h h就是16进制。

我们看一下16进制,46h也就是70 十进制的70。

说明他要读70个字节,当然你如果详细的看到这个read file,这个库函数的意思,它实际上意思,它实际上这里是代表读取不超过70个字节,就你的文件如果特别大,我也只读取70个,如果说很小。

只有一两个字节,我就读你实际的字节,这是这是一个安全的函数,它都要限制你读取的长度,这个大家可能也了解过一些啊,战役出的一些问题,比如c t f里面胖,是不是如果你不限制它读取的这个变量的长度。

它就会那么攻击者就会任意的输入这个内容嘛,然后就会造成战役出,就会控制你的一个执行流程,所以说这里要进行一个限制,他最多读取70个字节,就是零差4646a h和字节,然后毒血之后就进行了两种跳转。

如果跳转到右右边呢,那就必然走到失败的这个环节,如果跳转到左边呢,那就有多种可能,其实这里面我们就可以猜测到,是不是因为我们的kf 2点data里面没有内容,所以导致跳转到右边,因为如果说有内容的话。

应该是在左边,他要对这些读书的内容进行一个处理,现在是怎么处理,我们先不管是吧,因为逆向的话后面也会给大家,就就是他不是说我们数学公式,第一步必然得到第二步什么的,还有有的时候要根据一些经验来进行一个。

猜测判断,所以我们可以可以认为就是没有输入的时候,我们文件没有内容的,它是走到右边这里,那么如何验证我们的猜想呢,其实我们现在i j它本来是一个静态分析的,但是它现在也集成了一定的一个动态的功能。

有简单的动态分析程序,我们可以直接在i d e里面看,我们可以直接运行一下这个程序,这里我们首先要选择一个这个分析器,我们选择local windows第八个,然后我们点击运行。

因为我们之前已经下过断点了,所以说它会它不会直接结束,它会断在我们下断点的地方,我们直接点击运行,这是这是程序的一个主要窗口,这里是16进制,就可以跟随跟随内存中的数据。

然后啊这些线程这些我们不用看这个模块呢,我们也不用看,我们把它关掉,这里是寄存器,e s e x这些e s p v p这些寄存器当中值,我们现在呢我们是由于我们在前面一步判断,是影下的断点。

所以它断在这里了,40107b这个地方,然后这时候注意da给我们一个提示,他在跳舞是不是右边的这里在跳,说明了他下一步不要跳转到右边这个分支,看闪烁的这个分支是下下一个跳转的。

我们可以按f8 或者f7 都行,我们直接下一步,那么他果然就跳掉了这个分支了,然后我们继续执行执行,不行,唉这里它是给我们跳转到左边的分支,那我们看到,怎么继续执行。

你把这个先关掉,那就是它不用判断,就是keep fig里面有没有内容,所以说就是要靠我们的猜测来判断,然后来加验证来进来明确我们的判断,这是我们做逆向分析的一个过程,那么现在就跳转到这里面,是不是。

这个时候呢我们可以先把它关掉,直接点击这里是停止,那说明了程序,目前我们就依托于我们现在的直串的,这个开发点,data,没有任何内容,那么程序呢就会走到这里,同样这个地方呢也会进行一个跳转。

我们在这个跳转的地方下载断点,那么前面这些地方我们可以在f2 就取消断点,我们就不用再下断点了,我们直接断了关键的地方,现在程序是到这我们就清楚了,然后最后怎么到这儿呢,有可能直接到有可能啊。

经微信一系列的运算来到,都有可能,这个时候我们可以再运行一下,看看在目前的情况下,它是一个怎样的一个执行流程,那么直接就跳转到我们下断点的地方,因为前面断点已经取消了,那么是右边进行闪烁啊。

那么就走这个右边这个分值我们可以执行一下,按下f8 ,然后执行就到这里面,然后调用这个弹框的这个函数,就会弹出这个窗,k flob,那说明啊问题的关键就在这一段代码这里。

是不是现在我们肯定是不希望他走这个右边,因为这里面就告诉我们,这个k file是无效的,我们现在就要使这个kefile是有效的,那么就希望他走左边,那这里是怎么判断开发有效无效的,大家可以看到这里面啊。

这x y异或运算异或运算最关键的是cmp,就是比较还是比较,这是js就是data s就segment数据段,这是基地址,在选址的方式整合后面的是偏移,就是这个地址出的值要和10h做比较。

l l就是nice嘛,有小于的话进行一个跳转,跳转到4010f7401 ,这里,所以说我们要读取的内容呢,就前面这里判断,就要让它大于大于等于这个1年h10 ,h就是16。

是不是他才就是不会跳转到这个无效的地方,我们可以先测试一下,这里面就是number will be read嘛,就读到的字节数,因为我们现在这里面呢是没有内容的,所以他得到自己数肯定是小于10h。

也就是小于十进制16的,那么我们这里可以随便给他输几个123,a b c d e f g,11,然后我们保存,然后再重新运行一下,还是到这儿,这个时候呢我们看一下这个地址的值。

我们点击一下就会给我们显示,我们首先放在这i d就给我们显示是多少,0a h a就是十嘛,那我们这里面是不是正好十个,因为看这里面你点击到一旁边就是二楼,你点击到g旁边是11,那么只正好是十个字符。

说明呢,说明这里比较的就是我们文件当中的字节数,和这个1年去做比较,那么他现在油门输的比较少,它还是跳转到无效,那说明我们输入的内容要比较多,要至少大于16个,那么现在我们先把这个停掉,然后现在还不够。

我们再随便输入一些内容,让它比较多,现在肯定是大于16个了,已经到39,就有38个字符了,然后我们再进行一个运行,同样它会直接断在我们这,然后这个时候呢它闪烁的就是左边的线,那说明我们的判断是正确的。

那我们再静态的看一下,然后这里面我们也分析清楚了,那我们把这个断点呢也可以进行一个取消,那么就我们知道,只要在我们可以说一点data里面,填入超过16个字节的数据,就可以跳转到左边。

就不会直接到kfl无线,看完左边呢,这就是正常执行的,我们先不用管,我们可以在这个判断的地方,这个跳转的地方做一个断点来分析一下,它是根据什么来进行跳转,大家可以我们先大概看一下这个流程。

它跳转的有两种情况,往左边走呢,大家可以看到是一个循环,又走到这里,是不是,这就像一个循环,我们添加是个-2,a等于一,a小于十来加加这些或y啊,a小于十,这样一个循环,然后呢右边呢是啊,这就退出循环。

然后进行执行,执行,然后有左右两种情况,然后呢左边右边这里就kefile是无效的,我们让他到这里,然后到左边呢是继续执行这个,you really did it,这是成功了,那说明到这里之后。

我们要希望他走左边这条线,就是大家在进行分析的时候,也要结合一定的只有自己在写代码的一个经验,因为这些代码都,这些程序都是由代码编译生成的,这就是一个啊循环的一个结构,那么我们就先遇到这种循环的时候。

大家可以先不看循环内的内容,由于这个循环内容可能比较复杂,一时半会儿看不明白,我们直接在最后这个关键的跳转的地方,做一个判断,下一个断点我们把这个断点先取消掉,我们看一下这个跳转的情况是什么。

我们再次再次运行诶,直接因为前面的断点都已经取消了,那么直接运行到我们刚才相当于这个地方,他现在呢告诉我啊,是右边整体删除就跳转了,这key fire是无效的,那么这段代码我分析一下它是根据什么判断。

它是比较e s i和八的值,那么e si是多少,我们看一下计算器,看e s i是零,那么nice 0是小于八的,所以进行一个跳转,也就是nl e s s,那么这里就是。

说明我们要尽尽量使e si的值大于八,或者是大于等于八,是不是,那么它才会跳转到左边,然后后面才能够破解成功,这是我们的执行一个流程嗯,那么我们先休息十分钟吧,文11。05再讲好吧,大家有什么疑问的。

也可以跟我交流一下,如果没有这个他们自己实操是玩玩的战力对,因为持仓可以继续装备,在铲屎,你是实验室,也是就提成这样环境对我的意思就是大城呃,这个课上完了之后,你们告诉告诉你一个平台的网址。

让你登到这个这两个实验室,让他们自己也做了啊,就是讲完了之后让他自己看不,这个不是吧,那可以两个实力真的让他们学生自己非常帅,一会我们租客客家人,前面诸葛就是这样啊,他对他那女的是一个人在干嘛。

如果他在家里切磋的时候,已经有一个课程了,所以他们也没操作过,当时我给你打对对,就宋宋老师带他们到我们认知实习的时候讲过,这个不是讲这个内容,是通过前十,你说对一个平台,那谁是外部,外部的。

主要是在外边的,应该是到时会让他们自己练一把,就把这个网址给发到他们群里,我们课件里科技的那种,嗯哼,哦哦哦我的意思是他说的那个是空的那个表,那个表头李宁商城的这个就是一个我懂你意思,你学会了。

一天整出一个新的人答应。

P95:逆向工程--IDA Pro实战(二) - 网络安全就业推荐 - BV1Zu411s79i

11点过五分,那我们继续上课嗯,其实其实刚刚讲那么多,大家有什么意见,有什么疑问都可以给我反馈,因为这个逆向的内容呢,它整体它就是比较难一些,所以如果说啊有大神的话,那么觉得今天的内容就是比较基础。

比较简单,但如果说之前没有接触过理想的话,就可能觉得啊好多都不懂,看大家这都是正常的,当然有意见有意见,有疑问都提出来,那我们就接着啊,上节课都有讲,那么我们这里面就知道,它关键是要比较这个e si。

看这个e s i这个寄存器的值相当于零和八,比较要小于八呢,就说我们k file是无效的,那么我们呢现在就知道了,就是要通过改变kpl的内容,是这里面不是我们随便输入的内容了。

要是一些特定的内容通过输入特定的内容,是这个e s i大于等于八,那么它就会走左边,然后呢就会后面就会执行成功,那么我们先把这个退出调试,我们再看一下,他这个e si的值是由什么确定的。

那么前面我们知道这个循环呢,我们之前还是没有看,那么现在呢就需要看一下,因为之前都没有涉及到这个e si嘛,所以说我们这个猜测应该是,由这个e s循环来决定,这e s i的值,因为循环这里之前。

我们已经读到了这个文件的内容嘛,那么这里面循环是做什么呢,我们看一下,首先呢是比较这个ebx的值,那我们在调试的时候来看一下,更好的理解,在这里下了断点,然后我们调试,然后这时候我们一步一步执行f8 。

然后,这个时候大家可以看,我点放在这里就可以看到它是吧,这个40211a的值,这里的地址给读到了我们的a l当中,图大是嘛,31,那么现在文件当中是多少,啊,是30也是30多个字符。

然后他呢来比较a l是否等于零,来决定这个跳转的方向,从这里就可以看到,a l呢就相当于一个判断循环是否退出的,就相当于我们for循环里面的i,是不是看i等于零,i等于零的话,就进行一个退出是否等于零。

然后现在当然它是31是不等于零的,这个三一是那个16进制的意思,然后他在这里面它是比较a l和,447h之间的一个,值是否相等,这个bl这个ax e x这就是寄存器ex 32位,如果是16位的。

这个处理器就是a a x吗,如果是八位的,就是a a h a r这里的a啊,就是说我现在虽然是32位的,但是对于八五十六啊都是兼容的,bl就是第二ex的这个最低一位l就是no吗,no的意思。

然后就是第一把位嘛,然后h就是high就高把位这个意思,然后就比较和四七是不相等,那么现在呢当然是不相等的,三一和四期当然是不相等的,那么来这里我们直接到这里面,不相等呢就会跳跳转到这个。

我把这里缩小一点,跳转到这个44010d0 啊,跳转到这,当然这个就很明显了,跳转不跳转的区别就是是否执行这个i n c,e s i这个命令,其他的都没有区别,其实跳不跳过这条命令,那这条命令是什么。

i n c就是自增,相当于i加加这样自增1e si的e si是多少,是你是你说明执行这个命令,e si就自增一零就变成一,一就变成二,那么结合我们刚才最后面要判断,e si的值要大于等于八。

这说明是不是,就是我们尽量要让它执行这个i n c,e s i这条指令,就尽量不让它跳过,那么如果说你每次都执行的话,那1e31 直自增,那就会大于等于八,所以这里呢我们的思路就是要让它跳转。

让它直接往下不往右,那么让它往下接n z就是跳转n就是not,这也就是这二个学习下就相等的意思吗,它不相等于调整,那么c m p跟a l l就要相等,需要尽量是a2 的值,等于这个479。

那我们继续执行,那么跳转来这里继续左哎,又回到又回到这里了,又回到循环了,现在变成了三二,那我们继续执行,大家当然是不等的了,又回到运动就变成三三哎,是不是好像有一个规律,这个a l的值,继续执行。

又变成六爻。

这里呢我们用16进制来打开这个文件,可以看到,那么我们这个文件呢,是不是就是31323361,那么下六幺下面是一个是六二,我们再执行一下。

看一下,现在是牛羊龙,再循环一遍,诶右边六二通过这次循环就知道所谓的a的值。

就是每次读入我们这个开发点data里面的,这个每个字符,然后它显示值的就是这个字符的16进制的值。

那么我们的目的呢,就是要使这些值尽可能的等于47h47 h,这里面来定一个标识,它在字符里面就是大g,那么如果说我这k five的data里面的内容都是大g,那么是不是这里面就是相等。

然后就会就不会进行跳转,就会执行e s i就会自增,这里面也我们也可以手动的改一下,我们可以赢,我记得应该是可以编辑这个内容的,六二我手动编辑一下,编辑选四期,然后我们继续后面的执行。

那么这时候呢就相等,那么就往下走,e s i原来是零,现在执行这条命令变成了一,那这条命令多执行几次就会变成八九十,那么后面呢就可以,这里比较的就不会进行这个错误,跳转那个k file无效的地方了。

那么这里的程序呢我们基本上就分析清楚,所以说现在的目的呢,我们刚才看的这个k p一有两个条件,第一个呢是它的字符要大于等于16个,第二个呢他要还有很多个g,所以我们这里进行测试的时候。

那我就输入很多个大g进行一个保存。

然后我们再运行。

这里啊现在读的就是47h4 期了,因为这都是大g这个文件里面没有别的字符。

所以他读每一步都是四期,然后呢就会执行e si字母加一变成了一档,现在我们再执行一下u到e s在这里要变成二,要多运行几次,是不是会变成345,这个循环我们就不一步步循环了,我们直接点f9 跳跃到这里。

让他走出这个循环,这个时候e si就变成了四四。

因为我们输入了非常多的这个大金。

这时候e si再和八比较,是不是就会大于八,这个箭头进去,左边灯亮了,闪烁了,那么它就会跳转到左边,然后这个窗口的函数调用,那么就会给我弹出这个窗口,比如redit。

那么这个验证的文件我们就完全的弄出来了,课件当中的这个过程也给大家写,它的精确条件就是最少要含有八个这个大g,这个时候因为我们已经有了这个大g文件,如,如果说我们直接运行这个。

他就不会报刚才的out of date或者是无形,sorry啊什么的,这样就破解成功了,所以说这个程序它所需要的验证文件。

用同样道理,其实也可以,或者其他程序的一些验证码呢,其实也是同样的,他怎么验证码,他怎么判断你验证码是否正确,他就把你的验证码读进去,然后经过他的一系列的运算,然后再进行比较。

这里呢就是比较这个大g的个数。

要求大于等于八,啊这是一种方法认证的方法。

P96:逆向工程--keypatch使用 - 网络安全就业推荐 - BV1Zu411s79i

但这样的话我们每次运行这个程序呢,就要带上这个kf 2点date,除了这个之外,还有一种呢就是我们可以修改程序,这里面呢就给他介绍一个key pet ket,是一个给我们这个程序打补丁的一个插件。

那么我们后面的内容快一点,这个当然在我们实验室里面也有它的项目,地址呢,是这个怎么怎么用呢,就把仓库里找到k开始点pl文件,然后拷贝到ida目录里面的这个插件文件夹下,然后启动id就可以。

这个插件就有了,插件有了,然后我们怎么用,我们这里给大家演示用一下。

那你先我先讲啊,先把这个关了。

我把这个加个一,那么现在呢就没有开发点data这个文件了,就直接运行,这是我们最开始的情况,我们想更改这个程序,让他不用读这个k h r t也能够运行,也能够直接到我们最后希望的这里,这个时候呢。

我们就因为刚才我们已经对程序分析清楚了,我们就直接修改一下,我们知道在第一步呢,没有开发点data就会跳转到左边,但是为什么呢,jn z进行一个跳转,这个时候你想我如果说改变它的判定条件。

并改成jz跳转,那么是不是就会逆转它的一个判定,是不是它本来你改成jc了之后,他本来到左边的就会到右边,那么怎么改呢,我们点击这条命令来点击右键右键,这里有个kpad,因为这个插件我已经装过了。

和直接用点击这个patch,然后呢这里面我们直接把这个jn z改成jz,那我们点击patch,它后面还会自动提示,我们要不要修改后面的指令,我们就后面的命令就不改了,取消我们只改这一条指令。

然后我们这样运行,我们在这里下一下一个道理,这样运行,啊这里还不太行,因为我们只是修改了,并没有保存,同样的道理,就是我们这里是在相当于i da的数据库里面,修改的,并没有真正的修改这个程序。

我们先把所有的修改改完之后再保存,然后同样的下面这里这个判定不用不用改,这里面是不是本来是读不到这个文件内容,是直接跳转到这里无效的文件,那这里也可以进行一个修改,是吧,改变它的判定。

你只要加个n就行了,n就是否定嘛,它有的有的,那你删除没n的就加n,那么这就是一个改变了他的判定,减n l l l l是小于嘛,不小于就是大于等于g1 g就是great大于等于,这个判定就改了。

那么它就会从这里走,这里读不到文,他这里同样e s i肯定小于八的,因为我们没有这个文件内容,是不是,那么这里的判定也可以改一下,这就是给大家写的,要改这些命令,每次改的时候呢,你去改一下。

你后面再弹出提示,你修改pc,你不用再改,不要改后面的指令,修改完后呢,我们选了,我们只改了i d a的数据库,其他i da对这个程序的一些记录信息,并没有改程序本身,那想要改真正的改变程序代码呢。

需要保存一下我们的修改,我在editor里面有个past program,然后应用,这时候的我们可以创建一个备份,那么这是我们改变后的一个程序,这是我们原来原始的,你们再打开这个文件,然后运行。

唉key value is kefile is not value,那说明我们就是尽管没有这个可以发点data,这个文件,我们前面下来一嘛,但是他也不会说out of date,说明我们的改动是生效的。

那么刚才他没有到最后的成功了,说明中间没有改,完全我们可以动态执行一下,嗯嗯这里是正常的,说明这一步呢也要进行一个修改,是不是你再看一下,就是我们不改动之前呢,它是往左边走,先改动之后呢,它是往右边走。

所以这里面也要进行一个修改,这里面同样的我们,改一下就行了,然后呢进行一个保存,现在这就是修改过的软件,就不需要任何的条件,直接就能运行,这样就是实现了对这个软件的修改,所以说这就是我们看一下两种方法。

一种是我搞清楚它的一个验证条件,然后我制造一个文件能满足他的验证条件,第二种呢就是我直接修改这个程序,使用kpatch这个插件来修改程序,然后最后呢在这个ida部分给大家介绍一下,我们的程序壳,就有了。

程序会在外面加一个,有的程序会在外面加上壳,就本来这个文件是这样,那加壳后呢,他就把e s e文件压缩,然后在外面套层壳,它执行的时候呢,这个noa部分把这个e s e n加到内存当中。

然后解压缩来执行,这样你直接分析的话也是分析不出来的,这个最常用的一个可能就是u p x啊,大家可以使用一下u p x这个工具,我们这里给大家看一下,啊这个就分析完了,我们把它关了。

这是一个cctf的题目,就是先给大家看一下,首先呢我们还是用cp来分析一下,他还是64位的文件,然后它这里的文件类型呢是unknown,不知道让我们看看别的信息。

我们注意到这个区段里面呢有很多u p s,就说明它是一个u p s的压缩壳,如果说我们摩托可直接进行分析,这是64位的球,球们使用ida 64来进行分析,我们打开这个文件,你看直接这个文件呢也是啊。

看起来啥也没有,中主要呢中间就调用了一个函数,跨这个函数,这个函数是什么呢,大家可以看这个所谓的就是啊非常的复杂的,然后你如果直接这么分析的话,就走进死胡同了,就分析不出来了,因为这个题是加可能的。

是不能够直接这么分析的,我们把它关掉,我们要进行使用这个u p脱壳工具,来进行一个脱壳,大家可以把这个用这点。

加入到我们的环境变量里面,然后就是在任何地方都可以执行u p x的命令,我们打开cmd,在当前窗口打开cmd,我们使用一下u p,这点u p s调用的就是就是这个,这里是给我们的一些使用帮助。

让我们对这个程序来进行脱口,怎么talker u p x杠d就是解压缩,因为这压缩er吧,解压缩就talker cooled,就是输出文件,输出文件就是随便吧,这个2。1x c。

那么第二点ex也就脱壳后的程序。

然后我们再使用dna来分析,我们这时候呢打开2。1x1 ,这个程序就正常多了,然后呢这里面是flag,这是w cctf的一道题,一道嗯,反正你只要会脱壳就很简单,如果不会脱壳,那就肯定做不出来。

所以说这是一个简单的脱壳,嗯这详细的步骤也是你们写在课件当中的啊,这对ida的一些情况的介绍。

P97:逆向工程--Ollydbg介绍及实战 - 网络安全就业推荐 - BV1Zu411s79i

wd 8简称o d呢,是windows rt 3级的一个持续调试利器,三级就是用户级嗯。

嗯它主要是用于进行一个动态调试,嗯我们这里把,把d关,把d关掉,然后我们打开这个功能debug,这是他的一个窗口好的界面,然后我们可以打开一个文件进行一个分析,我打开就打开,这个可能刚刚的九五为。

喂啊打开这个看看九五进行分析,就是它的它的一个界面。

就,这里诶,喂喂,电量极为为这个显示电量机啊,那我们来加快一点,那我就声音大一点,大家如果听不到的话,就是可以给我反馈,因为这个话筒呢它不太稳定,咳咳那我们选择一个可执行可执行文件。

然后我们打开打开之后呢,就是它的一些窗口,这里是来反馈别人窗口,然后这些寄存器的窗口,这一些信息数据对战这些窗口的,就是我们主要看的信息,就会反汇编窗口的,就是地址那个汇编代那个机器码,然后汇编代码。

然后寄存器窗口的就是查看寄存器的信息,那么刚才在a d a里面呢,也是经常需要看寄存器里面的值,这是显示这些信息的,这数据呢就是我们可以跟踪内存地址,就这一段内存,它当前的数据是什么啊,这是堆栈堆栈。

因为程序的调用啊,都需要程序的参数,都需要用到对战这些信息的。

嗯我们就直接看着这是他地址,然后这是它的收集数据,也就机器码嘛,然后这是返回编出来的结果,然后我们双击一下就可以给这里加上一个断点,你按f2 也可以,f2 可以加,按断点取消断点,加断点取消断点。

然后这里再返回位,这里按一下空格,或者你双击一下,它就可以进行一个修改,比如说我们刚才的命令是吧,我们刚才改的gnz啊,这些命令都可以进行一个修改,然后这第三栏内注释你可以加一个注释。

就是这句话这一段命令是什么意思,你可以住在这注释,这它不会影响你学习执行,但是有助于我们的一个分析,啊这是寄存器,嗯这些寄存器,这里的寄存器的值呢也是能够进行修改的,因为我们可以通过改这些寄存器的值。

来修改程序的一个执行逻辑,就像刚才a d a里面那样,还有不同的跳转,我们通过它有的跳远,是通过判断寄存器的值来进行跳转的,我们可以修改,这里是一个内存当中的一些数据。

这是对战的一些情况,这些详细的啊信息都是我们看到都写了,大家课件回头会发给大家,然后大家可以在对这个课件自己再操作一下,这个设置主要就是在界面里面设置一个,u d d的目录或者插件的目录。

有时候要用到一些插件,然后快捷键呢其实这说的比较多了,常见的也就是i d里面那些f2 嘛下单点,然后呢f7 单步步入,f8 单步步入,跟id里面的逻辑是一样的,f9 是运行。

然后它的使用呢我们有两个实验,大家可以访问一下我们实验室,然后在实验室里面做实验,就像刚才a d a那样,创建新创建实验机来进行实验,第一个时间呢是给大家讲这个搜索字符串,以及如何搜索api的。

这个呢重点大家自己去操作一下我们的课程的,我们课程的时间比较紧张,这个这一部分就不给大家逐个的操作的过程,写的是很详细的,大家照着操作就行了,我们重点看一下后面的实战啊。

因为我觉得给大家讲这些操作没有实战的话,大家也记不住,重点讲的,这是实战实战中大家操作或者说有些不会的,再回过头来看一下怎么搜索字符串,这样大家会记得比较清楚一些。

然后我们的实战呢就是调试这个count 95,这个程序,我们我们看一下怎么调这个client 95 dc这个程序。

嗯这个程序是我看一下,放在这儿,这个程序呢打开是这样,让我们进行一个注册,我们随便进行注册,name 1234,随便输入一些,然后告诉我们这个registration code注册码是无效的。

invending吗,无效,那说明要验证我们的注册码,但这个注册码的验证的可能也会跟用到这个内,因为不同的人应该是有不同的注册码,这是根据我们一个经验进行判断,我们把它退出,那么现在呢。

我们就是想怎样知道他这个注册的名称。

和这个注册码之间的关系,我只要找到一个正确的注册码,我们执行,因为刚才这个这个逻辑其实跟id有点像,刚才显示是什么,这不是一个有效的一个注册码,是不是啊,我们再运行一遍嗯,随便输啊,这不是一个有效的。

sorry,不是有它的注册码,我们呢在这个楼梯里面也可以搜索这个字符串,我们点击右键,在这个cpu窗口这里点击右键,然后查找查找里面呢有一个所有参考文本,这里是所有的一些字符串常量。

我们在这里面点击右键,有个查找文本查找,我们可以点击一个,sorry,我们就不区分大小写,模糊匹配,喂没找到,我看一下,这里是指没找到合人,大家想为什么会出现这个问题,明明我们在运行的时候。

它就是会弹出这个字符串,但是我为什么在程序里没找到呢,大家注意到,这时候我们,我们回到cpu窗口,回到这里,这时候我们的线线程模块是在哪,nt d啊,就是windows的进程。

就是我们还没有进入client 95这个进程里面,所以我们现在找的并不是我们当前要分析的,这个程序的数据,我们可以直接按f9 进行一个运行啊,他现在就进入到我们client 95里面的。

追到这里的一个变化,然后我们在这里面再进行一个搜索,还是查找文本,sorry,然后哎这时候就找到了,我们按ctrl可以找下一条,就是你搜索的文本可能有多多条,它可能多个地方,比如说cnet 95啊。

就就多个地方,你按ctrl就搜索下一条,那么现在这里只有一条,我们直接剪辑进去,那么就定位到这里了,这就是所有出现的地方,那这一段是什么意思呢,其实这都是汇编代码,只不过这是o d识别的时候。

汇编代码根本上你和ida识别,这汇编代码其实是差不多的,这里面呢就是参数嘛,push几个参数进去,然后呢调用这个函数,这里面他也帮我们识别出来这些参数是什么啊,其中第四这个参数就是这个文本,sorry。

这是无效的注册码,然后调用这个message box a这个函数,也就是弹框,那么可以在这弹框点下个断点,前面这个测试断点我们取消,我们取消掉,在这里面双击呢是显示这个相对距离,这是绝对地址。

这是相对相对于我目标的地址加2+4,a就是十嘛,这是绝对地址,b3 和b5 ,这相差二这个意思,这个遇到这种不熟悉的系统函数,同样的也是去查,那么这里就不重复查了,这里面就是弹框要输入这个内容,是不是。

那我们首先看一下,有没有哪个地方是引用这个函数的,这个课件当中也给大家写,我们到这个函数的开始处。

点击右键查找选d命令,就可以看有没有代码跳转到这里,我们操作一下,因为进入的函数就是给它传参数,这是进入函数的这个起点,我们点击这里一下,查找参考选定命令,发现没有别的地方跳转到这里,那么做个相对应的。

我们看一下有跳转,这是一个跳转的,跳转到哪里,跳转到这儿,我们在这里点击右键查找参考选择命令,就会看到啊,有两个地方是跳转到这里,那么现在这里呢它是没有地方跳转过来的,说明他是顺序执行到这儿了,是不是。

那么就要看一下它上面几行的一个代码,这里是发现上面的几行有点怕,接e就是结就是降频嘛,e就是e口相等,就降频就跳转,那么我们可以分析一下这两个地方,跳转是跳转了,这里面有个箭头可以收起。

打开他就会指示你我跳到哪儿去,跳转到都是跳转到这儿,我们这里做一个标识,然后下面这个呢你看他们跳转的命令是一样的,跳转的目的地都是一样的,都是跳转到这,那说明程序执行到这的时候,这么顺序执行。

如果它跳转了,就不会弹出这个无效的注册吗,没跳远继续执行,在这里又再进行一次可能要跳转的判断,如果不跳转就执行这个错误弹窗,相当于,因此呢这两个跳转是不是我们研究的一个关键,如果说他跳转走了。

那就不会报这个无效的一个注册码,是不是科技堂主也给他写。

那么跳转它是根据什么跳转的,这里我们看一下第一个跳转,它判定条件是什么,它的判定还在上面,它就比较我们放大一点嗯,比较这个ecx和e d x的值,相等的话,则跳转下面呢是比较e d x和这个361d。

e c这个值是否相等,说明这e c s e d x,它是决定我们注册码是否有效的一个关键,或者说他判定中筹码是否有效。

就是经过一系列操作,然后把值放在e4 x e d x里面来进行比较,程序的逻辑呢就这样,那么遇到这种情况呢,同样呢也是两种方法,第一种呢好就是我不更改它的判断逻辑,就是我修改程序,就像d那样。

我把那个判定条件改了,这里是跳转吗,我搞成不跳转,接e接n e进行一个,命令的修改是不是就像i da一样可以。

第二种呢就是找出他的判断逻辑,它是怎样进行验证的,要找出正确的验证码,我们来分别看一下。

然第一种就是更改程序的判断逻辑,也就是修改程序,修改程序呢,我们这里的就是他不是这里ec s e d s吗,我们先嗯先在这里下上断点,然后先直接运行一下,看一下结果是什么。

我们先把这个关了。

嗯我们重新开始调试。

因为我之前分析过,这样就不是从头开始分析,对大家有一定的干扰。

所以说现在重新把这个文件复制一下,然后我们打开这个刚复制的client这个文件,在这里进行一个分析,这样就是一个从头开始的分析吧,然后呢我们进入到content这个线程里面,然后查找文本。

在这里面下降站点,然后到相关这个前面两个判断处理下个断点,然后我们继续运行。

然后他会给我们弹出这个框,你程序运行到这里,需要注册信息的,我们这里随便输入123123。

然后呢,ok,我们看程序运行到这里,黑色的是程序正在运行的,那么他刚刚进行判断什么e4 x e d s,e c x呢是这个e d x,这他们明显是不相等,所以它不会进行跳转。

我们下一步要比较e d x和这个361t,e d s,那明显不能三天又要d,那这样就会弹出这个错误的一个框。

这个弹窗,这样就会到这个报错这里面,this is an inven,是不是,这有点卡了,把它关了,再重新,那我们刚才运行到这里呢,它是会报这个无效的注册码,所以这里我们可以尝试改一下它的这个命令。

修改程序写n e,然后点击汇编就填充,后面的也不要继续填充了,那么这里就改了,然后我们继续执行,发现他就进行了一个跳转,是不是他不再执行这个,不再报这个没有无效的验证码这个问题了。

我们继续执行直接f9 ,那现在就很棒,你已经注册成功了,说明我们只要改这个判定就可以注册成功。

也就是更改注册逻辑,当我们更改后呢,这是只是在我们o d里面进行改,同样的也需要进行一个保存,保存的方法就是在我们,这后面给大家写在我们文件当中,选择保存文件就可以了,这是一种方法。

然后呢第二种呢就是不更改程序判断逻辑的,控制一下时间,全是对象的事情嗯,那我们就是后面的,那就是不是给大家实操的,我们看一下课件就行了,我们加快一下进度,这是就是更改程序。

但是我现在还不知道他是怎么样验证注册码,是不是我直接改它的判定条件,相对于它本来是判定你就是一个无效的注册码,这是有效的一个注册,这是一种结局,破解程序的方法,第二种方法呢。

就是我把它的程序的判断逻辑弄清楚,这个其实难度更大一些,在很多时候更有效一些,因为很多时候没法改这个程序的一个代码,只能搞清楚它的一个运行逻辑,我们就可以啊,继续进,像在刚才的地方进行判定的地方,继续。

然后我们执行的时候呢也是继续调试嘛,然后输入我们这里呢给大家输入的是find me,123,然后注册码是123456,之前讲了,这逆向的时候,我们就要根据这个数据流跟踪数据流。

那么这个范的me 123和123456啊,就是我们需要跟踪的数据流,我们就要在内存中跟踪它,然后继续运行,运行呢我们在文本窗口中要进行一个搜索,搜索find me 123。

然后呢我们再出现find me,123的地方都向上断点,这是第五步吗,向上断点,然后下单点之后再继续执行,就那么在相当一点的地方就会暂停,是不是,暂停了,因为这些地方都会用到final b23 。

我们就看一下它怎么用到fb 3的,就是怎样用到我们输入的一个注册名,然后大家运气的话,就会在这个402461这个地方端下来,那这个地方是怎么用的注册名单,那还是用了这个函数,这个函数的作用。

就是从我们的窗口中获取注册名,所以这里面就是获取我们的fb e s,获取之后呢,他后面要进行一个计算,后面关计算的关键代码,就这一块还是怎么样进行计算的呢,就算关代码给大家摘出来。

它是首先要读取他把这个啊用户名注册码,他先把注册码传到一点x寄存器当中保存下来,然后呢把用户名就是ftp 123放在e4 x当中,然后计算它的值,那么e4 x当中呢,就是用户名字符串的一个长度。

然后呢他再取到这里是取bt就是取字节,取这个用户输入的用户名的第一个字节,我们这里是f,然后他对这个f这个字节进行一系列的计算,有这个相乘啊,左移啊,这些运算运算之后呢,就会得到一个注册码。

然后呢他将e c,所以这个时候e c x存的,就是根据用户名计算得到了一个注册码,那么e d x呢就是我们输入的一个注册码,他在比较这两个注册码是否相等,如果相等的话,那么我们输入的注册码就是有效的。

否则就是无效的,这就验证逻辑,所以这个时候我们只要从e4 x中读,去除这个注册码,然后我们再进行注册的时候,我们填的注册码,就是我们刚刚读取出来注册码就可以了。

然后我们从e4 s中我们输入final me 123,从ecs中读到的注册码是多少呢,是0x115 ,零cc要用5g cc,这是16进制,然后我们输入的值是十进制,因此呢,我们可以在计算机里面。

把这个16进制转换成一个十进制,1150cc它的十进制的就是1134796,所以这个时候,如果说你输入的用户名是方便面123的话,那么你对应的注册码就是这个1134796。

这样就知道你不管你输入什么别的用户名,你都都可以跟踪跟踪,在记录下这个时候e4 x的值,然后把这个值,寄存器的值以16进制形式转换成十进制形式,然后输入就可以注册成功,这里面给大家说几点,第一点了。

注册成功之后,会在我们本地产生一个ccd 950 ii的配置文件,如果说大家想重复进行测试的话,要删除这个配置文件,这个配置文件一般在c windows目录,或者是你用户名下面的一个这个目录当中。

在这讲目录当中都有可能就是你做过一遍,想重复做,你得把这个文件删除掉才行,要不然他说你已经注册过了,不然你再注册,第二个呢,我们就可以发现这个client 95呢是只用到了。

我们用后面的第一个字字符来进行计算的,所以说你只要用户面的第一个字符相同,它的注册码都是相同的,第二个呢这个程序是有隐藏后门的,因为在比较的时候比较了两个地方,一个是e比较两次嘛。

e4 s和e d s是否相等,第二个一dx和这个31361d,e c a是不是相等,这是一个隐藏的后门儿,所以说我们家要输入的验证码,是这个0x361 d e c a的十进制值,就是56745674。

那么你不管说什么用户名都是可以注册成功的,那么对于o d呢就给大家简单介绍这么多,这些实,这些实操呢,大家都可以去我们和天文实验室上做这个链接,也是发给大家的,就是在课程当中后面都会给大家的。

然后总结一下逆向分析的建议,就是首先大家要了解一个编码的风格,大家要有自己要有一些编码的经验,然后集中原则就是往往这个代码段是在一起,然后数据是在一块,然后代码复用就是一个人编写这个程序的时候。

会大量用到带相同的代码,他很多时候也会用到一些开源的代码,可以在github中进行搜索,然后七分力量三分差,我们的逆向之前说了,不是说能够有固定的公式推第一步就确定,第二步很多时候要根据经验要进行猜测。

那猜测之后呢,你要验证要运行一下验证,来测试你的猜测是否正确,还有就是第五点,区分代码,我们要区分哪些是这个开发者写的代码,哪些是使用的一个库函数等等,库函数就不要进去分析了,就啊库函数就直接在搜索。

在这里面搜索这块是什么作用,然后就是要有耐心,因为我们的立项都是比较复杂的,那么今天课程的主要内容就这么高啊,大家有什么疑问可以提出来,然后没有疑问就不耽误大家了,我们下课。

P98:CTF-PWN-栈溢出-栈环境集参数寄存器 - 网络安全就业推荐 - BV1Zu411s79i

今天呢就是你学习这个cctf胖嗯,今天内容呢就是分为三部分,主要上午会是分为三部分,下午是说要进行一个小测验,要做几道题,然后我们再讲一讲一下这几道题,下午的安排长,上午呢就是讲三部分。

一部分战役出的一些概念知识,然后呢就是胖的一些工具的使用,这i d昨天介绍过,主要还有另外两种工具,然后再就是两个例题,那我们看第一部分就是战役出的一些概念,我们说的我们说的这个胖呢。

就是其实是一个本来是一个谜语,但是现在也是一个规范用法了,就是在cctf比赛中代表溢出类的题目,主要考研都全对漏洞利用能力,所以溢出呢这里还先给大家讲,看一下后面的一个图,然后大家更好地理解这个溢出。

所以溢出呢就是说本来我给这个输入,或者是我给啊一个一段参数啊,不管是什么,我给他分配一段空间,它本来是应该在0x80 ,就是800h那个就是16进制吧,本来是应该在这个空间内活动的。

但是你现在输入的数据太多了,超过打开分配的空间,他就把别人的空间给挤占了,比如下面的是一个占地的一个地址,在下面是一个返回函数的,它函数返回的一个地址,那你如果说输入的数据太多了,就叫溢出了。

超出它原有范,然后把下面的占地址给占了,那么这几个程序就会报错,那如果说你不想让它报错,那你就可以设计这个输入,你使它超出的部分是你所构造的一个配套的,你构造的一个地址。

那么它就会它本来是返回到一个正常的函数,它就会返回到你所指定的一个位置,那么就造成了一个漏洞的利用,这是溢出,然后胖呢就是就是考察这个溢出类的题目,这里一些相关的概念就是站环境。

因为我们的溢出主要是站那堆,就在这这里面,溢出的,战争呢就是说为每一个函数维护的一个占空间,因为一个函数它要有一个输入,这个输入呢是放在这个战争里面的,它是会局部变量开辟的临时工业。

我这个函数你写完之后返回的时候,那么我这个函数的战争,我这个函数的站环境也就清除了,那么这个占空间是有两个寄存器维护的,就是r b p r s p这64位的,32位的就是e b p e s p。

昨天也介绍过这个计算器这个而bp的b就是base,它是栈底,它是个基数,然后s呢就是占地,战警的机制,这里还给大家提到一个题,说一下这个r i p寄存器ip的,就是存放着下一条要运行的指令的地址。

那么我们进行溢出利用的时候,实际上就要想方法,能够把我们下一条要运行的指令,修改成我们想要执行的指令,而不是他程序原本正常执行的一个指令,就通过溢出来改变这个ip的值。

然后这还有一个参数寄存器给大家说一下,就是函数在传参数的时候是用了什么寄存器,比如说我们有个read函数,就是读还有三个参数,它第一个参数就会放在r d i g存器里面,九零这个零是代表标准输入。

就是我们linux里面0121是标准输出,二是error,标准输入就是从我们的命令行输入。

你你在这这里输入这标准。

输入,然后第二个他第二个参数呢就是一个地址,是放在rsi这个计算机相中地址,就说那我读读数据,这个数据的地址是放在哪,我从哪获取这个数据,然后第三个第三个参数放在r d x里面,这里是0x80 。

接着说我读取数据是读多少个数据,如果有第四个参数的话,就放在r c x里面,第五个是r8 r9 ,然后在后面第六个之后的第七个,第八个就要放到站里面了,而32位的寄存器的。

32位的函数呢是直接放在栈里面的,这是他们的一个区别,我们后面会在啊举个例子实操一下。

看它的参数怎么传递的。

P99:栈溢出-汇编指令及字节序 - 网络安全就业推荐 - BV1Zu411s79i

然后一些常见的汇编指令,因为我们这是一个易胖嘛。

溢溢出主要是涉及到一些站的操作,函数调用的一些操作,比如说push push就是入站,普奇一呢就是将一个数据压入栈中,它一个入站是什么意思呢。

我们看后面的后面的一个站的图,这就是一个站,这是战地一dp 4664位,就是r b p就是战机,就是战地,我通过我怎么访问里面的数据,我通过暂停,这下面是一个高地址,上面是一个低地址,那我是站站停。

也就是esp,我再继续往下加,继续往下加,就一个访问下面的地址,那我要入账怎么办呢,我现在e s p这里是存在暂停的地址,我就把数据铺起一把。

数据一存在这个e s p这里,然后e s p的位置在上上走两走。

32位是四字节。

然后64位的话就是八字节,那么这,所以往上走上面是小地址,所以说要先要把这个esp的值减去八,然后这个再把这个一放进来,这个括号一,这个r sp呢就是你直接上i s b,就是i s p里面的值。

它里面值那是一个地址。

i s p本身是一个寄存器,暂停存着栈顶地址的一个寄存器。

那么你外面打上括号的就是这个地址处的值,一个是这是地址。

这是指,然后pop就是与这个push相反,就是出站就是从站里面取数据。

这是存这是取,那取数据呢,pop我把数据取到哪里去,取到r d i当中去,那么因为站他只能从站点出入数据,所以输入是把栈顶的值不是他的地址,把站点的值给放在rdi 7存器当中,然后栈顶的值呢。

这个站点它的存在地址就是加八,只有四级节和加八就向下移动八个字节,下面是高低,是刚才的那个图。

这是top和入push的入站出站,然后call呢是一个函数调用,我们将要call什么function cosystem,跨界调用一个函数,他要进行的实际上的操作呢,就是相当于结合我们前面的。

就相当于这两个操作,首先我扩一个函数,然后下面还有一条成本,它本来是执行完这个括号指令,要执行下一条指令,所以我把下一条指令r i p的值ip就存储了,下一条指令,把这个值我先保存下来。

因为你现在快一个函数就不是这样,直接到下一步指令了,是要进入这个函数内部执行的,所以我先把下一条指令值保存起来,保存到这个站中,这是我当前函数的展,它每个函数有一个自己的战环境。

然后我在jp到你call函数这个地址上去,在你这个子函数里面,相当于再继续的执行,执行完之后,最后return我怎么返回出来呢,就是因为我之前已经保存了,我括号下面这条命令的地址。

所以我后面你括号的这个函数执行完之后,我还是能够返回的,返回到你括号下面这条指令,我继续执行,这就是一个函数执行结束,然后逆过来也是一个,他是离开这个函数,他离开这个函数呢,它这个操作是什么。

他是把这个站给删除了,不就是r s p是站顶的值,占顶的地址,我把站点的地址移到站点,就相当于把这个站给清除了。

rt也是发挥他,不过他没有清楚站的操作。

然后我们还要这里面还要用到一个就是字节序,就是我们在构造paut的时候,需要用到这里是地址相关的,就在测试计算机领域当中呢,电脑内存或数据据通信电路中,它字节的一个排排列顺序有一个大单曲。

big和小单序之分,他们俩就正好相反的大,但是呢是向数据的第一位,次线就是我们通俗你这个位是低位,然后十位百位是高位,低位字节放在内存的高地址处,高位字节放在低地址处。

别看它比二和,实际上它是比较好理解的,我们先看这一个,比如说有个16进制数据,这是16进制数据,d e a d b e e f。

这都是16进制的,他每一个一个16进制就是二的四次方,所以每个是占四比特,然后两个就d是四比特,然后d e呢就巴比特一字节,所以它是四个字节,就是每一个字节啊。

计算机是按照字节存储的,我们都说我们这个单位都是字节。

低位字节,高位字节,这里呢就相当于我们通常里的个位十位。

百位千位啊,就是通知你它的第一位字节呢,就要放在地址的高处,这是地址的内存增长方向,右边是高,左边是地址的第一处,低位磁铁放在高处,高位次点放在基础,所以它在内存中呢是这样存储。

就d e a d b e b e f。

这是比较符合人类习惯的,然后小端序是正好有它相反,将数据的低位字节放在内存的dd。

指出高位放在高利润低位之间,各位放在内存的低地之中,十位高低入手,然后最高位放在内存最高的地方,所以这么看起来是与我们的阅读习惯是相反的。

嗯但是也不知道什么原因,反正这个小团子也是在这个程序里面。

用的是很多的。

这是一个字节需要高点后面,所以我们后面在构造配note的时候,需要注意这个顺序,要不然的话你就你直接这样的话。

就是它有两种解释嘛。

posted @ 2024-09-29 12:59  绝不原创的飞龙  阅读(1)  评论(0编辑  收藏  举报