【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)

shellcode初步优化

  • 通过跳板指令定位shellcode
    • 极其简化版shellcode_存在问题:
    • ```解析(重要)```
      • 第一个问题 程序随机基址无法确定跳转shellcode位置
      • 第二个问题 程序未正常退出

通过跳板指令定位shellcode

【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)_第1张图片

极其简化版shellcode_存在问题:

  • 1、利用x32dbg_工具查找的栈中shellcode起始地址,用该地址淹没返回地址,这个地址会经常发生变化,须找到一个能动态定位到shellcode_起始地址的办法。
  • 2、程序未正常退出。

Ret指令执行之后 esp==shellcode首地址
Jmp esp
跳板(即溢出ret位置)

解析(重要)

第一个问题 程序随机基址无法确定跳转shellcode位置

我们之前写的程序一个问题就是,他最后ret跳转的返回地址是一个固定的地址,而我们经过学习也知道,一个程序他每次写入内存的位置都不太一样,而我们上次的程序之所以能够写固定地址是因为我们在编译器中关闭了随机基址让其每次加载都在固定的地址才能实现目的地址的跳转,那我们正常的条件下如何进行跳转呢?
我们都知道,在最后淹没地址时换成我们要跳转的地址他就会跳到那里,我们之前也是利用这个跳到了shellcode中,其实我们也可以发现,我们之前的返回地址就是返回地址下面的栈地址存放的shellcode语句,将其执行造成shellcode执行。在函数中执行完ret他会做两个操作,pop EIP和ESP++,也就是说执行ret其实就是将我们要执行的代码指针指向了esp,那我们换个思路,只要ret后让执行命令的指针跳转到我们的esp就可以了,那我们就需要找到一个命令jmp esp,且他有固定地址,并不在进程内,而是一直在系统计算机内存中。即0x7xxxxxxx类的地址
【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)_第2张图片
进入我们程序中,右键->搜索->所有模块->命令,搜索jmp esp指令。
【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)_第3张图片
挑一个jmp esp指令的地址。在010editor中修改跳转地址。
【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)_第4张图片
【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)_第5张图片
因为开机后MessageBoxA函数地址不一定还在那个位置所以我们要修改shellcode并重新写入。
【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)_第6张图片
我们可以看到弹窗成功
【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)_第7张图片

第二个问题 程序未正常退出

00在机器码中代表截断 所以我们尽量不要在程序中出现00,修改我们的shellcode让程序正常退出
【免杀前置课——shellcode】二十一、shellcode初步优化——通过跳板指令定位shellcode,解决程序随机基址无法跳转shellcode问题(详解)_第8张图片

你可能感兴趣的:(免杀前置课,漏洞复现,windows,microsoft,安全,c++)