逆向实践之Modern Binary Exploitation实验lab1

./lab1C

比较简单,只是做了一个比较,关键地方得到数据就好:


./lab1B

可以在调试中发现字符串的两个,操作很简单,只是一个异或

s1 = Q}|u`sfg~sf{}|a3

s2 = Congratulations!

mov    eax,DWORD PTR [ebp+0x8]

xor    eax,edx

由于只使用同一个数字进行异或,使用其中任何一个进行异或即可。


./lab1A

重要函数:

strcspn(char *str1,char *str2) 返回在str1中这个匹配相等的字符的索引值,是一个整数值。 

ptrace(PTRACE_SINGLESTEP, …)提供了一种使父进程得以监视和控制其它进程的方式,它还能够改变子进程中的寄存器和内核映像,因而可以实现断点调试和系统调用的跟踪。 

在Linux中,ptrace是”Process Trace”的缩写。有了它,你就可以控制另一个进程,并且改变执行状态,调试器经常使用ptrace,只能使用一次ptrace[PTRACE_TRACEME]。因此如果调试器在这之前使用ptrace,那么我们的调用就会返回false。

当strcspn的参数str2=‘\n’时候该函数的功能相当于strlen的效果,很多时候一些程序采用识别‘\n'与’ ‘来判断字符串的结尾,同时去除空格与换行符分割的部分。

ptrace在本程序中功能在于设置反调试,不属于程序的输入影响的部分,所以在我们进行gdb调试的时候可以设置参数来跳过。(也可以找到之后函数的验证点,对验证点下断,就绕过了 ptrace() 反调试)

程序中来解决验证的主体部分是auth函数,传入的参数是我们输入的名字和数字:


在IDA中看到的样子是这样的:


当上图中的eax为0的时候就能跳转到下图中执行system函数(这样的参数传递也是pwn中的shellcode一种形式)


使用gdb调试,进入auth函数中,在经过识别字符串长度之后进行判断是不是长度要求:


更具跳转情况,发现strlen != 5。

继续执行却发现出现报错,进入ptrace后鉴定是调试状态后,进行保护:


手动修改eax的值让程序跳转到成功  set $eax=1。跳转之后需要进行一个很长的变换,具体是给每一位字符与一个数值进行无符号乘,有符号乘,异或等,具体内容如果愿意分析可以自己计算,注意mul与imul的差别。


这里省去一部分工作,采用在关键地方下断点,由于eax就是我们输入的值,在此时查看res的值(res就是我们输入的name做以上运算得到的结果)。


在下一次运行时采用对应的数字就可以得到shell:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容