小编mic*_*612的帖子

需要利用缓冲区溢出.无法弄清楚如何在执行漏洞利用代码后破坏堆栈?

基本上我正在利用的功能是这样的:

int getbufn()
{
     char buf[512];
     Gets(buf);
     return 1;
}
Run Code Online (Sandbox Code Playgroud)

当我运行主程序时,该函数执行5次,每次buf的位置改变,%ebp的位置也改变.我应该做的是将一个特定的十六进制值,比如0xFFFFFFFF,放入一个变量中,主程序每次都会检查该变量是否存在.如果它再次执行,直到完成所有5次并且程序安静地退出.

我遇到的问题是,在检查十六进制值之前,检查另一个常量值,比如说0x12345678.如果我已经损坏了0x12345678并且它不在那里,程序就会爆炸.

我已经发现0x12345678存储在-0x10(%ebp)中,所以我知道它基于%ebp并且我每次都知道%ebp的地址但我只能在第一次使用该漏洞利用.我这样做基本上是用了496个字节,而且这个机器代码是用字节格式的:

mov  0xFFFFFFFF, %eax
movl address old ebp, %ebp
push correct return adress in function main
ret
Run Code Online (Sandbox Code Playgroud)

最后是5个字和一个返回长的字节,我填充0x313131使其长6个字.此时我的漏洞利用字符串长度为520字节,这正好是缓冲区低于%ebp的数量,因此我添加旧ebp的地址和我的nopsled中的某个地址覆盖%ebp处的当前值以及返回值getbufn的地址.

问题是当程序执行第二次时%ebp的地址0x10低于其先前的地址,所以我的方式不会破坏%ebp不起作用,并且主检测到0x12345678不在-0x10(%ebp).如何解除%ebp的损坏?

stack-overflow assembly exploit shellcode

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

有没有办法一般地为所有引用类型实现迭代器的特征?

我有一个特点

trait Foo<T> : Iterator<Item=T> {
    fn bar(&mut self) -> f64;
}
Run Code Online (Sandbox Code Playgroud)

我想一旦实现这种特质的类型T(在我的情况下f64在其所有引用类型() f64,&'a f64&'a mut f64),因为在逻辑上也没关系.

我现在有

impl<T: Iterator<Item = f64>> Foo<f64> for T {
    fn bar(&mut self) -> f64 {
        // duplicated code
    }
}

impl<'a, T: Iterator<Item = &'a f64>> Foo<&'a f64> for T {
    fn bar(&mut self) -> f64 {
        // duplicated code
    }
}

impl<'a, T: Iterator<Item = &'a mut f64>> Foo<&'a mut f64> for T …
Run Code Online (Sandbox Code Playgroud)

rust

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

在Rust中扩展Iterator特征时找不到任何方法

我试图扩展特征的功能Iterator.

我的statistics/iter_statistics.rs:

mod iter_statistics {
    pub trait IterStatistics: Iterator<Item = f64> {
        fn foo(&mut self) -> f64 {
            0.0
        }
    }

    impl IterStatistics for Iterator<Item = f64> {}
}
Run Code Online (Sandbox Code Playgroud)

而且statistics/mod.rs:

pub use self::iter_statistics::*;
mod iter_statistics;
Run Code Online (Sandbox Code Playgroud)

最后在我的测试代码中

use statistics::IterStatistics;

fn main() {
    let z: Vec<f64> = vec![0.0, 3.0, -2.0];
    assert_eq!(z.into_iter().foo(), 0.0);
}
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,我得到:

error: no method name `foo` found for type `std::vec::IntoIter<f64>` in the current scope
assert_eq!(z.into_iter().foo(), 0.0);
                         ^~~
Run Code Online (Sandbox Code Playgroud)

这是奇怪,我因为文档IntoIter<T>说,它实现Iterator<Item=T> …

rust

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

标签 统计

rust ×2

assembly ×1

exploit ×1

shellcode ×1

stack-overflow ×1