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
0000000000400650 <main>:
main():
400650: 55 push %rbp
400651: 48 89 e5 mov %rsp,%rbp
400654: 48 83 ec 20 sub $0x20,%rsp
400658: be 50 07 40 00 mov $0x400750,%esi
40065d: bf 53 07 40 00 mov $0x400753,%edi
400662: e8 d9 fe ff ff callq 400540 <fopen@plt>
400667: 48 89 45 f8 mov %rax,-0x8(%rbp)
40066b: 48 83 7d f8 00 cmpq $0x0,-0x8(%rbp)
400670: 75 14 jne 400686 <main+0x36>
400672: bf 5c 07 40 00 mov $0x40075c,%edi
400677: e8 74 fe ff ff callq 4004f0 <puts@plt>
40067c: bf 01 00 00 00 mov $0x1,%edi
400681: e8 ca fe ff ff callq 400550 <exit@plt>
400686: 48 8b 55 f8 mov -0x8(%rbp),%rdx
40068a: 48 8d 45 e0 lea -0x20(%rbp),%rax
40068e: 48 89 d1 mov %rdx,%rcx
400691: ba 00 02 00 00 mov $0x200,%edx
400696: be 01 00 00 00 mov $0x1,%esi
40069b: 48 89 c7 mov %rax,%rdi
40069e: e8 5d fe ff ff callq 400500 <fread@plt>
4006a3: 48 8b 45 f8 mov -0x8(%rbp),%rax
4006a7: 48 89 c7 mov %rax,%rdi
4006aa: e8 61 fe ff ff callq 400510 <fclose@plt>
4006af: c9 leaveq
4006b0: c3 retq
4006b1: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
4006b8: 00 00 00
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