how_to_get_libc

比赛的时候,遇到比较坑爹的情况,没有提供给libc库,这个时候就需要用各种姿势去泄露libc库。

1、询问组委会,是否提供libc库,很有可能就放提示了

2、通过return2libc技巧,泄露got内保存的库函数地址,去 http://libcdb.com/ 找对应的库版本,这边我写了一个get_libc的小脚本(但并不是百分之一百能找到的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from requests import *
import re
# a_name = raw_input('input a_name= ')
# a_addr = raw_input('input a_addr=')
# b_name = raw_input('input b_name=')
# b_addr = raw_input('input b_addr=')
# a_name= 'read'
# a_addr='0xb76a9bd0'
# b_name='shutdown'
# b_addr='0xb76bc610'
a_name='printf'
a_addr='0x7f0ff5dadba0'
b_name='read'
b_addr='0x7f0ff5e50470'
may_system_offset=[]
url = 'http://libcdb.com/search?symbolA='+a_name+'&addressA='+a_addr+'&symbolB='+b_name+'&addressB='+b_addr
r1 = get(url)
list_ = re.findall(r'<li><a href="(.*?)">Libc\:',r1.content)
payload = 'may_system_offset = ['
if len(list_)>0:
for x in list_:
url = 'http://libcdb.com'+x+'/symbols?name=__libc_system'
system_offset = get(url)
system_offset = re.findall(r'/dt>\n <dd>(.*?)</dd>\n \n </dl>',system_offset.content)[0].replace('libc_base + 0x','')
print system_offset
url = 'http://libcdb.com'+x+'/symbols?name='+b_name
func_offset = get(url)
# print func_offset.content
func_offset = re.findall(r'>'+b_name+'</dt>\n <dd>(.*?)</dd>',func_offset.content)[0].replace('libc_base + 0x','')
may_system_offset.append(int(system_offset,16)-int(func_offset,16))
may_system_offset = list(set(may_system_offset))
for x in may_system_offset:
payload += hex(x)+','
payload = payload[:-1]
print payload+']'
else:
print 'oops! nothing!'
raw_input()

3、利用return to dl resolve技术,这个已经有成熟的辅助工具了。https://github.com/inaz2/roputils

4、利用其他题目的libc库,出题人为了方便,很有可能用的相同libc库

5、利用pwntools提供的dynelf函数来寻找system地址,不过需要有个leak函数。可参考 http://bobao.360.cn/learning/detail/3298.html (蛋疼的是,不知道为啥我的ELF()函数一直是坏的。


2017/5/23日添加

6、泄露Smallbin的FD、BK进行libc base获取

×

你要赏我吃糖果吗?

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
,
隐藏