Thursday, August 6, 2015

One font vulnerability to rule cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m all #2: Adobe Reader RCE exploitation

Posted by Mateusz Jurczyk of Google Project Zero

This is part #2 of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “One font vulnerability to rule cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m all” blog post series. In part #1 (“introducing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BLEND vulnerability”), we discussed how developments in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 digital typography field in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last four decades shaped cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 various font formats in use today, described cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two most commonly used PostScript formats (Type 1 and OpenType), outlined cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 structure of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ATMFD.DLL font program interpreter (shared between many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r products) and finally introduced cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “blend” operator vulnerability.

Today, we will focus on developing a reliable exploit for Adobe Reader using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security flaw, demonstrating how it could be successfully used to achieve arbitrary code execution within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 renderer process, and creating foundations for a full system compromise. Let’s get to work!

Exploitation of Adobe Reader

The overall goal I set for myself when starting to work on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proof of concept was to prepare a PDF file which would pop up calc.exe upon opening in Adobe Reader 11.0.10 (latest affected version) on Windows 8.1 Update 1, both 32-bit and 64-bit. It was supposed to be fully reliable against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific software build, elevate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Calculator process to high integrity level and/or NT AUTHORITY/SYSTEM security context, and work with all possible exploit mitigations enabled in user and kernel mode. This required a single exploit targeting Adobe Reader and two distinct second-stage exploits for 32-bit and 64-bit Windows kernels.

While in principle cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability may look easy to exploit due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 powerful primitives it provides, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 devil is in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 details, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some details that need to be worked out to construct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF exploit described above. First of all, while we can indeed set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “op_sp” pointer well outside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 local “op_stk” array and continue Charstring execution, not all operators will work cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n. Specifically, all operators moving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack pointer forward (i.e. pushing more data than loading) do check that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer does not go out of bounds. This makes our life considerably harder, as we lose access to a number of very useful data writing instructions, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most basic one being cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 regular numeric instruction, but also “dup”, “pop”, “callgsubr”, “random” and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs. An example of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bounds check executed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “random” instruction is shown below:

case RANDOM:
 if (op_sp >= &op_stk_end) {
   AtmfdDbgPrint("windows\\core\\ntgdi\\fondrv\\otfd\\bc\\t1interp.c",
                 6015, "stack overflow - ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rRANDOM", "false");
   goto label_error;
 }

However, among cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 multitude of supported operators, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are also some which do write to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack, but do not increase cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack pointer because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y also load more or equal amount of data from it. Such operators omit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 checks, which is a valid optimization, since if each increase of “op_sp” is (in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ory) properly sanitized, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 non-increasing instructions can safely assume at any point in time that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pointer is valid. Interestingly, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lack of this safety net makes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerability exploitable.

After inspecting all implemented commands, it turns out that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following stack-writing instructions can still be used with an out-of-bounds “op_sp”:

  1. NOT (Bitwise negation)
  2. NEG (Negation)
  3. ABS (Absolute value)
  4. SQRT (Square root)
  5. INDEX (Get indexed value from stack)
  6. EXCH (Exchange topmost values on stack)
  7. DIV (Division)
  8. ADD (Addition)
  9. SUB (Subtraction)
  10. MUL (Multiplication)
  11. GET (Get value from transient array)

Unfortunately, none of those instructions can be trivially used to write controlled data under cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack pointer. The arithmetic and logic instructions require somewhat controlled operands, but we obviously do not control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 memory we want to overwrite (that’s cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 whole point). Similarly, we cannot use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “index” instruction, as it replaces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top stack item with one x items below cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top – and again, we don’t control cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 x.

The only instruction we are left with is “get”, which replaces a 16-bit index residing under “op_sp” with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding value in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 transient array. Since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 index value is of limited width, my original idea was to specify a 65535 entry long transient array (via cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 /lenBuildCharArray field) and insert cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired value into all cells, effectively guaranteeing that regardless of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original value (interpreted as index), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 instruction would always write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired number to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack. While generally valid, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 approach has some significant downsides: it would require a huge overhead of 65 thousands of instructions stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file and executed for a single value insertion, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 index number is interpreted as a signed integer, with negative numbers being automatically rejected by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “get” implementation (this could probably be addressed with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “abs” instruction, though).

The general problem here is that we have no idea about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original value on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack being overwritten. However, if we look again at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above list of allowed operators, we can spot one that significantly reduces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 topmost value upon each execution - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “sqrt” instruction! The command treats cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 32-bit operand as a 16.16 Fixed value, and replaces it with an approximation of its square root. What’s also important is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 16-bit integer part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value overlaps with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 16-bit index used by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “get” instruction. Thanks to all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above, if we execute cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “sqrt” instruction subsequently for 5 times, we can be sure that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 16-bit number under “op_sp” will be one of two values:

  • 0 – if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value was originally zero.
  • 1 – ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise.

As a result, we have reduced cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 spectrum of all possible “get” parameters from 65536 to just 2, using only five instructions. Overall, this makes it possible to insert an arbitrary value anywhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thread’s stack by first putting it into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 transient array under indexes 0 and 1 (with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “put” command), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n moving “op_sp” to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 desired location using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable “blend” operator and invoking five “sqrt” instructions followed by a “get”.

The animation below illustrates cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 full process of writing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number 31337 to a stack location 400 bytes from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “op_stk” array:
an73_100.gif

While writing data to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack is an important capability, it is as important to be able to read data as well. This is primarily needed to defeat ASLR, which forces us to leak cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 base address(es) of module(s) in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 virtual address space and use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to calculate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 locations of ROP gadgets (for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 purpose of bypassing DEP). The goal can be accomplished in a similar way, by using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “put” instruction which is a counterpart of “get”, loading data from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 transient array. If we prepend cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “put” operator with five “sqrt”s, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 second topmost stack value will be inserted into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 transient array at index 0 or 1. In order to deterministically read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value back and operate on it, we first have to pre-initialize both entries with zeros, and after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operation takes place add cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 values togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r in order to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 final result.

After cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 read or write operation is performed somewhere up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack, it would be also useful to reset “op_sp” back to &op_stk[0], in order to process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newly acquired data or set up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execution context for writing anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r chunk, without having to worry about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “illegal” commands or destroying parts of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 already crafted ROP chain. This is possible with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “setcurrentpoint” instruction, which does exactly that (resets cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operand stack pointer back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 local stack array) without any side effects.

An example of reading a function pointer from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack and using it to calculate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 base address of an executable image with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above techniques is shown in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 animation below:
an90_100.gif

With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to perform arbitrary reads and writes anywhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack using cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Charstring program, we now have all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 primitives needed to reliably create a ROP chain and achieve arbitrary code execution in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandboxed process. In accordance to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 KISS rule, it would be easiest and most elegant to just perform a single call to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LoadLibrary function, with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 path of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit PDF file specified in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 argument. This should be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365oretically possible via a PE + PDF polyglot file, thanks to 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 “%PDF” magic bytes don’t have to be present at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very beginning of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 file, which would enable us to have both cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Adobe Reader exploit and a second-stage DLL written in C/C++ contained within cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same file. The feasibility of a PE/PDF polyglot has already been shown by Ange Albertini in his CorkaMIX proof of concept in 2012 [1]. Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are some problems with this idea:

  • In order to pass a string with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 input PDF file path to LoadLibrary, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 string or a (potentially relative) pointer to it would have to be present somewhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploited thread’s stack, which - according to our experiments - was unfortunately not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 case.
  • Even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above was not an issue, Adobe Reader recently began rejecting PDF files starting with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 executable “MZ” signature. The reason for this change in behavior is not clear to us, but it would effectively prevent our polyglot from being opened as a document, entirely blocking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack.

Consequently, we have to settle on a slightly less elegant (yet equally reliable) solution – a standard ROP chain enabling arbitrary code execution by marking cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker-controlled portions of memory as executable with a VirtualProtect API call, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n jumping to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code. In case of Adobe Reader, this required us to first resolve cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 address of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “VirtualProtectEx” function using CoolType’s internal implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GetProcAddress routine (first gadget), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 function with a PAGE_EXECUTE_READWRITE parameter and a pointer to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 location on stack where 1st stage payload was set up (second gadget), followed by a return to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 now executable shellcode. The final structure of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROP chain used in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proof of concept exploit is shown in Figure 1.

Figure 1. An example ROP chain used to achieve arbitrary code execution in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Adobe Reader renderer process.

The result of crafting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above chain with a payload consisting of a single “int3” instruction is illustrated below in Figure 2 – we have successfully achieved reliable RCE in Adobe Reader!

Figure 2. Successful reliable execution of 1st stage payload in Adobe Reader.

Even though we have now ended up at an assembly level, it should be still significantly more convenient to proceed with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack using C/C++ code – while developing a second-stage font related win32k.sys exploit in assembly is definitely possible, it’s also no fun at all. It would be best if we could get a controlled DLL loaded via a LoadLibrary call after all, even if it’s a “deferred” call made by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first stage payload and not directly from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ROP chain. There are two things that play to our advantage here: first of all, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 renderer process has an active HANDLE (with read access) to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit PDF file at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of exploitation. Secondly, while filesystem access is largely limited, especially in terms of write capabilities, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 renderer still does have write access to a temporary directory at “%APPDATA%\Adobe\Acrobat\11.0”.

In order to take advantage of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se conditions, we can create cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 aforementioned PE/PDF polyglot with a 2nd stage DLL by compiling it in Visual Studio with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 /STUB linker option pointing to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file with a valid DOS header prepended. This will result in having cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PDF file embedded in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PE file, sufficiently close to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning to be correctly opened by Adobe Reader. Due to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program’s behavior, we have to replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 “MZ” signature with some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r bytes, such as “mz”. With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above file prepared, we can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n perform cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following actions in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 assembly payload in order to call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DllMain function of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DLL module:

  1. Iterate over all possible HANDLE values within a reasonable range, e.g. range(0, 0x1000, 4).
  2. Call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 GetFinalPathNameByHandle API over each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in order to obtain cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding file path.
  3. When a path ending with “.pdf” is encountered, we have located cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploit file. Copy it to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 temporary directory at %APPDATA%\Adobe\Acrobat\11.0.
  4. Restore cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 original “MZ” signature to make it a valid PE file again.
  5. Invoke LoadLibrary over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new file, having our C++ DllMain function called.

As a result, we now have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to carry out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remainder of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack using a high level programming language. An example of displaying a message box dialog in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DllMain function in shown in Figure 3.

Figure 3. Working arbitrary C++ code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DllMain function of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 2nd stage DLL.

At this point, we have a PDF file reliably executing arbitrary C++ code in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of any Adobe Reader 11.0.10 installation. We can now proceed to developing a kernel attack in order to escape cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sandbox – in this case, however, we do have to differentiate between x86 and x64 platforms, as different exploits will have to be used. The necessary information regarding system bitness can be obtained with an IsWow64Process API call.

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next post, we will discuss how cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable code paths in ATMFD.DLL could be reached from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 context of a restricted Adobe Reader process, in order to repeat cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exploitation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 BLEND vulnerability and elevate our privileges in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 operating system.

References


No comments:

Post a Comment