首页
社区
课程
招聘
未解决 问下各位前辈,下列哪个是X64汇编的平衡堆栈?他们的区别是什么?
发表于: 2023-11-23 03:15 2546

未解决 问下各位前辈,下列哪个是X64汇编的平衡堆栈?他们的区别是什么?

2023-11-23 03:15
2546

如题我在几种软件中发现远程调用CALL 他们分别执行了以下头尾部汇编代码,估计都是为了平衡堆栈
请问哪个才是正确的 平衡堆栈写法?
1:
sub rsp,38
汇编代码
add rsp,38
ret
2:
push rbp
mov rbp,rsp
sub rsp,60
汇编代码
add rsp,60
pop rbp
ret
3:
sub rsp,48
xor rax, rsp
汇编代码
xor rax, rax
xor rcx, rsp
add rsp,48
ret
4:
pushfq
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
sub rsp , 0x20
汇编代码
add rsp , 0x20
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
popfq
5:
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
汇编代码
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx

其中我之前一直用的是5:
压入寄存器 然后HOOK完毕 弹出
远程MessageBoxA 这类CALL 直接可用

但是调用 需要sub rsp,这类汇编会直接崩溃 这是为啥?
一直没搞明白 还望各位前辈不吝指导!谢谢!


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (9)
雪    币: 776
活跃值: (3425)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
2

没有深入研究过。大概来说,四个参数以内的话,不会通过栈传递参数,而是通过rcx、rdx、r8、r9,超过四个参数才会需要栈传递。
而sub rsp,38、add rsp,38这些,应该是给函数内部的栈变量分配的空间或者栈对齐用的。
push、pop寄存器这些是你自己需要保存寄存器避免hook代码破坏,与栈平衡无关。
“调用 需要sub rsp,这类汇编会直接崩溃 ”这个可能是你sub之后,栈对齐有问题,如果不是16字节对齐,一些API调用可能就会崩,大多数是涉及到浮点指令的地方,调试一下就知道了。你可以尝试sub rsp的时候多减8看看是否能解决问题。

最后于 2023-11-23 08:56 被yeyeshun编辑 ,原因:
2023-11-23 08:56
1
雪    币: 73
活跃值: (719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
yeyeshun 没有深入研究过。大概来说,四个参数以内的话,不会通过栈传递参数,而是通过rcx、rdx、r8、r9,超过四个参数才会需要栈传递。而sub rsp,38、add rs ...
谢谢!崩溃原因就是非16字节问题
2023-11-23 12:43
0
雪    币: 1440
活跃值: (1350)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
4

sub rsp,38

汇编代码

add rsp,38

 就是平衡堆栈呀。


2. 加

push rbp
mov rbp,rsp


pop rbp

是创建堆帧。


3. 加

mov     rax, cs:__security_cookie

xor rax, rsp

mov     [rsp+xxxx], rax


mov     rcx, [rsp+xxxx]

xor     rcx, rsp

call    __security_check_cookie

是加栈溢出cookie检测用的



4、5. 一堆的push 和 pop 是在任意位置做 Inline Hook 用的 


pushfq

push rax

push rcx

push rdx

push rbx

push rbp

push rsi

push rdi

push r8

push r9

push r10

push r11

push r12

push r13

push r14

push r15

mov rcx, rsp ; 参数1 

push rsp  ; 保留一点空间,防止崩溃 

push rsp

push rsp

push rsp

mov  rax, xxxxxxxxxxxxx  ; 这里C语言函数地址丢进入就可以 void WINAPI Func(Context*);

call rax

pop rsp  ; 平衡之前的保留空间 

pop rsp

pop rsp

pop rsp

pop r15

pop r14

pop r13

pop r12

pop r11

pop r10

pop r9

pop r8

pop rdi

pop rsi

pop rbp

pop rbx

pop rdx

pop rcx

pop rax

popfq 

push rax   ; 往回走

mov rax, xxxxxxxx

xchg [esp], rax

ret


最后于 2023-11-23 16:33 被Black貓①呺编辑 ,原因:
2023-11-23 16:01
1
雪    币: 73
活跃值: (719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Black貓①呺 sub rsp,38汇编代码add rsp,38 就是平衡堆栈呀。2. 加push rbpmov rbp,rsppop rbp是创建堆帧。3. 加mov  & ...
谢谢大佬。  
2023-11-23 20:54
0
雪    币: 6106
活跃值: (5525)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
6
64位默认,4个参数确实是不用栈,不过他还是会给他分配栈空间,SUB RSP,ADDRSP这就是平栈了,具体是多少,得看整个函数中的调用什么的,他是一起分配空间的,如果里面的都是无参的,默认应该是SUB RSP,0X28,另外超过,4个参数时,还是会用栈的,具体的可以找些资料仔细看一看,64位的有些地方是简化了,有些地方,反而变的比较不方便了,差不太多,对了,这个sub rsp多少,还有一个对齐的问题
2023-11-23 21:26
1
雪    币: 73
活跃值: (719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
gamehack 64位默认,4个参数确实是不用栈,不过他还是会给他分配栈空间,SUB RSP,ADDRSP这就是平栈了,具体是多少,得看整个函数中的调用什么的,他是一起分配空间的,如果里面的都是无参的,默认应该是SU ...
谢谢  您的见解让我受益匪浅
2023-11-24 01:10
0
雪    币: 1440
活跃值: (1350)
能力值: ( LV3,RANK:23 )
在线值:
发帖
回帖
粉丝
8

是不是以为参数传递是(这里rsp指向返回地址):rcx, rdx, r8, r9, rsp+0x8, rsp+0x10 ?
不不不,实际上是:rcx, rdx, r8, r9, rsp+0x28, rsp+0x30。 栈中会留4个空间 rsp+0x8, rsp+0x10, rsp+0x18, rsp+0x20,为了在调用函数中把4个参数(rcx、rdx、r8、r9)存到里面用的,所以不管你调什么函数,多少参数,栈都多留 4 个空间问题少很多


上面的举例:

push rsp  ; 保留一点空间,防止崩溃 

push rsp

push rsp

push rsp

mov  rax, xxxxxxxxxxxxx  ; 这里C语言函数地址丢进入就可以 void WINAPI Func(Context*);

call rax

pop rsp  ; 平衡之前的保留空间 

pop rsp

pop rsp

pop rsp

那几个push pop就是为了多留4个参数空间以崩溃的

最后于 2023-11-24 12:30 被Black貓①呺编辑 ,原因:
2023-11-24 12:24
0
雪    币: 73
活跃值: (719)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Black貓①呺 是不是以为参数传递是(这里rsp指向返回地址):rcx, rdx, r8, r9, rsp+0x8, rsp+ ...

大佬  push rsp四个 是不是等于 sub rsp,8*4

最后于 2023-11-24 17:41 被陈枫hack编辑 ,原因:
2023-11-24 17:40
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
哪种都可以,只要保证 push + sub rsp 加起来的字节数是8字节的单数倍就行
2023-11-24 22:36
0
游客
登录 | 注册 方可回帖
返回
//