我找不到回答这个问题的好消息来源.我知道nop sled是一种用于避免缓冲区溢出攻击中的堆栈随机化的技术,但我无法理解它是如何工作的.
说明这种方法的简单例子是什么?
像128字节的nop雪橇这样的术语是什么意思?
C++
ATT大会
我试图理解以下两条指令的行为:
pushl %esp
Run Code Online (Sandbox Code Playgroud)
和:
popl %esp
Run Code Online (Sandbox Code Playgroud)
请注意,它们将计算出的值存储回来%esp.
我正在独立地考虑这些指令,而不是按顺序.我知道存储的值%esp总是递增/递减之前的值,但是我怎么能用汇编语言表示行为呢?这是我到目前为止所提出的:
推送:
movl %esp, %edx 1. save value of %esp
subl $4, %esp 2. decrement stack pointer
movl %edx, (%esp) 3. store old value of %esp on top of stack
Run Code Online (Sandbox Code Playgroud)
对于pop:
movl (%esp), %esp You wouldn’t need the increment portion.
Run Code Online (Sandbox Code Playgroud)
它是否正确?如果没有,我哪里错了?谢谢.
C++,ATT汇编
我有以下汇编代码:
push %ebp
mov %esp, %ebp
sub $0x28, %esp
(...)
Run Code Online (Sandbox Code Playgroud)
我的教科书声称通过从%esp中减去0x28(作为堆栈形成的一部分),12个字节被分配给变量.为什么从堆栈中减去十进制40分配12个字节?
C
说我有以下C模块:
模块1
#include <stdio.h>
int x;
int main(){
foo();
printf("%i\n",x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
模块2
double x;
void foo(){
x = 3.14;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:链接器在这种情况下做了什么?在我正在阅读的教科书中,它说编译器只为链接器符号表选择两个弱全局变量中的一个.选择这两个中的哪一个?或者都被选中了?如果是这样,为什么?谢谢.
使用AT&T汇编语法,我试图了解如何testl在汇编代码中使用.特别:
testl %edx, %edx
jle .L3
Run Code Online (Sandbox Code Playgroud)
我知道设置条件标志testl的位数and是否相同,但如果不比较两个值,我怎么能解释'如果小于或等于'则跳转?
周期性包容问题
我转发声明另一个标题中的一个类,试图解决它们的周期性包含.这是我的两个文件:
第一个文件(Parameter.h):
#pragma once
#include "Token.h"`
class Expression;
class Parameter {
public:
Parameter() {
string = new Token();
identifier = new Token();
expr = new Expression();
}
Token* string;
Token* identifier;
Expression* expr;
};
Run Code Online (Sandbox Code Playgroud)
第二个文件(Expression.h):
#pragma once
#include "Token.h"
#include "Parameter.h"
class Expression {
public:
Expression() {
param1 = new Parameter();
param2 = new Parameter();
op = new Token();
}
Expression(Parameter* p1, Token* o, Parameter* p2) {
param1 = p1;
param2 = p2;
op = …Run Code Online (Sandbox Code Playgroud) 我不确定以下两个关系是否适合联合:
R: <- schema name
B
1
2
2
3
3
Run Code Online (Sandbox Code Playgroud)
和:
Q: -< schema name
A B
5 1
6 1
4 2
3 4
Run Code Online (Sandbox Code Playgroud)
我想做工会:QU R。可以吗?结果如何?
C++
我有以下迭代循环:
for (it = container.begin(); it != container.end(); ++it) {
//my code here
}
Run Code Online (Sandbox Code Playgroud)
我想尽早结束这个迭代1元素.我尝试了以下但它不编译:
for (it = container.begin(); it != container.end() - 1; ++it) { //subtract 1
//my code here
}
Run Code Online (Sandbox Code Playgroud)
如何才能做到这一点?谢谢.
IA32至Y86
ATT大会
我有以下IA32汇编代码:
Bubble:
.LFB0:
pushl %esi
pushl %ebx
movl 16(%esp), %esi
movl 12(%esp), %edx
subl $1, %esi
andl %esi, %esi
jle .L1
.L7:
xorl %eax, %eax
.L5:
movl 4(%edx,%eax,4), %ecx
movl (%edx,%eax,4), %ebx
cmpl %ebx, %ecx
jge .L4
movl %ebx, 4(%edx,%eax,4)
movl %ecx, (%edx,%eax,4)
.L4:
addl $1, %eax
cmpl %eax, %esi
jg .L5
subl $1, %esi
jne .L7
.L1:
popl %ebx
popl %esi
ret
Run Code Online (Sandbox Code Playgroud)
我正在尝试将其转换为Y86汇编代码.我在翻译比较指令时遇到问题:
cmpl %ebx, %ecx
Run Code Online (Sandbox Code Playgroud)
谢谢.