CS:APP 栈溢出实验解析

本学期学习了CS:APP(深入理解计算机系统)这门课。随课做了相关的实验。这里把实验的过程与大家分享。

这是第三章的栈溢出实验的解析。希望能起到帮助。

Level 0: Candle

此任务主要内容为执行流的控制。直接修改getbuf()函数的返回地址为smoke() 函数的地址即可。通过GDB知该地址固定为为0x08048c90。由此构造溢出攻击数据:

01可以替换成除了0A以外的任何字节。该数据能覆盖return address,在执行到ret语句的时候劫持控制流到0x08048c90。 继续阅读CS:APP 栈溢出实验解析

解决RabbitMQ无故占用大量内存的问题

2017.3.26 修订:改正错别字并补充内容。

=============================

刚刚接手自强Studio的后台开发,碰到了Redis做Celery的broker时大量占用Redis服务器宽带资源的问题。

面对有限的经费,我决定把和Celery搭档的做Broker的Redis更换为RabbitMQ。

刚切换到RabbitMQ以后,流量是有显著下降,但是却发现了一个奇怪的问题:服务器内存资源占用总是从50%在两三天的时间内飙升至80%,之后服务器内存调度缓慢,几乎处于宕机的状态。

起先怀疑是服务器配置不足(服务器只有1G内存),然而在咨询了@liby、@iceboy@twd2等大神以后,得知RabbitMQ在1G的内存下跑完全可行。

在百度和必应上搜索无果。搜到的大多是关于vm_memory_high_watermark的内容。修改后无效。之后细致的分析了RabbitMQ的内存,发现高涨的是binary部分。遂修改关键词,重新选择合适的搜索引擎,搜到了这篇文章

解决方法就是,在RabbitMQ配置文件 rabbitmq.config中修改 tcp_listen_options中有关Socket Buffer的配置。该问题提供的参数如下:

未强制指定时,系统会自动指定Buffer的大小(想想一堆数据全部丢进去,着实可怕)。具体的体现就是Binary内存使用高涨。RabbitMQ的文档里没有详尽介绍这个参数,然而这个参数竟然会带来这么大的内存使用差!

修改此参数后,RabbitMQ已正常运行一个多星期。

然而,好景不长,在一周半以后,服务器又一次跑满了……

那么很显然,之前的调查应该走错了方向。于是又翻出来Celery的文档仔细阅读。最后看到了这样一句话:(原文

AMQP backend results.
When running with the AMQP result backend, every task result will be sent as a message. If you don’t collect these results, they will build up and RabbitMQ will eventually run out of memory.

This result backend is now deprecated so you shouldn’t be using it. Use either the RPC backend for rpc-style calls, or a persistent backend if you need multi-consumer access to results.

Results expire after 1 day by default. It may be a good idea to lower this value by configuring the result_expires setting.

翻译:
AMQP作为后端(backend)的后果。

当AMQP作为数据后端(result backend)时,所有的任务结果数据都会以一个消息形式的发送。如果你没有回收这些结果数据,它们就会逐渐在队列中积累,最终导致RabbitMQ耗尽内存。

现在这种数据后端已经被弃用了,它不应在你选择的方案的范畴内。你可以通过RPC后端进行RPC风格的调用(rpc-style calls),或者通过一个可持久化的(persistant)后端去向多个消费者(consumer)提供结果数据。

结果数据默认的有效期为1天。通过修改配置中的result_expires参数降低数据有效期可能也是一个可行的方案。

于是又按照文档推荐将backend换成redis,继续保持broker为rabbitmq。经过数月考察发现问题确实得到了解决。此外还意外发现rabbitmq作为broker稳定性明显强于redis。

反思:
1. 对于错误的分析要彻底,否则会带来新的问题与新的损失。
2. 文档里面提供了很多解决问题的思路。要更好掌握学习文档的技能。

在Debian下搭建HTTPS服务器

0x00 引言

snapshot73

HTTP协议是大致在1996年左右定型的。距今天已经大约有了20个年头。今天传统的HTTP协议正遭受着来自安全性的考验。数据的传输的过程没有想象中的那么安全,任何一个环节都可能出现数据的泄露。

HTTPS则可以看作是在HTTP的基础上加入SSL层的一种协议。SSL保证了数据传输过程的安全性,并为用户确认对方网站的身份提供了条件。

本篇主要写给希望应用HTTPS的站长,提供了一种建立HTTPS服务器的方法。

0x01 SSL证书的获取

为了保证网站的身份,SSL应用了“证书”。为了保证证书的合法性,证书需要专门的机构签发。这些机构对你的身份进行验证后给你发放证书。大多数时候这是要收费的,毕竟这个过程要一定的人力物力完成。

当然,不同的证书需要不同强度的认证,所以证书的定价也是有差异的。有一类证书只需要验证域名,这些证书大多是免费的。我的证书是由WoSign签发的。大家可以在这里申请。还有Let’s Encrypt,这也是一种免费SSL证书的解决方案。当然,企业级用户还是建议购买一个认证更强的证书,有助于提高企业的声誉。 继续阅读在Debian下搭建HTTPS服务器

四六级翻译汇总

以下均选自于每年四六级真题,供有需要的同学学习,如果内容有侵权请与我联系。

四级

2015年12月

题一

云南省的丽江古镇是中国著名的旅游目的地之一。那里的生活节奏比大多数中国的城市都要缓慢。丽江到处都是美丽的自然风光,众多的少数民族同胞提供了各式各样、丰富多彩的文化让游客体验。历史上,丽江还以“爱之城”而闻名。当地人中流传着许多关于人生,为爱而死的故事。如今,在中外游客眼中,这个古镇被视为爱情和浪漫的天堂。(paradise)

题二

今年在长沙举行了一年一度的外国人汉语演讲比赛。这项比赛证明是促进中国和世界其他地区文化交流的好方法。它为世界各地的年轻人提供了更好地了解中国的机会。来自87个国家共计126位选手聚集在湖南省省会参加了7月6日到8月5日进行的比赛和决赛。比赛并不是唯一的活动。选手们还有机会参观了中国其他地区的著名景点和历史名胜。

题三

中国父母往往过于关注孩子的学习,以至于不要他们帮忙做家务。他们对孩子的唯一要求就是努力学习,考得好,能上名牌大学。他们相信这是为孩子好,因为在中国这样竞争激烈的社会里,只有成绩好才能保证前途光明。中国父母还认为,如果孩子能在社会上取得大的成就,父母就会受到尊敬。因此,他们愿意牺牲自己的时间、爱好和兴趣,为孩子创造更好的条件。 继续阅读四六级翻译汇总

GDB小技巧

在代码的编写过程中有一环叫做调试,然而调试往往是个折腾人的过程。事实上调试也是有很多技巧可言的。这里分享几个使用GDB进行调试的技巧。

GDB是the GNU Project debugger的简称,也就是GNU的调试器。事实上诸如Dev-C++、Code::Blocks、Free Pascal IDE之类的IDE的调试功能背后都站着GDB的身影。这足以见得GDB的强大。

下面就分享几个GDB的使用技巧。

使用GDB以前,首先要生成能够被GDB识别的可执行程序。大多数编译器的这个功能可以使用-g开关打开。如,gcc可以使用如下编译命令:(-Wall -lm为推荐参数,可加可不加,g++与之类似)

FPC可以使用

做好了前期准备就可以开始搞正事了。
继续阅读GDB小技巧