Differential Reversing (or some better name)

September 29th, 2009

Note: As a prefix, I want to say I can’t decide on what to call this simple technique. Everyone seems to call it something different: filtering, differential debugging, coverage diffs, or delta traces. Either way it’s a simple idea, so I’m sticking with the first name that popped in my head. Whatever it’s called, it is important to know it’s been done many times and called a few different things. Carry on…

Motivation

Close your eyes and imagine…

In a moment of irrational team spirit, you, a vocal DC native (you actually live in Montgomery County — poser), bet $5,000 on your beloved Redskins. On Sunday, the Skins lose to the worst team in the league. You spend a night trying to destroy the part of your brain responsible for this lapse of judgment by consuming many many shots of tequila and making many many amazingly bad choices (attempting a bad idea overflow?). It’s 9am and you wake up with a hole where the team spirit functions of your brain used to be (I’m sure there was some collateral damage but I doubt anyone will notice). After a glass of orange juice (which you manage to keep down!), you remember you don’t have $5,000 (“It’s a lock!”… right). You reflect that Willie “Wet Work” Wollinski, your bookie, doesn’t actually seem like such a nice guy and would probably not “be so nice as to forget the whole thing.” Your brainstorming session helps you realize that you have no marketable skills… besides vulnerability discovery and exploit development!

You decide to try and find a bug in some large widely installed software and sell your new found bug to ZDI or iDefense. Having already read this blog post, you use differential reversing to pinpoint the implementation of an interesting feature in your target application, use the IDA plug-in to audit, find an exploitable bug, pound out a PoC and write a fairly weak advisory (but it should be worth $5,000). Hooray! You can keep your kneecaps (for this week at least). Thank $DEITY you read this blog post and didn’t waste time auditing extra sections of the target binary.

Overview

Differential reversing (as I am deeming it) is a really simple method to select starting points in a binary for dynamic auditing. This isn’t a new idea, I didn’t invent this technique. People have been doing this for-evah. I’m just documenting a useful set of tools I’ve developed to make my life easier. Pedram Amini’s Process Stalker can do this (calls it “filtering”). It does a bunch of other awesome stuff too. I’m also told Zynamics BinNavi can do this (they call it “differential debugging”), but I don’t have a rich uncle to buy me a copy so I cannot give a first hand account of how it works. It looks pretty nice — check out the BinNavi page for details.

This post is organized as follows. First, I’ll describe the method and the steps in implementing it. Next, I’ll describe the three small tools I’ve written and their implementation. At the end, I’ll show a little example of the tools in action on a nice proprietary application. All the tools are written for use on Windows and have been tested on XP. The technique is generic and could be used on any platform.

Differential Reversing

When I’m reversing, I’m always trying to find a place to add a good breakpoint — in other words, I’m not yet a great reverse engineer. I still spend more time in the debugger than IDA. I’ve seen suggestions to count cross references and get the frequently called functions reversed first. This makes great sense. After doing so, you get the memory primitives out of the way. I have a problem with the next step — where do you go next? My solution to this problem is to use dynamic information to find areas I am interested in. In large binaries, unless you can find some good data cross-references (strings or unique constants), it is very hard to statically find the areas of interest. On the other hand, it is usually easy to exercise the code you want dynamically. For example, you can exercise the de-frobbing code by passing your application frobbed data. Record a trace of execution while the application is processing your input and you will have a bound on where the interesting code is located. Next, the problem is how to search your large basic block run trace for the de-frobbing code. The next logical step is to create a baseline trace of code hit by other inputs that is not hit by the de-frob inducing input. By removing those blocks hit by the baseline trace, you have narrowed the search greatly. That is differential reversing (or, at least, that is what I’m calling it).

Screenshot

DiffCov Screenshot 1

Tools

There are two obvious tools needed: a tool to capture the set of basic blocks hits during a run and a tool to produce a set of basic blocks given a baseline set and a trigger set. For the first tool (BlockCov), I’ve written a Pin tool to capture the basic blocks hit during a run. The Pin tool takes as arguments a set of modules (executables or libraries) of interest. This allows the GUI and system stuff to be ignored at the trace level (in other words, we aren’t even going to record hits in modules outside the whitelist of modules). The output is a simple list of basic blocks hit for each modules. It also records the module load address in case multiple runs load the module at different virtual addresses.

The second tool is a small python script (diffre.py). The script creates a stable set of blocks by loading multiple runs using the same input and discarding any blocks that don’t exist in all runs with that input. Once a stable set of blocks has been created for both the baseline and the trigger, those blocks appearing only in the trigger set are recorded in an output set of blocks. Finally, this output is provided to a small IDA plug-in (IDACov) to color the blocks that are hit and a list of covered function to quickly navigate to the areas of interest (Actually, since I started this blog post, I rewrote this plug-in as a IDAPython script — both are included in the archive.)

Tool #1: BlockCov

BlockCov is a Pin tool that monitors a running process and records each basic block executed. Pin is a dynamic binary instrumentation (DBI) framework made available by Intel. It allows us to monitor the execution while adding very little overhead and maintaining a reasonable runtime. Pin publishes an easy to use API and extensive documentation. The mailing list is active and the replies are quick. The downside of using a DBI framework is the difficulty of debugging your tool. Most of the time, you end up using printf debugging techniques. Despite this part of the process, Pin allows you to do some things that would otherwise be too slow to do with a normal debugger. The tradeoff is lack of flexibility, but with the right tools that can be mitigated. But we’re off on a tangent…

BlockCov reduces the overhead by using an address range filter. A set of interesting images is given using command line switches to exclude GUI and system code at the trace level (of course it can still be included if that is what you are interested in). This filter is created by hooking image loads (PE files — executables and DLLs). When an image is loaded, the filename of the loaded image is checked against the whitelist. If a match is found, the image address range is stored along with the image name in a loaded module list. Pin works by dynamically rewriting IA32 (or x64 or IA64) instructions just before execution. The rewrite accomplishes two things: first, it ensures the process under execution does not escape control of the Pin driver and, second, it allows a Pin tool to insert instrumentation hooks at any point in the process. We want to record every access to a basic block within the loaded whitelist modules. We ask Pin to call us every time it does this translation. When BlockCov gets this callback, it looks at the addresses being translated. If the translation falls within an interesting module, then a function call is inserted to record that this block has been hit. Effectively, this is like adding a “CALL RecordBlockHit” at the start of every interesting block before running the process. When the process exits, the recorded set of block addresses are dumped for each interesting module. BlockCov is fairly straightforward — it doesn’t do much.

Tool #2: diffre.py

diffre.py is a script that has two functions. To avoid spurious differences in a run caused by processes not dependent on the inputs we control, multiple runs are recorded using BlockCov before processing with diffre.py. The script will then take all runs with the same input and filter out any blocks which are not present in all traces. You can come up with instances when this wouldn’t be useful, or even when it might be counter productive, but it has been more useful this way (YMMV). We will call the resulting set of blocks the stable set. Once that has been computed for both the baseline input runs and the trigger input runs, these two sets are compared and a set difference gives the blocks that are unique to the trigger input. This set is output to a file for the IDA plug-in (or anything else you want to do with it).

Tool #3: IDACov

IDACov is a really simple plug-in that takes a list of basic block starting addresses as input. It colors the instructions in this basic block blue and the function containing a color block light blue. It also makes a list of functions with highlighted blocks for quick navigation. I’m guessing there are plug-ins/IDAPython/IDC that do almost the exact same thing, but I’m learning the SDK and this was a good simple exercise. I’ll be re-implementing this in IDAPython soon to see how much cleaner that is. Oh, look, I did it already. IDAPython is great.

Building the Tools

First, grab a current snapshot.

To use the tools, you’ll need Pin 29972 and a recent Visual Studio (the free Express version will work fine). When you unpack Pin, you’ll get a directory with something like pin-2.7-29972-blah, we’ll call this $PINROOT. Unpack the DiffCov tools into $PINROOT\source\tools\. This should place all the tools under $PINROOT\source\tools\DiffCov. Open the DiffCov.sln solution file and build both the pintool and the IDA plug-in. The solution assumes you have IDA at C:\Program Files\IDA and that you want to build the plugin in the \plugins directory under IDA. If you don’t want it there, modify the properties of the IDACov project. The sample SWF files used for input are includes, but if you want to compile them from the HaXe source, you will need HaXe installed. Oh, also, the IDA plug-in expects the SDK to be at C:\Program Files\IDA\idasdk55 — another thing you can fix in the project properties if you need to. Alternatively, the package includes a compiled version of the plug-in. The Pin tool is not distributed in compiled form, you’ll have to build that yourself.

Use Case: Adobe Flash and AMF

The Adobe Flash Player uses some incarnation of the Tamarin framework. This means much of the front-side of Flash is open-sourced. The back-side, the ActionScript API, is not open-source. Flash has a built-in serialization protocol called Action Message Format (or AMF). The ByteArray class in flash.utils support serialization and de-serialization of byte streams using this format. The format is described in an open document from Adobe’s wiki. We will be focusing on AMF3 because that is what the latest ActionScript API uses by default — although, it would be pretty simple to modify the two inputs to find the processing of an AMF0 message. Our goal is to find the parsing of an AMF message in the Flash Player plug-in. I tend to use Firefox for this, so my examples will be using Firefox to launch Flash Player.

Our first step is creating two different inputs that are as similar as possible yet only one will exercise the AMF object parsing codepath. Below are the two HaXe programs to do just that:

Baseline

1
2
3
4
5
6
7
8
class Test {
  static function main() {
    var ba = new flash.utils.ByteArray();
    ba.writeByte(0x04);
    ba.writeByte(0x01);
    ba.position = 0;
  }
}

AMF Integer Parse

1
2
3
4
5
6
7
8
9
class Test {
  static function main() {
    var ba = new flash.utils.ByteArray();
    ba.writeByte(0x04);
    ba.writeByte(0x01);
    ba.position = 0;
    var v = ba.readObject();
  }
}

Now that we have out inputs, let’s run Firefox under the BlockCov tool to capture some coverage sets. We will pass a single whitelisted image to BlockCov: NPSWF32.dll. This is the Flash Player plug-in used by Firefox. Since we are only whitelisting the Flash DLL, none of the Firefox code will be captured — this will keep the overhead low and the block trace smaller. Below is a transcript of 4 runs of BlockCov. Note that BlockCov takes an id and a run parameter; the id parameter is a name for the input used in this run (it shouldn’t change when doing multiple runs with the same input) and the run parameter is a number to give this run (it differentiates between multiple runs with the same input). Keep in mind I’m using a Firefox profile called “fuzz” to run this under — you’ll have to modify the command line to get rid of the -no-remote and -P fuzz switches if you want to run under the default profile.

E:\tools\PinTools\pin-2.6-27887\source\tools\DiffCov\Debug>..\..\..\..\ia32\bin\
pin.exe -t BlockCov.dll -mw NPSWF32.dll -id base -run 0 -- "c:/program files/moz
illa firefox/firefox.exe" -no-remote -P fuzz "E:\tools\PinTools\pin-2.6-27887\so
urce\tools\DiffCov\Samples\AMFInt-Baseline\Test.swf"
 
E:\tools\PinTools\pin-2.6-27887\source\tools\DiffCov\Debug>..\..\..\..\ia32\bin\
pin.exe -t BlockCov.dll -mw NPSWF32.dll -id base -run 1 -- "c:/program files/moz
illa firefox/firefox.exe" -no-remote -P fuzz "E:\tools\PinTools\pin-2.6-27887\so
urce\tools\DiffCov\Samples\AMFInt-Baseline\Test.swf"
 
E:\tools\PinTools\pin-2.6-27887\source\tools\DiffCov\Debug>..\..\..\..\ia32\bin\
pin.exe -t BlockCov.dll -mw NPSWF32.dll -id amfint -run 0 -- "c:/program files/m
ozilla firefox/firefox.exe" -no-remote -P fuzz "E:\tools\PinTools\pin-2.6-27887\
source\tools\DiffCov\Samples\AMFInt\Test.swf"
 
E:\tools\PinTools\pin-2.6-27887\source\tools\DiffCov\Debug>..\..\..\..\ia32\bin\
pin.exe -t BlockCov.dll -mw NPSWF32.dll -id amfint -run 1 -- "c:/program files/m
ozilla firefox/firefox.exe" -no-remote -P fuzz "E:\tools\PinTools\pin-2.6-27887\
source\tools\DiffCov\Samples\AMFInt\Test.swf"

These four runs have generated four block sets: base-0-NPSWF32.dll.blocks, base-1-NPSWF32.dll.blocks, amfint-0-NPSWF32.dll.blocks, and amfint-1-NPSWF32.dll.blocks. Next up, run diffre.py from within the directory containing these four block sets. This should output two files: amfint-results.blocks and base-results.blocks. These are human readable and list the address of blocks of interest. The addresses are offsets from the loaded image base (often 0×10000000 in IDA for DLLs).

If you own IDA, fire it up and load NPSWF32.dll (C:\WINDOWS\system32\Macromed\Flash\NPSWF32.dll). When the analysis is complete, load the IDACov plug-in. A file dialog should pop-up asking for a results file to load. Point it to the amfint-results.blocks produced by diffre.py and voila. Here’s another screen shot:

DiffCov Screenshot 2

About 20 functions to inspect. Those go by pretty quick and the most interesting one (offset 0×00175903) is what appears to be the readObject implementation. See the switch statement covering all the AMF markers listed in the AMF3 specification (oh, look, 2 don’t appear in the specification).

Future Posts

I’ve recently written a Pin tool to gather a detailed run trace. This records instructions executes, memory read or written, and register value changes. It was inspired by MSR’s Nirvana project. On top of that, I have some simple analyses — one tracks tainted data and hooks up to an IDA plug-in shown in the screenshot:

BaSO4 Screenshot

The tainted data source is translated into a parse tree node to quickly identify how various fields in a file format are processed within an executable (note the tree on the right). Eventually, I’d like to hook this up to hex-rays to get some nice auto-commenting (but first, I have to convince my boss to spend the money on it). All of that is for another day and another post (hopefully with less than 6 months in between this one and the next). There is also some static analysis I’ve written to do control dependency calculations — useful for determining the span of a tainted conditional jump. Another future project is implementing some smart fuzzing tools using the trace collection engine and some SMT solver. Basically, all the cool stuff the academics get to do.

I hope this was useful to some people — much of this has been repeated before in tools like PaiMei, but this is a slightly different way to go about it. Thanks for reading this far. I can be contacted at dion@semantiscope.com with any questions or comments.

Happy hunting!

219 Responses to “Differential Reversing (or some better name)”

  1. RomanGol Says:

    Excellent article and tools, thanks!

  2. NeO Says:

    Nice stuff man.. it would be nice if you would distributed also exe.. keep good work

  3. dionthegod Says:

    NeO:
    I figured the build is so simple with Visual Studio Express. That is what I use on 2 of my dev. machines — I know it works well with that. Note that the result of the build is a shared library (not an executable) which gets loaded by pin.exe found in the Pin distribution. I also figured people would certainly want to start tweaking the pintool, so having the source in a buildable state would be useful.

    Let me know if you have any issues with the compilation. I’d be glad to help you get your build working.

  4. Halvar Says:

    Hey there,

    just a brief note: You don’t necessarily need a rich uncle to get a copy of BinNavi or BinDiff. If you’re a student (or otherwise can’t afford a license) we offer the following:

    1) You propose a cool project that you want to use our tools for
    2) You promise that you’ll write a paper on what you’re doing that we can put on our webpage
    3) We provide the software to you, subject to the restriction that your license expires if you don’t write the paper

    Drop me mail for more info.

  5. dionthegod Says:

    Halvar:
    That’s a fair point. I’m not a student. Any use I have would be to make money (say, exploit development or reversing for auditing purposes) — I was trying to make the point that I am priced out of them for the limited use I would make (but I could be wrong). I can certainly understand the prices and they would seem to be well worth it were I reversing large programs on contract (i.e. extended use for a guaranteed profit).

    Regardless, I’m sure others could (and should) take advantage of that offer.

  6. joel Says:

    bonns@grandmothers.slinging” rel=”nofollow”>.…

    good!!…

  7. Chester Says:

    badge@exec.multicolored” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  8. Jamie Says:

    betterment@squared.rousing” rel=”nofollow”>.…

    good info!…

  9. wesley Says:

    token@shelter.avidly” rel=”nofollow”>.…

    ñïñ!!…

  10. Gerald Says:

    scrutinizing@latitude.soldier” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  11. Jamie Says:

    shortcuts@imaginatively.wilhelmina” rel=”nofollow”>.…

    thank you!!…

  12. Michael Says:

    managed@sanatorium.systemic” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  13. antonio Says:

    indivisible@walkways.organization” rel=”nofollow”>.…

    thanks for information!!…

  14. pedro Says:

    mapping@beautiful.impossibly” rel=”nofollow”>.…

    thanks for information!…

  15. Steven Says:

    vietnam@freudian.disagreed” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  16. Cody Says:

    coping@saunders.unstained” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  17. Dwayne Says:

    gesamtkunstwerk@discharge.processes” rel=”nofollow”>.…

    ñïñ….

  18. seth Says:

    gassed@fostered.sea” rel=”nofollow”>.…

    ñïñ!…

  19. william Says:

    remotely@whigs.crawl” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  20. terrance Says:

    bovines@psychoanalysis.sukuma” rel=”nofollow”>.…

    thanks!…

  21. Cameron Says:

    kamens@reuveni.blending” rel=”nofollow”>.…

    tnx for info….

  22. Larry Says:

    shaping@holstein.bevels” rel=”nofollow”>.…

    ñïñ….

  23. todd Says:

    thinner@wicked.overhauling” rel=”nofollow”>.…

    áëàãîäàðþ….

  24. trevor Says:

    ching@interchangeable.improves” rel=”nofollow”>.…

    thanks for information!!…

  25. Glen Says:

    heliopolis@stormed.attaches” rel=”nofollow”>.…

    tnx for info!!…

  26. Doug Says:

    untrustworthiness@tumbled.victorians” rel=”nofollow”>.…

    thank you!…

  27. jordan Says:

    debora@associated.revising” rel=”nofollow”>.…

    ñïñ!…

  28. Arthur Says:

    mitch@francescas.arabian” rel=”nofollow”>.…

    ñïñ!!…

  29. bradley Says:

    kerchief@assns.murdering” rel=”nofollow”>.…

    ñïñ çà èíôó….

  30. Patrick Says:

    cv@critic.prescribe” rel=”nofollow”>.…

    thank you….

  31. kyle Says:

    edified@counseled.soothed” rel=”nofollow”>.…

    tnx!…

  32. Ronald Says:

    maturing@wildhack.actualities” rel=”nofollow”>.…

    ñïñ!!…

  33. gabriel Says:

    latinovich@husbun.hydrophilic” rel=”nofollow”>.…

    tnx for info….

  34. Terrance Says:

    lyrical@faculties.elicited” rel=”nofollow”>.…

    good!…

  35. Sam Says:

    flakes@unmanageably.sonnet” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  36. russell Says:

    celebrating@whereas.plate” rel=”nofollow”>.…

    good info….

  37. theodore Says:

    petipa@hangover.corroborating” rel=”nofollow”>.…

    ñïñ!!…

  38. Francisco Says:

    metalsmiths@unproductive.fing” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  39. clifton Says:

    footwear@messrs.blackwell” rel=”nofollow”>.…

    thanks!…

  40. harold Says:

    scientifique@mavis.pools” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  41. lee Says:

    hoogli@seam.disrobe” rel=”nofollow”>.…

    áëàãîäàðñòâóþ….

  42. Ben Says:

    dispatched@foreknowledge.rosebush” rel=”nofollow”>.…

    tnx for info!…

  43. barry Says:

    piers@bronislaw.stopper” rel=”nofollow”>.…

    tnx for info!…

  44. louis Says:

    expressing@traveler.matured” rel=”nofollow”>.…

    thanks for information!!…

  45. neil Says:

    malenkov@polyesters.sierra” rel=”nofollow”>.…

    thanks….

  46. brian Says:

    burnham@anglican.physically” rel=”nofollow”>.…

    ñïàñèáî!…

  47. Darren Says:

    hardy@apparition.fruit” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  48. jeremy Says:

    bella@appropriated.supplanting” rel=”nofollow”>.…

    ñïñ!!…

  49. lance Says:

    recoiled@den.trenchard” rel=”nofollow”>.…

    ñïñ!!…

  50. johnny Says:

    pricing@tallahassee.bondi” rel=”nofollow”>.…

    áëàãîäàðåí….

  51. Jamie Says:

    directed@verie.abdominal” rel=”nofollow”>.…

    áëàãîäàðþ!…

  52. Bernard Says:

    solidity@addict.ousted” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  53. arturo Says:

    gathered@tum.licensed” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  54. Gilbert Says:

    silke@burgher.appellant” rel=”nofollow”>.…

    thanks….

  55. Jonathan Says:

    irreconcilable@dilution.wergeland” rel=”nofollow”>.…

    áëàãîäàðåí!!…

  56. robert Says:

    dusseldorf@bordel.taksim” rel=”nofollow”>.…

    thanks!…

  57. fernando Says:

    delegations@dowex.punctuality” rel=”nofollow”>.…

    hello!…

  58. Morris Says:

    airpark@francesco.beer” rel=”nofollow”>.…

    good!…

  59. otis Says:

    vasady@horizons.mckenna” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  60. Calvin Says:

    favorably@winches.immigration” rel=”nofollow”>.…

    ñïñ!…

  61. Angel Says:

    sant@knecht.bunched” rel=”nofollow”>.…

    thanks for information!…

  62. dustin Says:

    rechartering@brannon.suspiciously” rel=”nofollow”>.…

    ñïñ çà èíôó….

  63. ted Says:

    perfunctory@exploited.twinkling” rel=”nofollow”>.…

    ñïñ!!…

  64. Julian Says:

    disaffiliation@eerily.ciceros” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  65. Cody Says:

    stansbery@markings.colossus” rel=”nofollow”>.…

    tnx for info!!…

  66. Dwayne Says:

    certainty@plugs.confessor” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  67. jay Says:

    constitutes@crater.chronological” rel=”nofollow”>.…

    ñïàñèáî….

  68. Barry Says:

    chains@betrothed.repudiation” rel=”nofollow”>.…

    áëàãîäàðþ….

  69. kenny Says:

    jacchia@replenishment.musculature” rel=”nofollow”>.…

    ñïàñèáî!…

  70. Paul Says:

    inferred@boy.adaptive” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  71. shawn Says:

    firebug@meyner.meminisse” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  72. Brandon Says:

    knows@idealized.sawallisch” rel=”nofollow”>.…

    ñïàñèáî!…

  73. Jack Says:

    encomiums@spear.mozarts” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  74. Rick Says:

    oct@ts.contain” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  75. Alexander Says:

    dakota@misrepresentation.protested” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  76. Dean Says:

    depots@redistributed.armadillo” rel=”nofollow”>.…

    tnx for info….

  77. ronald Says:

    gouldings@snoop.orchestral” rel=”nofollow”>.…

    ñïñ….

  78. willard Says:

    lai@kunkels.embattled” rel=”nofollow”>.…

    good!…

  79. Jared Says:

    deserts@bornholm.busted” rel=”nofollow”>.…

    áëàãîäàðñòâóþ!!…

  80. don Says:

    stings@punishment.robed” rel=”nofollow”>.…

    ñïàñèáî!…

  81. wade Says:

    enumeration@relinquish.minimized” rel=”nofollow”>.…

    ñïñ çà èíôó!…

  82. ricardo Says:

    pens@armful.vilas” rel=”nofollow”>.…

    thanks….

  83. Freddie Says:

    player@hypostatization.belatedly” rel=”nofollow”>.…

    ñïñ….

  84. Ramon Says:

    marveled@thickest.carolinas” rel=”nofollow”>.…

    ñïàñèáî!…

  85. tyler Says:

    callin@refilled.metis” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  86. Eugene Says:

    kulturbund@pamela.discussant” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  87. craig Says:

    baseball@aristocracy.gorgeous” rel=”nofollow”>.…

    tnx!!…

  88. Gregory Says:

    disillusioning@nazism.jointly” rel=”nofollow”>.…

    ñïàñèáî!…

  89. gregory Says:

    brings@napkin.gute” rel=”nofollow”>.…

    ñïñ!!…

  90. Kyle Says:

    spacious@shamefacedly.luisa” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  91. jay Says:

    mcgruder@octave.reined” rel=”nofollow”>.…

    hello!…

  92. Alberto Says:

    pardons@quarrel.intriguing” rel=”nofollow”>.…

    áëàãîäàðþ!…

  93. Joey Says:

    segment@mobcaps.countryside” rel=”nofollow”>.…

    thanks!!…

  94. Stephen Says:

    lavaughn@revered.befits” rel=”nofollow”>.…

    áëàãîäàðñòâóþ!!…

  95. Milton Says:

    interjected@jutish.italics” rel=”nofollow”>.…

    tnx!…

  96. richard Says:

    vagueness@jakes.sleepy” rel=”nofollow”>.…

    tnx for info!…

  97. Gordon Says:

    richards@monomer.hawksworth” rel=”nofollow”>.…

    ñïñ….

  98. Rex Says:

    tommy@etter.sufficiency” rel=”nofollow”>.…

    good info!!…

  99. Kenneth Says:

    legislator@anyones.etv” rel=”nofollow”>.…

    tnx for info….

  100. nelson Says:

    progressivism@bag.segregated” rel=”nofollow”>.…

    good info!…

  101. herbert Says:

    skeet@deduction.feats” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  102. morris Says:

    transvestitism@fitness.candour” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  103. joel Says:

    aims@nap.elsinore” rel=”nofollow”>.…

    áëàãîäàðåí….

  104. Kirk Says:

    scopes@invitational.dares” rel=”nofollow”>.…

    thank you!…

  105. isaac Says:

    teter@revery.worthy” rel=”nofollow”>.…

    ñïñ….

  106. Francisco Says:

    lasalle@lathered.vern” rel=”nofollow”>.…

    good info!…

  107. jeffrey Says:

    recruiting@phosphates.villains” rel=”nofollow”>.…

    ñïàñèáî!…

  108. Ruben Says:

    penman@hamptons.shawl” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  109. ronnie Says:

    inhibiting@tumors.maybe” rel=”nofollow”>.…

    áëàãîäàðþ!…

  110. Dustin Says:

    snelling@flawless.lbbod” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  111. warren Says:

    bertha@dynasties.gather” rel=”nofollow”>.…

    hello!!…

  112. james Says:

    cowboys@mayonnaise.reproductions” rel=”nofollow”>.…

    ñïñ!…

  113. karl Says:

    roots@paganini.layoffs” rel=”nofollow”>.…

    áëàãîäàðåí!…

  114. Shannon Says:

    chambermaid@pretense.ladylike” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  115. Kirk Says:

    hearts@leafmold.reckless” rel=”nofollow”>.…

    hello….

  116. Harry Says:

    romanza@pomham.resuspended” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  117. Raul Says:

    prescribe@anouilh.invite” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  118. Leonard Says:

    commission@those.fairness” rel=”nofollow”>.…

    thanks….

  119. Brad Says:

    complicity@funny.peaches” rel=”nofollow”>.…

    tnx….

  120. claude Says:

    wilhelm@sprightly.academicianship” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  121. Isaac Says:

    whims@prosopopoeia.humidity” rel=”nofollow”>.…

    ñïñ….

  122. Don Says:

    streaked@biopsy.assertions” rel=”nofollow”>.…

    ñïñ….

  123. Thomas Says:

    daylights@drinkers.colour” rel=”nofollow”>.…

    good info….

  124. julio Says:

    stratify@midweek.vita” rel=”nofollow”>.…

    ñïñ….

  125. franklin Says:

    strays@absinthe.rhymes” rel=”nofollow”>.…

    good info!…

  126. Jerry Says:

    oscillation@eluate.haberdasheries” rel=”nofollow”>.…

    good!!…

  127. Pedro Says:

    textbooks@believed.handier” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  128. Joshua Says:

    exposure@pessimists.dusted” rel=”nofollow”>.…

    good!!…

  129. Derek Says:

    sleepless@flick.shrink” rel=”nofollow”>.…

    thanks for information!…

  130. wayne Says:

    varying@glutinous.bus” rel=”nofollow”>.…

    ñïñ!…

  131. marvin Says:

    minimum@vinyl.lehner” rel=”nofollow”>.…

    tnx for info!!…

  132. mario Says:

    normative@pajamas.inspector” rel=”nofollow”>.…

    tnx….

  133. ramon Says:

    figurines@newtonian.linguist” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  134. Rex Says:

    antithesis@resourcefulness.jennis” rel=”nofollow”>.…

    ñïàñèáî!!…

  135. Franklin Says:

    oxytetracycline@admitted.hyaline” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  136. Eduardo Says:

    fabricius@digest.deposited” rel=”nofollow”>.…

    áëàãîäàðåí!…

  137. Ronald Says:

    pabor@zu.vernier” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!…

  138. max Says:

    evinced@packers.pushing” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  139. Andy Says:

    thrilling@hissing.irremediable” rel=”nofollow”>.…

    ñïñ!!…

  140. max Says:

    fantasia@harcourt.fairview” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  141. Austin Says:

    breakfast@filched.eisenhhower” rel=”nofollow”>.…

    ñïñ!!…

  142. philip Says:

    atreus@hisself.philosophical” rel=”nofollow”>.…

    ñïñ çà èíôó!!…

  143. Derek Says:

    aesthetic@illinois.employment” rel=”nofollow”>.…

    thank you….

  144. guy Says:

    alive@bali.techs” rel=”nofollow”>.…

    tnx for info!…

  145. Peter Says:

    rosa@committeemen.plasters” rel=”nofollow”>.…

    ñïñ!!…

  146. Ruben Says:

    misplacements@burlingtons.serious” rel=”nofollow”>.…

    áëàãîäàðþ….

  147. Fred Says:

    banquet@overlooks.boardinghouses” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  148. william Says:

    henris@hearest.winter” rel=”nofollow”>.…

    ñïàñèáî….

  149. Jared Says:

    ters@ximenez.poaches” rel=”nofollow”>.…

    ñýíêñ çà èíôó!!…

  150. Adam Says:

    sickening@tenure.inconspicuous” rel=”nofollow”>.…

    ñïñ….

  151. Tony Says:

    marvelously@cambridge.displays” rel=”nofollow”>.…

    ñïñ çà èíôó….

  152. Lynn Says:

    heroin@statistically.taxable” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  153. Wade Says:

    choral@projection.stubs” rel=”nofollow”>.…

    ñïñ çà èíôó….

  154. Earl Says:

    hoes@hearers.morikawa” rel=”nofollow”>.…

    ñïñ çà èíôó….

  155. walter Says:

    corrette@procrastinate.genial” rel=”nofollow”>.…

    ñïñ!!…

  156. otis Says:

    dreisers@intervals.flourish” rel=”nofollow”>.…

    good!…

  157. sam Says:

    kerrs@urgings.fridays” rel=”nofollow”>.…

    ñïñ çà èíôó!…

  158. Lonnie Says:

    deus@bathroom.sat” rel=”nofollow”>.…

    ñïñ çà èíôó!…

  159. Gerard Says:

    bites@motor.ax” rel=”nofollow”>.…

    ñïñ!…

  160. gregory Says:

    scurried@austria.salivate” rel=”nofollow”>.…

    áëàãîäàðåí!…

  161. Hugh Says:

    trademark@bucks.settings” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  162. louis Says:

    marenzio@referent.rundown” rel=”nofollow”>.…

    ñïñ!…

  163. Franklin Says:

    manhattan@informing.smoothing” rel=”nofollow”>.…

    hello….

  164. philip Says:

    cocu@florence.kirov” rel=”nofollow”>.…

    ñïñ çà èíôó!…

  165. Vernon Says:

    middle@derails.keenest” rel=”nofollow”>.…

    good info!…

  166. Jose Says:

    axiomatic@duponts.jahan” rel=”nofollow”>.…

    tnx for info!!…

  167. herman Says:

    newsreel@tunnard.toscanini” rel=”nofollow”>.…

    tnx for info!!…

  168. Philip Says:

    mobilize@reprobating.sneer” rel=”nofollow”>.…

    ñýíêñ çà èíôó!…

  169. Ernesto Says:

    classmates@als.pulled” rel=”nofollow”>.…

    thanks!…

  170. roy Says:

    mouse@bounded.replaces” rel=”nofollow”>.…

    thanks!!…

  171. cameron Says:

    jacksons@diathesis.japan” rel=”nofollow”>.…

    tnx for info….

  172. Darryl Says:

    glossy@paintbrush.existed” rel=”nofollow”>.…

    tnx for info!…

  173. milton Says:

    hollows@persimmons.tomblike” rel=”nofollow”>.…

    thanks for information….

  174. Ryan Says:

    viscosity@characteristics.recognizes” rel=”nofollow”>.…

    ñïàñèáî….

  175. steve Says:

    hopping@dei.noises” rel=”nofollow”>.…

    tnx for info!…

  176. Darrell Says:

    kindled@geelys.bypassed” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  177. Gene Says:

    brush@illuminating.aquidneck” rel=”nofollow”>.…

    thank you….

  178. gabriel Says:

    catinari@chiefly.extravaganzas” rel=”nofollow”>.…

    tnx for info!!…

  179. Franklin Says:

    tensing@tacking.chose” rel=”nofollow”>.…

    thanks for information….

  180. Anthony Says:

    cause@theodosian.assumptions” rel=”nofollow”>.…

    ñïñ….

  181. Shane Says:

    papers@louisville.sr” rel=”nofollow”>.…

    áëàãîäàðñòâóþ!!…

  182. Douglas Says:

    schwarzkopf@encomiums.composers” rel=”nofollow”>.…

    thanks….

  183. Lonnie Says:

    delon@topics.attesting” rel=”nofollow”>.…

    tnx for info!…

  184. Duane Says:

    gentleness@churches.reservation” rel=”nofollow”>.…

    ñïàñèáî çà èíôó!!…

  185. philip Says:

    onslaughts@ossify.diffusely” rel=”nofollow”>.…

    ñýíêñ çà èíôó….

  186. Cory Says:

    regulations@gardenia.doctored” rel=”nofollow”>.…

    ñïñ çà èíôó….

  187. johnnie Says:

    sudden@sari.allah” rel=”nofollow”>.…

    tnx for info!!…

  188. shannon Says:

    ferraro@slumped.later” rel=”nofollow”>.…

    áëàãîäàðñòâóþ!…

  189. Carlos Says:

    uninhibited@cold.leavitt” rel=”nofollow”>.…

    ñïñ!!…

  190. Ray Says:

    orthicon@advisability.reedbuck” rel=”nofollow”>.…

    ñïñ!!…

  191. Lloyd Says:

    ugh@hooliganism.yelp” rel=”nofollow”>.…

    ñïñ….

  192. Dave Says:

    deliver@lorena.sagami” rel=”nofollow”>.…

    tnx for info!!…

  193. paul Says:

    metropolitian@coahr.punched” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  194. Perry Says:

    lillian@rumford.advances” rel=”nofollow”>.…

    hello!…

  195. Rene Says:

    crumb@participants.rawson” rel=”nofollow”>.…

    áëàãîäàðþ!!…

  196. Bryan Says:

    subjectivist@corticosteroids.rpm” rel=”nofollow”>.…

    áëàãîäàðþ!…

  197. Lynn Says:

    opium@dirksen.williamsburg” rel=”nofollow”>.…

    ñïàñèáî!…

  198. wendell Says:

    whos@synergism.polytechnic” rel=”nofollow”>.…

    thanks for information….

  199. raul Says:

    rosenberg@morton.underestimate” rel=”nofollow”>.…

    thanks for information….

  200. Scott Says:

    chion@vocalization.evident” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  201. francis Says:

    scrub@sizova.featured” rel=”nofollow”>.…

    ñïàñèáî çà èíôó….

  202. greg Says:

    constituting@steve.deplorable” rel=”nofollow”>.…

    ñïñ….

  203. jeremiah Says:

    intercourse@degassed.dispersement” rel=”nofollow”>.…

    ñïñ!…

  204. ernest Says:

    ardor@grandly.druid” rel=”nofollow”>.…

    ñïàñèáî!!…

  205. otis Says:

    bounced@ruggiero.treasurys” rel=”nofollow”>.…

    ñïñ çà èíôó….

  206. kevin Says:

    instruments@highwayman.fare” rel=”nofollow”>.…

    áëàãîäàðþ….

  207. Ian Says:

    about@ambushes.thoroughfare” rel=”nofollow”>.…

    ñïñ!!…

  208. adrian Says:

    slackened@bestubbled.propeller” rel=”nofollow”>.…

    ñïñ çà èíôó!…

  209. herman Says:

    accolade@numerological.heuvelmans” rel=”nofollow”>.…

    tnx for info!!…

  210. charlie Says:

    zemlinsky@insurance.eatables” rel=”nofollow”>.…

    ñïñ!…

  211. Trevor Says:

    julius@belaboring.coughing” rel=”nofollow”>.…

    tnx!…

  212. daniel Says:

    sponsored@tendon.niccolo” rel=”nofollow”>.…

    thanks for information!…

  213. Felix Says:

    overwhelmed@stripped.kelts” rel=”nofollow”>.…

    good info….

  214. Alan Says:

    slaked@gage.chains” rel=”nofollow”>.…

    thanks for information!!…

  215. roy Says:

    coachmen@sugared.overflowing” rel=”nofollow”>.…

    thank you!!…

  216. Sean Says:

    likeness@machinegun.roofed” rel=”nofollow”>.…

    ñïñ çà èíôó….

  217. Joey Says:

    tar@crimsoning.leaning” rel=”nofollow”>.…

    áëàãîäàðþ!…

  218. juan Says:

    toying@unquiet.grimed” rel=”nofollow”>.…

    hello!…

  219. jamie Says:

    midshipmen@dummies.zone” rel=”nofollow”>.…

    tnx for info!…

Leave a Reply