标签: callstack

推入全栈 8086 组件

令人惊讶的是,PUSH 到完整堆栈的物理结果是什么当为堆栈仅分配 2 个字节 [1 个字] 并 PUSH 三个字,然后将它们弹出到不同的寄存器中时,它完成时没有任何错误当 PUSHing 时,我能说一下堆栈内容吗第二项

这是堆栈段定义:

Stack_segment_name segment para stack
db 2 dup(0) ;define your stack segment
Stack_segment_name ends
Run Code Online (Sandbox Code Playgroud)

这是代码:

Code_segment_name segment
Main_prog PROC FAR

assume     SS:Stack_segment_name,CS:Code_segment_name,DS:Data_segment_name,ES:Data_segment_name

MOV AX,Data_segment_name ; load the starting address of the data
MOV DS,AX ; segment into DS reg.

MOV AX,1715H
MOV BX,1518H
MOV CX,2944H
PUSH AX
PUSH BX
PUSH CX
POP SI 
POP DI  
POP DX



MOV AH,4CH
INT 21H


Main_prog endp
Code_segment_name ends
    end Main_prog
Run Code Online (Sandbox Code Playgroud)

执行代码后:

SI=2944H …
Run Code Online (Sandbox Code Playgroud)

assembly callstack x86-16

2
推荐指数
1
解决办法
2583
查看次数

在 python 中检查堆栈中的局部变量

我编写了一个小函数,它在堆栈中查找一级并查看其中是否有变量。但是我如何将这个函数变成一个可以在堆栈中一直查找直到找到一个局部变量并购买某个特定名称的函数?

import inspect
def variable_lookup(variable):
    parent_locals = inspect.currentframe().f_back.f_locals
    if variable in parent_locals.keys():
        return parent_locals[variable]
Run Code Online (Sandbox Code Playgroud)

我想要的是一个会循环的东西,直到它遍历所有堆栈,试图找到变量。我如何使用检查来做到这一点?有更容易的方法吗?

我从这里开始,但是 f_back 不返回框架对象,所以我不知道从这里去哪里:

import inspect
def variable_lookup(variable):
previous_frame = inspect.currentframe().f_back
while True:
    print(variable in previous_frame.f_locals.keys())
    previous_frame = inspect.getframeinfo(previous_frame)
Run Code Online (Sandbox Code Playgroud)

所以该代码失败了AttributeError: 'Traceback' object has no attribute 'f_locals'

python callstack scope

2
推荐指数
1
解决办法
1437
查看次数

使用 Canary 值的堆栈损坏检测

我正在阅读一本教科书,它描述了能够检测堆栈何时损坏的防御。书中说:

最新版本的 gcc 在生成的代码中加入了一种称为堆栈保护器的机制,以检测缓冲区溢出。这个想法是在任何本地缓冲区和堆栈状态的其余部分之间的堆栈帧中存储一个特殊的金丝雀值,如下图所示: 在此处输入图片说明

这个 canary 值,也称为 aguard 值,在程序每次运行时随机生成,因此攻击者没有简单的方法来确定它是什么。在恢复寄存器状态并从函数返回之前,程序检查金丝雀是否已被此函数的某些操作或它调用的某个操作更改。如果是这样,程序会因错误而中止。

我明白了,但我仍然认为这个设计存在缺陷。是的,攻击者可能无法确定 canary 的值是多少,但攻击者知道 canary 的大小(8 字节),因此攻击者可以操纵指针绕过 canary 所在的堆栈中的这 8 字节区域,然后覆盖返回地址,所以金丝雀实际上什么都不保护,我的理解是否正确?

c stack callstack x86-64 buffer-overflow

2
推荐指数
1
解决办法
781
查看次数

为什么调用堆栈不显示以前的调用?

在我的 VS2022 C++ 项目中,一段时间后出现问题。因为错误仅在 10 分钟后发生,所以我需要检查调用堆栈以查看错误发生之前发生了什么。

但是,调用堆栈太小。

它只是显示了这一点:

在此输入图像描述

我已经手动设置断点来跟踪它,所以我知道在“ProcessTxtLine”之前有几个我自己的函数(显示在调用堆栈中),但在调用堆栈中它们不存在。所以我无法双击它们来快速到达那里。

因为我不知道还有什么可能是重要的,所以我发布了整个 VS 2022 窗口的屏幕截图。

谢谢。

在此输入图像描述

编辑:

根据建议,我单击了第一个条目,然后选择了“加载符号”。

然而,这并没有帮助。它确实显示了更多,但仍然不是“我的”呼叫。

在此输入图像描述

c++ callstack visual-studio-2022

2
推荐指数
1
解决办法
354
查看次数

覆盖PUSH和POP指令的x86 SS段(SS:SP,SS:ESP,SS:RSP)

我需要解释/模拟x86指令的PUSH和POP系列。

我目前的问题是:

可以push和pop指令接受段重载前缀,这样我可以推或弹出来ES:SPCS:SPDS:SPFS:SPGS:SP代替 SS:SP

x86 assembly callstack

1
推荐指数
1
解决办法
835
查看次数

有没有必要让堆栈可执行?

拥有调用堆栈允许代码执行多年来一直是许多安全问题的根源.堆栈缓冲区溢出可用于利用编写错误的软件,其中可以执行存储在堆栈缓冲区中的代码.

我只是想知道是否真的有一个原因,它不仅仅是不可执行的?为什么调用堆栈上的任何内容都需要可执行?

也许有一些历史原因

security callstack buffer-overflow

1
推荐指数
1
解决办法
59
查看次数

随时从EurekaLog获取调用堆栈

关于获取异常处理的调用堆栈有很多关于获取调用堆栈的帖子,我们有EurekaLog来处理它,但是我真的希望能够在运行时的任何时候获取堆栈,就像你在断点中放置一个断点一样. IDE.

遗留代码中某处的事件导致执行的函数正在执行它不应该执行的操作.虽然我们可以从调试输出中看到函数的名称,但是如果没有堆栈跟踪,我们无法分辨实际调用它的是什么.这不是一个例外,我们不想在该函数中引发异常,因此EurekaLog可以触发.

有没有办法获得调用堆栈没有任何异常?

delphi callstack delphi-xe2 eurekalog

1
推荐指数
1
解决办法
955
查看次数

为什么这会导致最大的调用堆栈错误?

我有一个由此代码块触发的最大调用堆栈错误:

$(".resume_box").click(function () {
   $("#resume_upload").trigger("click");
});
Run Code Online (Sandbox Code Playgroud)

这是它引用的HTML:

<div class="resume_box">
   <div class="file_instructions"> Please use .pdf format</div>
   <div class="button_plate">Choose a file</div>
   <input id = "resume_upload" type = "file" name = "resume" style = "display: none" />
</div>
Run Code Online (Sandbox Code Playgroud)

我已经检查过,JS文件或具有相同名称,类或ID的HTML文件中没有其他内容.这是堆栈的样子:

trigger @   jquery.min.js:4
(anonymous) @   jquery.min.js:4
each    @   jquery.min.js:2
each    @   jquery.min.js:2
trigger @   jquery.min.js:4
(anonymous) @   script.js:70
dispatch    @   jquery.min.js:3
r.handle    @   jquery.min.js:3
trigger @   jquery.min.js:4
(anonymous) @   jquery.min.js:4
each    @   jquery.min.js:2
each    @   jquery.min.js:2
trigger @   jquery.min.js:4
(anonymous) @   script.js:70
Run Code Online (Sandbox Code Playgroud)

重复最后8行,直到超过堆栈大小.

javascript jquery callstack

1
推荐指数
1
解决办法
581
查看次数

R:理解省略号(...)在嵌套函数中的工作方式,以及iit如何不工作

这就是我一直认为省略号在嵌套函数中工作的方式:当你通过省略号将一组参数传递给一个函数时,调用堆栈上它的任何辅助函数都可以得到那些参数 - 我想,通过它自己的省略号.我相信参数传递给省略号累积,因此最里面的省略号包含在调用堆栈中优于它的任何函数中通过省略号参数传递的所有参数.

但我刚做了一个实验来证实这一点,现在看来我错了.从而:

> f02 <- function(...){
+   vv <- list(...)
+   print(vv)
+ }
> f01 <- function(...){
+   f02(b = 2)
+ }
> f01(a=1)
$`b`
[1] 2
Run Code Online (Sandbox Code Playgroud)

这里的内部省略号似乎没有a=1从外部省略号继承参数.

所以我目前的理论是,当你把它请求的内容的动作,如list(…),match.call(expand.dots=TRUE)或者as.list(substitute(list(...)))[-1],你只能得到的第一个实例中遇到的是,基于在正常的范围规则搜索路径上.但我不得不说,这对我来说似乎不太可能.如果确实如此,那么,例如,如果其中一个中间函数具有参数,则提供给绘图函数的几个调用的图形参数将遭受神秘的失败.

所以我想知道是否有一些特殊的规则来确定点点阵中寻找的范围,比如寻找一个优越的实例,如果本地一个是空的,或者如果你寻找一个特定的命名参数,比如说list(...)$my_parameter,做找不到它.这些解决方案都没有让我觉得非常合理,但是,我没有想到的那些解决方案.

以前关于这个主题的问题似乎主要集中在各种边缘案例上.我正在寻找更多理解正常情况下的传递规则(但可能有多层调用).

callstack r parameter-passing

1
推荐指数
1
解决办法
120
查看次数

为什么使用ebp比esp寄存器更好地在堆栈上定位参数?

我是MASM的新手.我对这些指针寄存器感到困惑.如果你们帮帮我,我真的很感激.

谢谢

x86 assembly callstack cpu-architecture masm32

1
推荐指数
1
解决办法
149
查看次数