无题
参考《x86_x64体系探索及编程》
《Intel 开发手册》
x64与x86指令架构的区别1.寄存器区别在x86中通用寄存器:
在x64中的通用寄存器:新增加了R8R15:64位(Rxx)、32位(RxxD)、16位(RxxW)、8位(RxxB)新增加的8位寄存器:spl,bpl,sil,dil新增加的9个128位的浮点寄存器:XMM0XMM8。多用于多媒体。x64位没有pushad/aq这些指令,因此x64想要保存堆栈只能依次PUSH来保存堆栈和寄存器环境。
2.地址差别x64中,线性地址中只有48位有效:0x0~0xFFFFFFFFFFFF
其中,0x0-0x700000000000是UserAddress(用户地址),而0x700000000000-0xFFFFFFFFFFFF是内核空间。
高16位必须要么全是0,要么全是1,这种形式的地址被称为canonical地址然而,在x64 体系里只实现了48.位的 virtual address,高 16 位被用做符号扩展。与canonical地址形式相对的是 non-canoncial地址形式,如下所示。在64位模式下non-c ...
无题
双机调试使用 vmware + windows 10 虚拟机 和 VirtualKD工具进行调试
在Github的Releases下载后:
得到如上内容,我们将 target64 放入虚拟机中。
以管理员身份运行它,点击Install->确定->确定..
它会帮我们禁用签名,最后windows重新启动,在启动的时候,我们按下F8 选择如下内容启动
启动后,我们在物理机(主机)上运行vmmon64.exe会得到如下内容,选择WinDbg Preview后点击Rundebugger
会自动建立一个通道:如下
稍等一会儿后我们点击Go -> 虚拟机就能开机了。
这个时候我们的双击调试就已经做好了。
双击调试基础操作使用一些简单的指令
内存相关1dq , dd , dw ,db
d:display 展示,陈列
q:qword -> 64位整数 d:dword w:word b:byte
dd 0xaddress:显示从 0xaddress 开始的 DWORD 数据。
dq esp:显示当前栈指针(ESP)处的 QWORD 数据。
dw 0x1 ...
无题
作业:返回一定要用iretd吗?可以使用retf吗?
构建陷阱门自己调用玩。
1.中断门:
eq 80b99500 0040ee00`00081000
123456789101112131415161718192021222324252627// homework.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"__declspec(naked) void test(){ __asm { int 3; retf 4; }}int _tmain(int argc, _TCHAR* argv[]){ __asm { push 0x12345678; //因为retf 会自动进行pop 所以就需要我们最开始的时候push一个值 int 32; push 0x3b; pop fs; } return 0;}
如果不进行push 的话就会直接蓝。。。
这样看retf 好像有可以?但是..如果我们调用一个函数,则会出现蓝屏。
1234567 ...
无题
回顾之前的知识,jmp 和ret retf 都不能通过调用门提权jmp :在调用门只能在同权限跳转ret:改变不了csretf:规定只能在同权限或者向低权限跳转【降权】call:是同权限或者向高权限进行跳转【提权】
iretd:和retf 一样只能降权,但是更jb麻烦。
中断门: idt
我们看到是int 3 是e 所以它的DPL == 3 三环下可以调用 0008 是段选择值,是找的GDT也就是:如下这个
看看int 3
调用int 3 FS会变成 30h,这些都是函数所定义的
测试:
1234567891011121314151617181920212223242526272829303132333435// IDT.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>void __declspec(naked) test(){ __asm { int 3; iretd; }}#pragma pack(1) ...
无题
1.裸函数
1234567void __declspec(naked) test(){ __asm { ret; }}
裸函数就是不让编译器进行自动填充的内容。每个函数之间都有间隔,如果裸函数中间不添加任何东西,就会报错。因为被调用的时候会跳到俩个函数之间的间隔:CC CC
2.段权限规则 代码段 数据段 堆栈
R0 :操作系统内核层,调度硬件资源管理
1环 2环:现在已经舍弃,但他们是接口层,执行体,操作系统服务层
3环:应用层
硬件资源就规划好了,段就是资源的划分,资源被划分也就是权限被划分了。CS段和SS段 这2个段的权限则可以说明,处于R0还是R3。所以在提权的时候,需要将CS和SS一起都改了。看权限的话,看一个即可。
DPL:Descriptor privilege level 描述权限等级
CPL:Current privilege level 当前权限等级
RPL:request privilege level,请求权限等级(可以乱给)
普通数据段下,RPL没有效果堆栈段 (SS) ...
无题
段寄存器
CS 代码段寄存器 描述的代码
SS 栈段 描述栈 比如:局部变量
DS 数据段 堆地址 全局变量
ES 扩展段 串 copy movsb so edi esi
FS 上下文环境 R3代码TEB , R0代表KPPCR
段和段之间不能之间进行操作
123// mov ds,cs; -->错误的mov ax,cs;mov ds,ax;
ds 和es 的值不论在什么情况下都是相等的。
段选择符:
RPL:请求访问权限
TI: 是表 取0和1查的不一样。 0->GDT 1->LDT
3-15字节是决定表上的某个描述符,索引号
选中16字节 -> 段描述符
数索引号太慢了:用段寄存器的值&F8 加上GDT表的base 就OK
段描述符
windbg :
r是看寄存器 r eax
r gdtr 可以看这张表的指向
d :查看内存 后面跟上单位:<byte word dword dqword> 在跟上地址 <通用限制符L> 【Limit】
L1就是一个 L2 就是两个
比如:dq 80b ...
无题
信号和插槽 signal and slots我们这里使用“Horizontal Slider” “Progress Bar”
在 Qt 框架中,Slot(槽)是一个特殊的函数,用于响应信号(Signal)的触发。Qt 的信号和槽机制是其事件处理系统的核心部分,允许对象之间进行通信,特别适用于 GUI 应用程序中的事件驱动设计。
可以在ui里面添加:
选择【编辑信号/槽F4】后选中
同理的可以用code替换:使用 connect函数.使用 disconnect来断开链接
无题
这是一个Reverse
TraceLineengine.dll 设置sehments 为0x0 这样就可以直接找到偏移了。
为了找到traceray 用字符串搜索
找到,并且交叉应用
改了名字后,使用classinformer插件,去获取vtable,这里我们看到cEngineTrace
当然你看cEngineTraceClioent也是一样的效果。不论是server还是client都是继承CEngineTrace。
去github商的sdk查看也是如此。