0day 安全笔记

调用方式之间的差异

Csyscallstdcallbasicfortranpascal
参数入栈顺序右 => 左右 => 左右 => 左左 => 右左 => 右左 => 右
恢复平栈衡的位置调用者被调用者被调用者被调用者被调用者被调用者

函数调用约定

调用约定的声明参数入栈顺序恢复平栈衡的位置
__cdecl右 => 左调用者
__fastcall右 => 左被调用者
__stdcall右 => 左被调用者

常用跳转指令与机器码的对应关系

机器码(十六进制)对应的跳转指令机器码(十六进制)对应的跳转指令
FF E0JMP EAXFF D0CALL EAX
FF E1JMP ECXFF D1CALL ECX
FF E2JMP EDXFF D2CALL EDX
FF E3JMP EBXFF D3CALL EBX
FF E4JMP ESPFF D4CALL ESP
FF E5JMP EBPFF D5CALL EBP
FF E6JMP ESIFF D6CALL ESI
FF E7JMP EDIFF D7CALL EDI

Windows API 地址定位

Win 32:
  1. 首先通过段选择字 FS 在内存中找到当前的线程环境块 TEB;
  2. 线程环境块偏移位置为 0x30 的地方存放着指向进程环境块 PEB 的指针;
  3. 进程环境块中偏移位置为 0x0C 的地方存放着指向 PEB_LDR_DATA 结构体的指针,其中,存放着已经被进程装载的动态链接库的信息;
  4. PEB_LDR_DATA 结构体偏移位置为 0x1C 的地方存放着指向模块初始化链表的头指针 InInitializationOrderModuleList;
  5. 模块初始化链表 InInitializationOrderModuleList 中按顺序存放着 PE 装入运行时初始化模块的信息,第一个链表结点是 ntdll.dll,第二个链表结点就是 kernel32.dll;
  6. 找到属于 kernel32.dll 的结点后,在其基础上再偏移 0x08 就是 kernel32.dll 在内存中的加载基地址;
  7. 从 kernel32.dll 的加载基址算起,偏移 0x3C 的地方就是其 PE 头;
  8. PE 头偏移 0x78 的地方存放着指向函数导出表的指针;
  9. 至此,我们可以按如下方式在函数导出表中算出所需函数的入口地址。
  • 导出表偏移 0x1C 处的指针指向存储导出函数偏移地址(RVA)的列表;
  • 导出表偏移 0x20 处的指针指向存储导出函数函数名的列表;
  • 函数的 RVA 地址和名字按照顺序存放在上述两个列表中,我们可以在名称列表中定位到所需的函数是第几个,然后在地址列表中找到对应的 RVA;
  • 获得 RVA 后,再加上前边已经得到的动态链接库的加载基址,就获得了所需 API 此刻在内存中的虚拟地址,这个地址就是我们最终在 shellcode 中调用时需要的地址。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值