小编Mic*_*alm的帖子

为什么ebx保存在一个简单函数的堆栈框架中,调用得到?

我正在尝试用c为学生写一个缓冲区溢出练习.

通常,堆栈帧由函数参数,返回地址,基指针和局部变量组成.但我发现,有时候附加的寄存器会与基指针一起保存.我从课堂上记得,calee保存的寄存器必须在使用之前保存.但有些情况下,C代码的编译会产生汇编,这会毫无目的地保存和使用寄存器.请向我解释这个行为.

假设主要功能

int main (int argc, char** argv) {
    func();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和功能

void func() {
    char buf[5];
    strcpy(buf,"AAAA");
    strcpy(buf,"BBBB");
}
Run Code Online (Sandbox Code Playgroud)

如果我使用gdb调试生成的可执行文件

break func
run
info frame
Run Code Online (Sandbox Code Playgroud)

一切都很好,堆栈框架只包含ebp和eip.

如果我使用

void func() {
    char buf[5];
    gets(buf);
}
Run Code Online (Sandbox Code Playgroud)

我明白了

 Saved registers:
  ebx at 0xffffd1cc, ebp at 0xffffd1d0, eip at 0xffffd1d4
Run Code Online (Sandbox Code Playgroud)

那么ebx是否另外保存在堆栈框架中?为什么?如果我跑

disas func
Run Code Online (Sandbox Code Playgroud)

我明白了

Dump of assembler code for function func:
   0x56555730 <+0>: push   %ebp
   0x56555731 <+1>: mov    %esp,%ebp
   0x56555733 <+3>: push   %ebx
   0x56555734 <+4>: sub    $0x8,%esp
   0x56555737 <+7>: call …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction assembly gcc reverse-engineering

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

如何将任意字节发送到 gdb 中程序的 STDIN?

我正在为学生开发缓冲区溢出练习。在这种情况下,您通常必须提供任意字节作为程序的输入(返回地址)。

假设这个例子:

#import <stdio.h>
#import <string.h>

void func() {
    char buf[4];
    gets(buf);
}

int main (int argc, char** argv) {
    func();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

通常我会用 gdb 进行试验,直到找到一个解决方案,然后可以将其公式化为

python -c 'print "A"*8+"\x08\x04\88\72"' | ./program
Run Code Online (Sandbox Code Playgroud)

在开发越来越复杂的练习的同时,找到解决方案的难度也在增加。有时通过覆盖gdb中的返回地址

 set {int}address_of_address = new_address
Run Code Online (Sandbox Code Playgroud)

有效,但 python 方法无效。调试它并能够在程序运行时在 gdb 中输入像“\x04”这样的字节会很好,分析效果。

有没有办法做到这一点?

这个问题似乎相关,但用 python 方法回答:从标准输入发送任意字节到 fgets

我的不止于此:-/

c encoding gdb reverse-engineering buffer-overflow

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

将高斯混合模型拟合到单个特征数据的正确方法是什么?

data 是一维数据数组。

data = [0.0, 7000.0, 0.0, 7000.0, -400.0, 0.0, 7000.0, -400.0, -7400.0, 7000.0, -400.0, -7000.0, -7000.0, 0.0, 0.0, 0.0, -7000.0, 7000.0, 7000.0, 7000.0, 0.0, -7000.0, 6600.0, -7400.0, -400.0, 6600.0, -400.0, -400.0, 6600.0, 6600.0, 6600.0, 7000.0, 6600.0, -7000.0, 0.0, 0.0, -7000.0, -7400.0, 6600.0, -400.0, 7000.0, -7000.0, -7000.0, 0.0, 0.0, -400.0, -7000.0, -7000.0, 7000.0, 7000.0, 0.0, -7000.0, 0.0, 0.0, 6600.0, 6600.0, 6600.0, -7400.0, -400.0, -2000.0, -7000.0, -400.0, -7400.0, 7000.0, 0.0, -7000.0, -7000.0, 0.0, -400.0, -7400.0, -7400.0, 0.0, 0.0, 0.0, -400.0, -400.0, …
Run Code Online (Sandbox Code Playgroud)

python machine-learning reshape scikit-learn mixture-model

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