Thursday, March 19, 2015

Taming cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild copy: Parallel Thread Corruption

Posted by Chris Evans, Winner of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 occasional race

Back in 2002, a very interesting vulnerability was found and fixed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apache web server. Relating to a bug in chunked encoding handing, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability caused a memcpy() call with a negative length with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 destination on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack. Of course, many parties were quick to proclaim cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability unexploitable beyond a denial of service. After all, a negative length to memcpy() represents a huge copy which is surely guaranteed to hit an unmapped page and terminate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process. So it was a surprise when a working remote code execution exploit turned up for FreeBSD and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r BSD variants, due to a quirk in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir memcpy() implementations! This GIAC paper archives both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit as well as an analysis (appendix D) of how it works.

For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purposes of this post, we define “wild copy” as a copy where both:
  • The attacker has limited control over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy.
  • The copy will always end up being so large as to be guaranteed to hit an unmapped page.

There have been plenty of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting cases where a wild copy has ended up being exploitable:
  • A general attack against corruption of structured exception handlers (SEH) on Windows.
  • The BSD variants don’t have a monopoly on memcpy() quirks. In 2011, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re was a fascinating outright eglibc vulnerability in Ubuntu, triggering for any very large length to memcpy(). A memset() variant was exposed via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chromium Vulnerability Rewards Program.
  • The Java Runtime Environment has a very complicated crash handler installed, which is called when a wild copy inevitably causes an access violation. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash handler is not careful to be robust in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 presence of arbitrarily corrupted heap state, it might crash itself in a more controlled and exploitable way.

All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above cases have one thing in common: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild copy becomes exploitable due to a secondary issue or quirk.

Is it possible to exploit a wild copy without relying on a secondary issue? This is an interesting question for Project Zero to tackle -- when we explore exploitation, we usually only do so for cases where we think we can learn new insights or advance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 art. Today, we’re going to explore a wild copy exploit in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash plug-in for 64-bit Chrome Linux.

It’s time to introduce issue 122 and “parallel thread corruption”. Issue 122 is an Adobe Flash vulnerability that was fixed back in November 2014. It’s a curious bug wherein cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 G711 sound codec is straight up broken on some platforms, always resulting in a wild copy when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 codec tries to decode some samples. When triggered, it causes a memmove() on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap with a small negative value as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length parameter. On modern Linux, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memmove() implementation appears to be solid, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inexorable SIGSEGV appears to take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process down cleanly. We have our work cut out!

Step 1: choose an approach

We’re going to attempt a “parallel thread corruption”, which is where we observe and abuse cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 side effects in thread A of an asynchronous memory corruption in thread B. Since thread B’s corruption will always end in a crash, we need to run both threads in parallel. We also need to win a tricky race condition: get code execution before thread B’s crash takes out thread A.
As is common in Flash exploits, we’re going to attempt to have our memory corruption corrupt cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header of a Vector. buffer object, expanding its length beyond reality thus leading to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to read and write out of bounds. Vector. buffer objects have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir data allocated inline after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header, and in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case of this specific vulnerability, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 errant memmove() always ends up shifting memory content backwards by 2048 bytes. So if we allocate a large enough Vector., we can attempt to corrupt its header with its own data:

| len: 2000 | some ptr | data[0] = 0, data[1] = 0, …, data[508] = 0xfee1dead, … |
      ^                                                          |
      |-----------------------------------------------------------

The offsets and alignments work out such that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 508th 4-byte uint data element will clobber cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 header.

Step 2: wrestle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap into submission

Before we get too carried away, we need to remember that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corruption thread is going to be in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle of a wild memmove(). Even my laptop can copy memory at a rate of almost 10 gigabytes per second, so we’re going to need to land cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy on to a large runway of heap so that we have enough time to complete cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy hits an unmapped page. Getting a large, contiguous heap mapping sounds easy but it is not. If you naively just spray cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap with 512KB ByteArray buffers, you’ll see a large number of process mappings looking like this:

7fd138039000-7fd138679000 rw-p 00000000 00:00 0
7fd138679000-7fd139039000 ---p 00000000 00:00 0
7fd139039000-7fd139fb9000 rw-p 00000000 00:00 0
7fd139fb9000-7fd13a039000 ---p 00000000 00:00 0
7fd13a039000-7fd13ae79000 rw-p 00000000 00:00 0
7fd13ae79000-7fd13b039000 ---p 00000000 00:00 0
[...]

At first glance, as security professionals, we might proclaim “great! guard pages!” but what we are looking at here is an accidental inefficiency of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap. When trying to extend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 limit of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap forwards and failing due to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r mapping being in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way, it lets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system decide where to put a new mapping. The default Linux heuristic happens to be “just before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last successful mapping”, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap will enter a permanent cycle of failing to extend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap forwards. The “guard pages” come from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fact that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap (on 64-bit) will reserve address space in 16MB chunks, and commit regions of that as needed, and with granularity of 128KB. It’s quite common for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 series of commit requests to not add up exactly to 16MB, leaving a hole in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address space. Such a hole will cause a crash before our exploit is done!

To avoid all this and try and obtain a heap that grows forward, we follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following heuristic:
  1. Allocate a 1GB object, which will be placed just before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current heap region.
  2. Spray 4KB allocations (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash heap block size) to fill in existing free blocks.
  3. Spray some more 4KB allocations to cause cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap to extend backwards, into a new 16MB region allocated before cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 1GB object.
  4. Free cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 1GB object.

If all has gone well, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap will look something like this, with green representing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 space available for uninterrupted linear growth forward:

| committed: 1MB | reserved: 15MB     |         1GB hole         | committed: ~16MB | ...

Step 3: use heap grooming to align our exploitation objects

We’re now in good shape to use heap grooming to set up a row of important object allocations in a line, like this:

| 8KB buf | 8KB buf | 8KB buf | Vec.(2000) | Vec.(1000) | 100MB of bufs |
              .----- wild copy -------------------------------------------------->

In red is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vector we decided to corrupt in step 1, and in green is an object we will deliberately free now that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap is set up. Before we proceed, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re’s one more heap quirk that we need to beware of: as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap is extended, inline heap metadata is also extended to describe all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new 4KB blocks. This process of extending in-heap metadata creates free regions of blocks inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap. This wouldn’t be an issue, but for anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r quirk: when a block range is returned to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap free list, it isn’t reallocated in MRU (most recently used) order. Therefore, we mount anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r heap spray to make sure all 8KB (2 block) heap chunks are allocated, leaving that particular freelist empty. We cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n free cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle 8KB buffer (in green above) to leave a heap free chunk in a useful place. Since we leave two allocated 8KB buffers eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r side, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 freed chunk will not be coalesced and will be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 chosen option for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next 8KB allocation.

After all that heap manipulation, we leave ourselves with a range of important objects lined up in a neat row, and with a preceding and free 8KB heap chunk primed to be re-used at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next opportunity.

Step 4: light cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fuse

It’s worth noting that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are platform specific differences in how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sound subsystem initializes. On some platforms, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsystem initializes and starts asynchronously when play() is called for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first time. For cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chrome Flash plug-in, this is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case. If you look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit, you’ll see that we have to kick off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 subsystem by playing a different sound and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n returning to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main event loop. This dance ensures that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second call to play() actually does kick off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild copy asynchronously.

With our heap in nice shape, we trigger cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild memmove() by playing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 G711 sound. The wild copy will start immediately and proceed asynchronously so we need to get a move on! The G711 sound decoder object is about 4424 bytes in size, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap allocation granularity for sizes >= 4096 is 4096. So, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object will be placed in an 8192-sized chunk -- specifically cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one we just freed up if all is well. The wild heap corruption will start within this object and proceed forwards, very quickly corrupting all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following objects that we lined up, including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Vector. and Vector..

The moment we’ve pulled cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trigger, we spin in a tight ActionScript loop that waits for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 length of our Vector. to change from 2000 to 0xfee1dead.

Step 5: defeat ASLR

The moment we detect cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corrupted Vector., we are in business: we can read and write arbitrary 4-byte values off-cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365-end of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object. As per cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heap grooming in step 3, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 object directly off cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 end is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer for a Vector., which is ideal for us because it contains two important things for us to read:

  • A vtable value into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash library, which gives us cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code.
  • A pointer to itself, which is very important because it allows us to turn a relative read/write into an absolute read/write.

Step 6: ROP-free code execution

The exploit proceeds not via a ROP chain, but by rewiring some function pointers in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GOT / PLT machinery. (Note that this relies on RELRO not being present, which it rarely is on common Linux variants and binaries. If RELRO were present, we’d likely simply target vtable pointer rewiring instead.) We have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of a vtable, and from this, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GOT / PLT function pointers we want are a fixed offset away. There is quite an elegant and simple sequence to get us code execution:

  • Read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointer for memmove(), which we know is resolved.
  • Calculate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of __libc_system, which is a fixed offset from __memmove_ssse3_back which we just read.
  • Write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of __libc_system to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function pointer for munmap().

The effect of this wiring is that when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program next calls munmap(buffer), it will actually be calling system(buffer). This is a useful primitive because large ByteArray buffers are backed by mmap() / munmap(), and we can control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exact content of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buffer and when it is freed. So we can pass any string we want to system() at will.

Step 7: continuation of execution and sandbox

To illustrate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 level of control we now have over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process, our payload to system() is “killall -STOP chrome; gnome-calculator -e 31337”. This has two effects:

  • Displays cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 obligatory calculator to prove we have arbitrary code execution.
  • Sends a STOP signal to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 existing Chrome processes. This will have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 effect of stopping cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild memmove() before it has a chance to crash.

As a fun data point, if we attach to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stopped process and look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild copy thread, it has managed to copy 50MB(!) of data, even though we tried to make our exploit as fast and simple as possible.

At this point, a real exploit that didn’t wish to leave any traces could easily attach to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thread in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 middle of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy and stop cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 copy without having to kill cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thread. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory corrupted in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process of exploitation could be easily restored.

Of course, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox escape is left as an exercise to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user. The system() library call won’t work at all in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Chrome sandbox; when demonstrating cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit, we’re using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 --no-sandbox flag to focus purely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remote code execution aspect. An exploit inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox would instead likely rewire function pointers to attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IPC channels with bad messages, or deploy a ROP chain after all to attack cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kernel.

Closing notes

As always, Project Zero recommends that all memory corruptions are initially assumed to be exploitable. As we showed before in our posts on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Pwn4Fun Safari exploit, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 glibc off-by-one NUL byte corruption and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Flash regex exploit, situations that initially look dire for exploitation can sometimes be turned around with a trick or two.

Wild copies have a long history of being declared unexploitable, but based on our findings here, we think it likely that most wild copies in complicated multi-threaded software (browsers, browser plug-ins) are likely to be exploitable using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parallel thread corruption method. We publish this finding to encourage developers and vendors to triage wild copies as more serious than previously believed.

4 comments:

  1. Hey,

    Here are two interesting links. The first blog post was written by a collegue of mine at Census and deals with memcpy() and thread preemption debugging using SystemTap:

    http://census-labs.com/news/2014/11/06/systemtap-unbound-overflow/

    The second is yet anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting memcpy() case:

    http://www.halfdog.net/Security/2011/ApacheModSetEnvIfIntegerOverflow/DemoExploit.html

    ~hk

    ReplyDelete
    Replies
    1. Hello everyone. There is a new way of making cash, although it is illegal but also a smart and easy way of living big. I used to be a barrack boy until i became eager and decided to change my life one way or cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r. I got opportune to register for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 militant amnesty through connection cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reby taking me out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 country for training in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 United States for a period of 2years. To cut cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 story short, during my training i meant some white friends who were geeks and also experts at ATM repairs, programming and execution who taught me various tips and tricks about breaking into an ATM. with my knowledge gained from my white geek friends, i have been able to counterfeit and program a blank ATM card using various tools and software. I have ready-made programmed ATM cards or if you want to learn you are also free to contact me. This is no scam. I am just 24 and i have cash, i have a car, i live in Africa and i travel all around cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world. i do my things on a low key to avoid suspicion. Some of you will wonder why i am selling this out if truly i am already living large. It is because it is hard task doing it yourself, i wont lie to you, it is not easy to hack ATM talk more of to reprogrammed cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 card alone. It takes days and sometimes weeks. Some of you will want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ready made card to avoid cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stress of doing it yourself and i don’t give cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ready made card out for free because i spent days trying to make it available for you. e-mail me. johnsonatmblackmagiccreditcard@yahoo.com for more information, explanation and inquiries.
      NOTE: cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ATM card has no pin, no registered account number. It has no limit for withdrawal and it is untraceable. You can collect money from any account just by typing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 persons account number. so contact me with my email: johnsonatmblackmagiccreditcard@yahoo.com OR Call +2348104244364.

      Delete
  2. This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.

    ReplyDelete
  3. This comment has been removed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 author.

    ReplyDelete