unsigned long find_start(void){
__asm__("movq %rsp, %rax");
}
int main(){
printf ("OX%x\n" , find_start()) ;
}
Run Code Online (Sandbox Code Playgroud)
这是我上一个问题的另一个问题,
每次运行程序时输出都不同。
linux中栈的起始地址不是固定的吗?
内核版本为2.6.18-194.el5
评论更新:我现在正在尝试进行 hello world 漏洞利用,如何克服这个问题? execve 创建的进程是否会使用与其父进程相同的堆栈起始地址?
我被分配到编写一个使用堆栈计算后缀表达式的程序。
我编写了该程序,它似乎在大部分情况下都能正常工作,但是在确定表达式是否有效时遇到了问题。
以下是我所做的基本步骤:
因此,如果堆栈已经是空的,那么上面的方法效果很好,但是如果堆栈上有更多的操作数,结果就会简单地打印出来。这显然是不正确的,因为如果堆栈上还有多个操作数,它应该是一个无效的表达式。
我在想我应该做一个while(!stack.empty()) result = stack.top, stack.pop()但是,这仍然会有同样的问题。
有人可以告诉我应该如何正确测试它吗?
代码:
int main()
{
string expression;
char response;
int result = -1; //result of expression. Initialized to -1
Stack stack;
printMenu();
do {
cout << "Would you like to enter an expression? (y / n)" << endl;
cin >> response;
response = toupper(response);
switch(response)
{
case 'Y':
//needed due to …Run Code Online (Sandbox Code Playgroud) 所以这是我计划的一部分。当我为差值超过 250000 的数字调用 bound 时,它会导致堆栈溢出.. 我该如何解决这个问题?该程序适用于较小的输入。我很确定程序的其余部分都很好。有没有办法重写函数以便它们工作?我宁愿不使用 for while 循环。谢谢
let rec sqdigits a =
if a = 0 then 0
else ( a mod 10)*( a mod 10) + sqdigits (a/10);;
let rec bound c d =
if c>d then []
else (sqdigits (c))::(bound (c+1) d);;
Run Code Online (Sandbox Code Playgroud) 我正在学习 x86 汇编。我试图了解“退出程序”如何在 x86 上工作。我们有一个代码:
push ebp
mov ebp,esp
//Some stuff here
mov esp, ebp
pop ebp
ret
Run Code Online (Sandbox Code Playgroud)
当处理器执行指令“ret”时:
EIP 将具有从堆栈中弹出的值,即 0。因此处理器将转到 0 地址并尝试执行不包含程序代码/可执行代码的指令。那么,处理器到底发生了什么?是否有条件检查,例如,if EIP = 0 -> exit program? Or if ESP out of bounds -> exit program?`处理器如何理解这条 RET 指令是程序的结尾?
我想打印字符堆栈的所有元素。这是我的功能:
void print_stack(stack<char> c)
{
stack<char> a = c;
for (unsigned int i = 0; i < a.size(); i++) {
std::cout<<a.top();
a.pop();
}
}
Run Code Online (Sandbox Code Playgroud)
目前,它只打印第一个a.size() - 1元素而不是最后一个元素。我很难弄清楚为什么会这样。
int main() {
long long int n, m, j, l, a[1000000000][1000000000];
int k, i;
scanf("%lld", & n);
scanf("%lld", & m);
for (j = 0; j < n; j++) {
for (l = 0; l < m; l++) {
a[j][l] = 0;
printf("%d\n", a[j][l]);
}
}
for (j = 0; j < n; j++) {
for (l = 0; l < m; l++) {
printf("%d\n", a[j][l]);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我总是遇到运行时错误。有人可以建议我解决它吗???我需要这个来解决一个竞争性编程问题,其中棋盘可能有 1000000000*1000000000 个方格,我需要用它执行多项操作。
如果我们在C中有一个带有简单的单位化ìnt变量的函数,我们就知道这个变量可能并不总是初始化为零.相反,它可能包含一些"垃圾"值.
我的问题是:究竟什么能代表这个价值?它可能是由之前终止的进程留下的一些信息(未同步的内存)?
如果是,那么这不是一个极其严重的安全漏洞吗?因为以这种方式,任何进程都可以读取使用与当前进程相同的地址空间的进程留下的信息(密码,令牌等).
我的假设是,对于每个新进程,内核将为该新进程分配的内存(至少对于堆栈)归零,然后将可执行文件加载到内存中.那些"垃圾"值实际上值由所产生的加载过程的的当前进程(使得没有办法来访问从使用相同的地址空间的其他进程的任何左数据).
我正在与一些研究员讨论这个话题,我真的想要一个清晰而全面的答案(我确信有一个).我们假设内核是基于debian/centos的.很高兴知道不同内核/ OS-es的行为是否存在差异.
谢谢你.
标题.我正在使用的功能是这样的:
void GetVideoCardInfo(int* memoryVar, char* cardName)
{
strcpy_s(cardName, 128, m_videoCardDescription);
*memoryVar = m_videoCardMemory;
return;
}
Run Code Online (Sandbox Code Playgroud)
m_videoCardDescription是一个'128个字符长的'字符数组,其中包含我的视频卡的描述.这是我调用函数的地方:
bool writeGPUnameDesc() {
char cardDesc;
int cardMem;
m_D3D->GetVideoCardInfo(&cardMem, &cardDesc);
std::ofstream myfile;
myfile.open("gpuNameAndDesc.txt");
myfile << "Graphics card name: " << cardDesc;
myfile << " - Graphics card memory: " << cardMem;
myfile.close();
return true;
}
Run Code Online (Sandbox Code Playgroud)
当我运行该程序时,会弹出一个消息框,显示运行时检查失败#2和标题.如果有人可以提前帮助谢谢.
我使用switch创建了一个堆栈程序,但它似乎无法正常工作.它继续迭代推送方法.它甚至没有退出该计划.
global a
a=[]
def push():
push_no=int(input("Enter number you want to push"))
a.append(push_no)
def pop():
poped_item=a.pop()
print("Poped item {}".format(poped_item))
def display():
print(a)
def numbers_to_strings(a1):
switcher = {
1: push(),
2: pop(),
3: display(),
4: quit()
}
return switcher.get(a1, "nothing")
# Driver program
if __name__ == "__main__":
while True:
a1=int(input("ENTER WHICH OPERATION YOU WANT OT PERFORM 1-Push, 2-POP, 3-Display 4-quit"))
numbers_to_strings(a1)
Run Code Online (Sandbox Code Playgroud)