babysmc(未完成)没有调试出来但也只剩下最后一步了后续跟着大佬的wp来学习
我们直接上调试器,运行,然后随便输入一些数据
我直呼内行!
这代码段怎么还给整加密了,我细细一品,哦,这题的名字是smc(Slef Modify Code)
自己改自己代码,行。
搜字符串然后下断,跟一波
还是老规矩,把已知的call给打标签
往下走,到下一个call
我们发现,ecx寄存器不正是我们随便输入的flag的第一位吗???
第二个参数草率了,没细看,重新调试仔细看:
这就应该是我们缓冲区的最后面的一个字节或接近缓冲区最后一个字节的前x个字节,我这里长度不太够所以是0,我们看看这个call到底干了什么
我们到那个call, F7步入call
最先引人注目的是VirtualProtect,修改内存属性,这就很可疑了,怀疑这个call就是用来解密那段加密代码的。
我们看参数窗口,第一个就是目标地址,第二个是大小,第三个是属性,这里0x40就是PAGE_EXECUTE_READWRITE页可读可写可执行
第四个参数就是一个四字节类型的指针,它会把原来内存的保护通过这个参数返回回去。
透过这个API调用,我们大概就能推断出它要改那个地址的代码,
大小为0x100也就是256,记录它要解密的地址 0x901850
我们接着往下看
它循环把我们参数一(flag的第一位)与目标地址里的数据进行一个异或,解密代码。
由于我们压根不知道异或的那个key是啥,所以没解出来,没事,我们接着往下看
这次它把原来的内存属性给写回去了,是个好习惯
往下走,看看下面那个call是干啥
发现又是同样的解密,记录地址和大小 0x9017C0 大小为0x100
我们直接来解密这两段代码,打开VS新建项目
重新调试把原来的数据都给拿出来
但我们不知道密钥是什么,我这里的解决办法是有技巧的推测
因为x86的函数普遍都是push ebp开头,而push ebp的机器码为: 0x55, 所以,我们只要拿着第一个字节跟0x55异或一下,结果就是密钥了
好,我们写个for循环解密一下,看看密钥对不对
我们直接看shellcode的反汇编,这代码有模有样的,说明2就是它的密钥
我们再看看shellcode2的反汇编
同样有模有样,说明33(0x21)就是它的密钥
好,我们直接把数据WriteProcessMemory过去
编译出来要管理员身份运行
我们重新调试,让程序断在程序模块入口点,然后管理员运行刚刚写好的程序
转到那两个地址
焕然一新。
然后到输入密钥那块
截至目前,我们自己解密了两段代码,原来的解密函数肯定是不能要了
Nop掉
然后直接用
这个插件,我们把程序从内存中dump出来
直接点dump
存到硬盘里
然后上ida分析
哇,通透