2014-02-24 103 views
1

我试图利用在printf的关于利用printf格式漏洞

#include <stdio.h> 
int main() 
{ 
    int a = 1, b = 2, c = 3, d = 4; 
    printf("%d %d %d %d"); 
} 
  1. A,B,C,d的脆弱性被压入堆栈。
  2. printf参数被压入堆栈,然后返回地址
  3. 现在,printf会从"%d%d%d%d"增加SP以达到参数。
  4. 但是,由于没有参数应达到当地主要的变量,那么B ...

但是,上面的输出是随机的较大值

-1000081144 - 10000081128 4197428 4197568 -842270912

Q1:输出中的这些值是什么。我的理解有什么问题?

Q2:如何更正上面的代码以便在printf中的主函数中打印局部变量的值? (通过利用printf的漏洞)

+0

你还没有提到要在printf语句中打印的变量名 –

+3

@jpw,Santhosh Pai,大家请再读一遍这个问题 –

+1

@IvayloStrandjev我刚刚回答了第二部分。 – jpw

回答

4

无法保证变量将位于堆栈的正确位置。您可以检查堆栈(gdb)并查看它们的正确地址,但这不会是一个通用的解决方案。

+0

好吧,我同意你的看法。你如何可视化堆栈框架?它是主存的一部分,是虚拟内存的抽象部分。现在当我们说SP指向某些东西的时候。那么SP指向多少个字节呢?当我做SP + 1时,SP指针向前移动多少个字节? –

+1

@codeymodey启动'gdb'并说'break main'。然后尝试步进('step'或'stepi'),做'info frame','x/16x $ rsp'等。 – cnicutar

+0

x/16x $ rsp工程,同样如果我打印整个堆栈太多%d,我启动最终看到价值。此外,为什么这些值不同大小(-1000081144 - 10000081128 4197428 4197568 -842270912)? –