Tuesday, October 8, 2019

The story of Adobe Reader symbols

Posted by Mateusz Jurczyk, Project Zero

Modern day security analysis of client applications is often hindered by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 inaccessibility of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir source code and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r aids such as debug symbols. As a result, it is necessary to perform completely black-box reverse engineering of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software, in order to better understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir internals and reconstruct cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 missing context information, which is required to identify security flaws, triage and deduplicate crashes and so forth. This part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process may be quite daunting, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time spent on manual labor takes away from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time that could be spent testing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 security properties of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program. Or in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r words, it could be considered a waste of time. :-)

On 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 hand, it is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 researcher's responsibility to effectively use all available resources to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir benefit. For very mature software with a long release history, e.g. dating back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 '90s, one such resource may be old versions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 program and/or builds for ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r platforms than currently supported. While such versions are of little use to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 average user right now, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y may contain artifacts that are invaluable for a bug hunter. In many cases, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 core of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application under inspection doesn't change or changes only slightly over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 years, so whatever ancillary information we are able to find is frequently applicable to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest version at least to some degree. Given cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above, I would recommend all security researchers to perform this extra "recon" step early in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process, as it may save one a lot of time and energy later on.

In this post, I will focus on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 metadata found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old and exotic versions of Adobe Reader.

Adobe Reader debug symbols

The specific type of information I am usually after are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 debug symbols. As cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name suggests, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se are designed to aid debugging of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers, and depending on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir type, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y may reveal internal names of functions, enums and source files, as well as full function prototypes, structure layouts and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r interesting data. Even just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most basic type of symbols (including only function names) are greatly helpful, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y provide insight into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific purpose of each area of assembly code, and enable cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 generation of pretty stack traces while triaging crashes.

On Windows, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Microsoft Visual C++ (MSVC) compiler generates symbols in external .pdb files, e.g. an output Program.pdb file created in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same directory as Program.exe. To my best knowledge, Adobe has never shipped cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pdb files corresponding to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 executable programs and libraries. Older compilers also had an option to embed symbols in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DBG format into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 executables, but I haven't found any signs of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in Reader, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows builds seem to never have included any debug symbols at all.

However on Linux, macOS and ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r unix-family systems, symbols can be embedded directly in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 executable files, which makes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m more prone to being shared publicly by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendor when releasing compiled software, intentionally or unintentionally. This is what has been happening with some components of Adobe Reader for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last 20+ years. It's worth noting that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 information has been circulating in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 community for a while (see @nils' tweet from 2013 or slide 16 in Sebastian Apelt's presentation on XFA from 2016), but I find it interesting enough to try to make it even more widely known.

To get a reasonably complete picture of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 situation, I decided to analyze cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integral executables and libraries of Adobe Reader, across versions dating back to 1997. The components I chose were some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most frequently researched/exploited ones: acroread (cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 main program), AGM (Adobe Graphics Manager), CoolType (Typography Engine), BIB (Bravo Interface Binder), JP2K (JPEG2000 Core Library) and rt3d (3D Runtime).

In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past, Adobe used to release Reader for a variety of Unix-based and Unix-like systems, such as SunOS, IRIX, OSF/1, HP-UX, AIX and Linux. Copies of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 packages could be downloaded from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ardownload.adobe.com HTTP server or from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ftp.adobe.com FTP server. Specifically, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y were served from ftp.adobe.com/pub/adobe/reader/unix and ftp.adobe.com/pub/adobe/acrobatreader/unix; cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter address doesn't seem to work at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of this writing, but its archived version is available at https://web.archive.org (and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 corresponding path on ardownload.adobe.com). Some SunOS packages were also served from ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r locations. After acquiring all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se builds/versions starting with 3.x (thanks Gynvael for helping with this), I devised cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following table, which summarizes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results of my analysis:



Adobe Reader for Unix (SunOS, IRIX, OSF/1, Solaris, HP-UX, AIX, Linux)

3.x
4.x
5.x
7.x
8.x
9.x

1997-1998
1999-2000
2002-2005
2005-2007
2007-2010
2009-2013
acroread
Not stripped
Not stripped
Not stripped
Not stripped
Not stripped ²
Not stripped ²
AGM
Not stripped
Not stripped
Not stripped ¹
Not stripped ¹
Stripped
Stripped
CoolType
Missing
Not stripped
Not stripped ¹
Stripped
Stripped
Stripped
BIB
Missing
Missing
Not stripped ¹
Not stripped ¹
Stripped
Stripped
JP2K
Missing
Missing
Missing
Not stripped
Not stripped
Not stripped ⁴
rt3d
Missing
Missing
Missing
Not stripped ³
Not stripped ²
Not stripped ²
¹ AIX and HP-UX builds only, stripped ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise
² SunOS builds only, stripped ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise
³ In versions 7.0.8+, missing before
⁴ Up to versions 9.5.4, stripped in 9.5.5

Support for unix-based systems was discontinued after version 9.5.5 in 2013. As you can see, all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above modules had symbols available for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m at some point in time. For CoolType, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 last revision of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 public symbols is from 2005; for ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are much more recent versions from 2013. Note, even cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 2005 version of CoolType is very useful; it helped me understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internals of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenType CharString interpreter during 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 research in 2015.

When it comes to macOS, I initially believed that on that platform, only cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JP2K and 3D modules had ever been released with any debug information. After more thorough inspection, I discovered that that assumption was wrong, and symbols for all ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r major components were also found in Reader 7.x, 8.x, 9.x and DC for Mac. To address this new information, we published a follow-up blog post: Part II: Returning to Adobe Reader symbols on macOS.

Putting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbols to use

In my opinion, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbols are most useful for getting a better and quicker understanding of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code base, be it for an in-depth analysis of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software or for harnessing it for better fuzzing. In such case, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are two options: eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r target cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 older, symbolized binary during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 audit/fuzzing and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n try to reproduce cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results against cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest version, or try to transfer cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old symbols onto cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new library and operate on that. While cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latter option sounds much more reliable (it eliminates potential false positives and false negatives), I have found it difficult to port symbols between two similar modules compiled at a different time, for different platforms and/or with different compilers. I have tested BinDiff and Diaphora.

Anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r option is to manually copy cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 names to IDA specifically for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions and objects being examined in one's research project, using a side-by-side view with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbolized version. Doing it for a whole library might be a considerable effort (for instance cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 latest JP2KLib.dll in Reader has more than 3300 functions), but chances are only a small subset of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbols will be needed in practice. Furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rmore, once an .idb with a large number of recognized symbols is created incrementally over a few weeks, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se symbols are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n easily cross-diffed to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 next build released each Patch Tuesday, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are only minor changes between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.

Let's have a look at an example. Project Zero issue #1892 is a recent heap corruption bug in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JP2KLib.dll library. After opening cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 poc.pdf file in Reader, WinDbg reports cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following stack trace:

[...]
JP2KLib!JP2KCopyRect+0x17ce9:
1111cee9 c6040100        mov byte ptr [ecx+eax],0       ds:002b:fff3a008=??


0:000> k
 # ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
00 0473cb28 1111cfea JP2KLib!JP2KCopyRect+0x17ce9
01 0473cb8c 1111b4ff JP2KLib!JP2KCopyRect+0x17dea
02 0473cbf8 1111898e JP2KLib!JP2KCopyRect+0x162ff
03 0473cd7c 1110d2af JP2KLib!JP2KCopyRect+0x1378e
04 0473cdf0 1110d956 JP2KLib!JP2KCopyRect+0x80af
05 0473ce54 1110dc90 JP2KLib!JP2KCopyRect+0x8756
06 0473ce78 11125e4a JP2KLib!JP2KCopyRect+0x8a90
07 0473ced8 5fafb5be JP2KLib!JP2KImageDecodeTileInterleaved+0x2a
08 0473cf64 5fac449b AcroRd32!AX_PDXlateToHostEx+0x32046e
09 0473d05c 5f9d828d AcroRd32!AX_PDXlateToHostEx+0x2e934b
0a 0473d0a0 089ada8c AcroRd32!AX_PDXlateToHostEx+0x1fd13d
[...]

Not very useful, is it? The only correctly recognized symbol is JP2KLib!JP2KImageDecodeTileInterleaved, which is an exported function. Unfortunately, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same crash doesn't reproduce on macOS, so we cannot readily get a symbolized call stack from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, but we can still use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 AdobeJP2K Mach-O file to recreate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbols on Windows. Let's open both JP2KLib.dll and AdobeJP2K in IDA, and start from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 JP2KImageDecodeTileInterleaved entry point:




We can clearly rename sub_1004DC58 to IJP2KImage::DecodeTile, or more specifically __ZN10IJP2KImage10DecodeTileEiiiiiP14IJP2KImageData, which is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 mangled C++ name of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 method. Moving on:




There are two overloaded IJP2KImage::DecodeTile methods, in our case cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first one was called when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process crashed. Let's rename sub_1004D91F and look inside it:




Without much doubt, sub_1004D159 is anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r implementation of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 overloaded IJP2KImage::DecodeTile. We can rename it and continue with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same steps until we reach cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crashing location in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 library. In this specific case, I had to look up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 top-level function in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack trace in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Linux symbolized version of libJP2K.so, as it was inlined by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 compiler in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 macOS build.

Once all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions we are interested in are named in our database, we can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IDA debugger with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 WinDbg backend to open cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proof-of-concept file in Adobe Reader again. Now, that looks much better:


I have looked and asked for ways to export cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 symbol information from IDA so that it could be used in WinDbg directly. Relevant projects I have found or were recommended are listed below:

Unfortunately, none of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 above fully met my expectations; some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m were posted as proof-of-concept / ad-hoc kind of tools, some threw inexplicable errors, some required manual fixes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code, etc. This seems like a gap in tooling that I and many ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs would like to see closed. :-) Since I didn't find a satisfying solution, I will stick with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IDA debugger for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time being.

Let's take a look at anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r example, issue #1888. This time cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 crash occurs in CoolType.dll:

CoolType!CTCleanup+0x22e92:
51ebd2a0 89048e          mov dword ptr [esi+ecx*4],eax ds:002b:520d4000=00000000


0:000> k
 # ChildEBP RetAddr  
WARNING: Stack unwind information not available. Following frames may be wrong.
00 052fc0f0 51ebd214 CoolType!CTCleanup+0x22e92
01 052fc12c 51ebdabd CoolType!CTCleanup+0x22e06
02 052fc16c 51ec8219 CoolType!CTCleanup+0x236af
03 052fc1a0 51e68e68 CoolType!CTCleanup+0x2de0b
04 052fc8c4 51e64051 CoolType!CTInit+0x460e1
05 052fc9a8 51e9e7bb CoolType!CTInit+0x412ca
06 052fcb00 51e9e47f CoolType!CTCleanup+0x43ad
07 052fcb7c 51e769cd CoolType!CTCleanup+0x4071
08 052fcd44 51e7619f CoolType!CTInit+0x53c46
09 052fce14 51e75091 CoolType!CTInit+0x53418
0a 052fd1dc 51e74728 CoolType!CTInit+0x5230a
0b 052fd21c 51e73751 CoolType!CTInit+0x519a1
0c 052fd388 51e732e4 CoolType!CTInit+0x509ca
0d 052fd3dc 52192182 CoolType!CTInit+0x5055d
0e 052fd724 52190fc8 AGM!AGMInitialize+0x69352
0f 052fd884 5215bcd0 AGM!AGMInitialize+0x68198
[...]

Again, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 stack trace is quite obscure. To make things worse, we don't have an obvious starting point for analysis, as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first CoolType function called by AGM.dll is not an exported symbol. However, when manually looking through cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 disassembly of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se functions, my familiarity with font engines let me recognize that CoolType!CTInit+0x460e1 is in fact cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenType CharString interpreter, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 largest function in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 library that goes by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name of DoType1InterpretCharString (see this blog post for details). Once we've identified one function, we can follow cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 call stack upwards and downwards to try to match furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r names. In this case, we can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CoolType symbols from Reader 4 and Reader 5, Microsoft's symbols for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DWrite.dll and fontdrvhost.exe images, and Apple's symbols for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 libType1Scaler.dylib library. All of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m share much of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same OpenType handling code.

When we are finished with renaming cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 functions and run Reader again in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 IDA debugger against poc.pdf, we should see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following call stack at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 exception:


As shown, I have successfully reconstructed most of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 CoolType stack trace entries. I didn't manage to match symbols above ATMBuildBitMap, as it was invoked through an indirect call that was impossible to follow back, and I didn't recognize any of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ancestor functions. Still, decoding cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 eight top-level names is very useful in itself as it helps us better understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 affected code and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way it fails to process cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 malformed data.

Of course, porting symbols between different builds of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same library might not always be possible due to code being constantly added, removed and modified over time, and due to imperfect bindiffing tools. However, it is worth being aware of this possibility. When such metadata is available, it may prove to be a real time saver and a great aid for reverse engineering. Not to mention all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fun provided by crawling cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Internet in search of obscure installers from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 1990's and 2000's, and digging into ancient or esoteric builds of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 software under inspection. :)