Chinaunix

标题: 缓冲区溢出问题 [打印本页]

作者: keymirage    时间: 2016-06-14 00:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: keymirage    时间: 2016-06-14 00:52
提示: 作者被禁止或删除 内容自动屏蔽
作者: keymirage    时间: 2016-06-15 08:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: lxyscls    时间: 2016-06-15 09:41
回复 1# keymirage


    main函数的FP(帧指针)下移 4字节(FILE *) + 10字节,也许,可以通过objdump来看
作者: keymirage    时间: 2016-06-15 10:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: lxyscls    时间: 2016-06-16 10:31
回复 5# keymirage
  1. 0000000000400650 <main>:
  2. main():
  3.   400650:   55                      push   %rbp
  4.   400651:   48 89 e5                mov    %rsp,%rbp
  5.   400654:   48 83 ec 20             sub    $0x20,%rsp
  6.   400658:   be 50 07 40 00          mov    $0x400750,%esi
  7.   40065d:   bf 53 07 40 00          mov    $0x400753,%edi
  8.   400662:   e8 d9 fe ff ff          callq  400540 <fopen@plt>
  9.   400667:   48 89 45 f8             mov    %rax,-0x8(%rbp)
  10.   40066b:   48 83 7d f8 00          cmpq   $0x0,-0x8(%rbp)
  11.   400670:   75 14                   jne    400686 <main+0x36>
  12.   400672:   bf 5c 07 40 00          mov    $0x40075c,%edi
  13.   400677:   e8 74 fe ff ff          callq  4004f0 <puts@plt>
  14.   40067c:   bf 01 00 00 00          mov    $0x1,%edi
  15.   400681:   e8 ca fe ff ff          callq  400550 <exit@plt>
  16.   400686:   48 8b 55 f8             mov    -0x8(%rbp),%rdx
  17.   40068a:   48 8d 45 e0             lea    -0x20(%rbp),%rax
  18.   40068e:   48 89 d1                mov    %rdx,%rcx
  19.   400691:   ba 00 02 00 00          mov    $0x200,%edx
  20.   400696:   be 01 00 00 00          mov    $0x1,%esi
  21.   40069b:   48 89 c7                mov    %rax,%rdi
  22.   40069e:   e8 5d fe ff ff          callq  400500 <fread@plt>
  23.   4006a3:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  24.   4006a7:   48 89 c7                mov    %rax,%rdi
  25.   4006aa:   e8 61 fe ff ff          callq  400510 <fclose@plt>
  26.   4006af:   c9                      leaveq
  27.   4006b0:   c3                      retq
  28.   4006b1:   66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  29.   4006b8:   00 00 00
  30.   4006bb:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
复制代码
400654:   48 83 ec 20             sub    $0x20,%rsp这个地方从rbp开始下拉了0x20个字节,也就是说为fpr和buffer预留了0x20个字节的位置
400667:   48 89 45 f8             mov    %rax,-0x8(%rbp)这个地方将fopen的返回值赋到rbp下拉0x8字节的位置,这个地方就是fpr的首地址了
buffer也是类似,好久不看这类东西了,只能给你点分析的线索吧,你不分析服务器端的代码,怎么攻击?
作者: keymirage    时间: 2016-06-17 12:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: keymirage    时间: 2016-06-19 10:09
提示: 作者被禁止或删除 内容自动屏蔽
作者: idi0t    时间: 2016-06-20 09:19
你都说一般情况下会跳转shellcode了,还要A地址有何用呢?如果真要获取A地址当然也是在shellcode里获取了
作者: keymirage    时间: 2016-06-20 09:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: idi0t    时间: 2016-06-20 10:43
回复 10# keymirage


    这样怎么可能先知道A地址呢,你描述我发现看得不是很明白,你唯一能做的就是提高shellcode的命中,最后跳转到的肯定是A或者A+的地址,直接shellcode前用NOP填充,哪怕最后shellcode 往后了一样可以运行
作者: windoze    时间: 2016-06-20 15:49
回复 10# keymirage

所以你要猜测stack布局,并且插一大堆nop在你的shellcode前面。
一个进程的stack base address是基本固定的,当然在溢出点的SP你不太可能精确的猜到,所以你只能大概估一个范围,比如说上下1k的范围,然后你就需要在shell code前面填上2k的nop,然后根据你的猜测设置stack顶返回地址,希望这个地址位于那2k的nop之中。
如果你猜对了,那么函数返回时PC就会转到某一条nop指令上,执行完下面的那些nop就轮到你的shellcode了。
作者: keymirage    时间: 2016-06-21 08:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: keymirage    时间: 2016-06-21 08:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: windoze    时间: 2016-06-21 10:05
回复 13# keymirage

ASLR是编译器提供的,编译器在编译代码的时候会插入stack randomize的一些指令,所以很有可能一个进程里还存在没有打开aslr的动态库,因为OS装载动态库的时候尽量会使用标记在动态库文件里的那个基地址,所以找到一个这样的动态库就意味着你有可能找到一个可预测的地址,接下来就是想办法在这个动态库里找一个溢出点。
作者: idi0t    时间: 2016-06-21 12:16
回复 14# keymirage


    太久没玩也没深入玩这些,只是为了编写安全的程序需要,
    关于aslr,还记得有很多人写过突破aslr的文章,看雪就有,你要讨论这些问题其它最好还是去看雪吧。
作者: folklore    时间: 2016-06-21 12:51
攻击代码本来就是为特定系统定制的, 你还要怎样???




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2