You are on page 1of 7

Enforcing Runtime Software Integrity by Finer-grained

Self-checking
Jiaxuan Wu Zheng Zhu
jasonwuee@gmail.com s222461@dtu.dk
Technical University of Denmark Technical University of Denmark
Kongens Lyngby, Copenhagen, Denmark Kongens Lyngby, Copenhagen, Denmark

ABSTRACT also many kind of attackers. The external Man-In-The-Middle


Detecting Man-At-The-End (MATE) attack remains an unsolved (MITM) attackers could want to gain control of a client or make
problem in the literature though many efforts have attempted to mit- a server inaccessible by sending malicious payloads. The MATE
igate its impact via active or passive defenses. In this work, we pro- attacker could want to gain unfair advantages in games by viewing
pose a new self-checking technique to prevent several mainstream or tampering related game data or using AI scripts to automatically
types of MATE attacks through program instrumentation and ker- control character movement.[22]Here, we only consider the MITM
nel level monitoring. We conducted a literature review within this or MATE attackers who want to violate software integrity at run-
topic to identify primary approaches. We recognized that it is high time. The primary literature on Windows has already approached
runtime overheads that causes there was no comprehensive defense the problem of detecting both control and non-control data attack
against various runtime data overwrite. While we use an asynchro- by enforcing data-flow integrity[7]. [7] use static analysis to com-
nous kernel monitor for self-checking, the time and space overhead pute a data-flow graph and then instruments the program to ensure
caused by instrumentation can be reduced a lot. The examples in that the flow of data at runtime is allowed by the data-flow graph.
the evaluation section showed that our approach can effectively pre- However, since the approach only consider the data-flow integrity,
vent the primary MATE attacks, including code injection, data-flow it cannot prevent finer grained control instruction overwritten or
data overwrite and control-flow data overwrite. critical data overwritten.
In this work, we propose a novel approach to identify and re-
KEYWORDS spond to program memory overwriting at runtime. We realize this
relying on static program analysis, static instrumentation and a
Man-At-The-End, MATE, Software Integrity Protection, Software
kernel level monitor. In static program analysis, we execute reach-
Hardening, Data-flow Integrity, Data-flow Analysis, Instrumenta-
ing definitions analysis, live variable analysis, and inter-procedural
tion
analysis to generate data flow graph [1]. After the compiler gener-
ate a intermediate representation, which is called gimple [12], it will
1 INTRODUCTION
instruments the program in order to compute the definition that
A major and well-known way of attack in computer security is actually reaches each use at runtime. At runtime, the instruments in
program vulnerabilities exploitation, which is a severe problem the reinforced program will communicate asynchronously with our
for several decades [15]. However, beside network attacks, there kernel monitor and the monitor will scan the memory space of the
is another type of attacks that could potentially lead to violation program to check whether anomaly memory overwrite happens. If
of safety and security goals of software systems. If an external or the answer is yes, it will raise an exception. Our solution will not
internal attacker already has full control over the host on which generate false positives; when we raise an exception, there is an
programs are being executed, they can implement serious attacks attack in process.
on software systems by inspecting a program’s execution or tam- The main contributions of our work are as follows:
pering with the host’s hardware or software. These attacks are
known as Man-At-The-End (MATE) attackers.[2]Typical exam-
ples of MATE attacks include, cheating in games, defeating license • We propose a new self-checking technique to prevent sev-
checks, tampering user or operational data in enterprise server, eral mainstream types of MATE attacks through program
and stealing proprietary data (musics and movies). What’s more, if instrumentation and kernel level monitoring.
program integrity can be ensured at runtime, the remote attacks • We did a systematic literature review, and identified the
that exploit program vulnerabilities can also be prevented at the primary studies relevant to prevent MATE attacks. We sum-
same time. Ensuring program integrity is therefore a prime con- marize four identified types of mitigation: code obfuscation,
cern for researchers and practitioners. In the last decade, several customization, self-checking, and trusted hardware.
approaches have been proposed in the literature to protect run- • We enforced three safety properties for self-checking: 1. the
time program integrity. These primary approaches explore code offset of the last definition should be a factor of least common
obfuscation[17], customization[5], self-checking or run-time pro- multiple (LCM) of all possible offset of definitions; 2. the
cess memory invariant checking[7, 19], and trusted hardware[6, 18] executed definition should be the original definition of the
with their subcategories. code; 3. the value of the variable should not be changed since
While the aforementioned techniques have been proven effective last definition.
on benchmarks, attackers have various goals and motives in reality. • We evaluate our approach with several attack cases in de-
Even we only consider online gaming as attack scenario, there are tail and show that our approach can effectively prevent the
1
Conference’17, July 2017, Washington, DC, USA Jiaxuan Wu and Zheng Zhu

Table 1: Full List of Collected and Examined Papers. of an executable might not apply to other customized versions.
Self-checking, also referred to as tamper-proofing, integrity check-
Author/Reference Year Citations Venue ing, and anti-tampering technology, is an essential element in an
effective tamper-resistance strategy. Self-checking detects changes
Aucsmith[5] 1996 527 Springer
in the program and invokes an appropriate response if change is
Collberg[10] 1997 1534 CSTR
detected. Our approach falls into the self-checking category.
Wang[20] 2000 271 ACM
Chang[8] 2001 374 ACM
Collberg[11] 2002 1201 IEEE
2 BACKGROUND AND DEFINITION
Petroni[19] 2004 738 USENIX In this section, we first introduce necessary knowledge of program
Castro[7] 2006 476 USENIX analysis and communication between user mode and kernel mode,
Nagra[17] 2009 520 Pearson Education two techniques used in our approach. Then, we carefully define
Baumann[6] 2015 919 ACM important concepts used in our study.

2.1 Data-flow Analysis


primary MATE attacks, including code injection, data-flow Data-flow Analysis is a kind of flow-sensitive intraprocedural analy-
data overwrite and control-flow data overwrite. sis. Flow-sensitive intraprocedural analysis [1] refers to an analysis
• We propose to use an asynchronous kernel monitor for self- or computation that takes into account the control flow in a pro-
checking, which can effectively reduce the time and space gram. This means that the analysis or computation is sensitive
overhead caused by instrumentation. to the order in which statements are executed and the conditions
We all put almost the same energy into this work. under which they are executed.

1.1 Literature Review Reaching definition. Reaching definition is one of the most com-
mon and useful data flow schemas. Using the terminology from [1],
Towards checking how far we are in runtime software integrity an instruction that writes to a memory position defines the value
protection, we performed a systematic literature review based on in the memory position, and an instruction that reads the value
the guidelines provided by[21] to understand the status quo. is said to use the value. The analysis computes the set of reaching
Keywords Identification. We resort to a set of keywords to search definitions for each use and assigns an identifier to each definition.
for relevant publications in popular repositories. It returns a map from instructions to definition identifiers and a set
• S1: software integrity protection of reaching definition identifiers for each use, which we call the
• S2: data flow integrity, data-flow analysis static data-flow graph.
• S3: software hardening In this paper’s context, We rely on a flow-sensitive intraproce-
dural analysis, which is called reaching definitions analysis [1] to
Paper Exclusion. As we aimed at collecting as many relevant pa- compute the static data-flow graph and determine the location to
pers as possible, we have simply considered all the returned results. insert the corresponding instrument.
However, not every paper is related to runtime software integrity
protection. We there go one step further to read the abstract (and 2.2 Interprocedural Analysis
full content if needed) of the obtained papers to only retain the
An interprocedural analysis operates across an entire program,
closely related ones by applying the following exclusion criteria:
flowing information from the caller to its callees and vice versa.
(1) Short papers (i.e., less than six pages in double-column format
For languages that pass parameters by reference, interprocedural
or 11 pages in single-column format) are excluded. (2) Papers not
analysis is needed to determine if the same variable is passed as two
targeting x86 architectures are excluded. (3) Papers not targeting
or more different arguments. Such aliases can create dependences
c/c++ language are excluded. (4) Papers targeting software integrity
between seemingly distinct parameters.
issues but that do not concern runtime protection are excluded. (5)
Context-sensitive Interprocedural Analysis means that data-flow
Papers with few citations are excluded. After applying these exclu-
analysis is required to take cognizance of what the sequence of pro-
sion criteria, there are 10 papers retained that are closely related to
cedure calls has been. That is, context-sensitive analysis includes
runtime software intrgrity protection, which are listed in table 1.
the current sequence of activation records on the stack, along with
Status Quo Analysis. The approaches against MATE attacks, the current point in the program, when distinguishing among dif-
moves around the four basic categories, i.e., code obfuscation[10, 17, ferent "places" in the program.
20], customization[5], self-checking or run-time process memory On the other hand, context-insensitive refers to an analysis or
invariant checking[7, 8, 11, 19], and trusted hardware[6, 18] with computation that does not take into account the context in which
their subcategories. Obfuscation attempts to thwart reverse engi- a piece of code is executed. This means that the analysis treats all
neering by making it hard to understand the behavior of a program instances of the code as if they are executed in the same context. In
through static or dynamic analysis. Customization takes one copy context-insensitive analysis, parameters and returned values are
of a program and creates many very different versions. Distributing modeled by copy statements.
Many different versions of a program stops widespread damage In this paper’s context, we choose to use context-sensitive inter-
from a security break since published patches to break one version procedural analysis with pointer analysis [05 Improving software
2
Enforcing Runtime Software Integrity by Finer-grained Self-checking Conference’17, July 2017, Washington, DC, USA

security with a C pointer analysis.] because the method is more goals are out of our scope. Runtime software integrity refers to
precise to allow it to scale to large programs. the integrity of executable code and memory space at runtime.
Online software, (or a web-based software) is a software that runs
2.3 Kernel-mode Driver on a server or a client that requires internet connection for full
Windows operating system includes both user-mode and kernel- functionality.
mode components (https://learn.microsoft.com/en-us/windows- Threats: In this scenario, reputation, financial gains, sabotage,
hardware/drivers/kernel/overview-of-windows-components). Kernel- fantasy of success and terrorism are non-exhaustive motivations
mode driver runs it code in kernel mode. Kernel-mode driver export for attackers to target the integrity of software systems. Here we
a specific call routine so that it can respond to specific calls from mainly consider two types of MATE attacks: local attack and remote
the operating system and can respond to other system calls. attack[2]. Local attackers can tamper with softwares at any stage
In this paper’s context, our kernel level monitor is actually a and at any where (on-disk, in-memory and in-execution). Remote
kernel-mode driver, whose driver entry identifier is 0x666. attackers do not require physical access to the system of interest and
they have the ability to exploit the vulnerabilities of the software
2.4 Asynchronous Communication which enable them to tamper with the integrity of the system.
Data transfers can be synchronous or asynchronous. The determin-
Goal: Our overall design goal is to protect the integrity of online
ing factor is whether the entry point that schedules the transfer
software system from local and remote MATE attacks. In detail, we
returns immediately or waits until the I/O has been completed.
need to prevent:
With an asynchronous I/O request to the kernel, the process is not
required to wait while the I/O is in process. A process can per- • Runtime code overwrite (local)
form multiple I/O requests and allow the kernel to handle the data • Runtime memory overwrite (local)
transfer details. • Runtime control flow data attack (remote)
• Runtime non-control flow data attack [9](remote)
2.5 Definition 1: Data-flow Integrity
Castro et al. introduced data-flow integrity (DFI) [7], a defensive
3.2 Overview
technique that aims to protect programs against non-control-data Data-flow data integrity reinforcement has both compile-time and
attacks. Firstly, DFI generates the data-flow graph (DFG) of the runtime components. Figure 1 illustrates how these components
program by static analysis, secondly, it instruments the program work from a top-down overview.
introducing data-flow integrity checks, and finally, it enforces at
runtime that the data-flow of the program is allowed by the DFG,
otherwise the execution is aborted.
Data-flow integrity. i.e., whenever a value is read, the definition
identifier of the instruction that wrote the value should be in the set
of reaching definitions for the read (if there is one), the definition
instruction should be the same as in the source code and remain Figure 1: Top-down overview
unchanged since the last definition.
The first phase uses static program analysis to compute a data-
2.6 Definition 2: Control-flow Integrity
flow graph for the target program. The second phase instruments
The CFI security policy dictates that software execution must fol- the program to ensure that the data-flow data is not overwritten
low a path of a ControlFlow Graph (CFG) determined ahead of and matches this graph. The third phase launches the reinforced
time [05 Control-Flow Integrity Principles, Implementations, and program. When one of the instruments is executed, it will launch
Applications]. an asynchronous system call to our kernel level monitor. Then the
Control-flow integrity. i.e., whenever a value is read, the compar- kernel level monitor will scan specific memory addresses of the
ison instruction should be the same as in the source code and the program to check whether anomaly memory overwrite happens. If
value should remain unchanged since the last definition. the answer is yes, it will raise an exception. Since our solution will
In this paper’s context, control-flow integrity check has been not generate false positives; when we raise an exception, there is
included in flow-sensitive data-flow analysis and context-sensitive an attack in process.
interprocedural analysis. Thus if data-flow integrity is not violated We will use the simple example in Fig 2 to illustrate how these
at runtime, then control-flow integrity is not violated. phases work.
The example shows a code fragment that is inspired by a vulner-
3 APPROACH ability in SSH[23] that can be exploited to launch both control-data
and non-control-data attacks [9].
3.1 Scenario, Threat and Goal In this example, we assume that Windows exploitation protection
Scenario: While there are various attack scenarios and goals that methods are turned off, such as ACG and StackPivot [16]. This
MATE attackers may pursue, here we particularly focus on attacks vulnerability could be exploited by both local MATE attack and
violating online software integrity at runtime; other attacker remote MATE attack to overwrite the return address of the function
3
Conference’17, July 2017, Washington, DC, USA Jiaxuan Wu and Zheng Zhu

Figure 2: Example vulnerable code snippet in C

or to overwrite authenticated. Control-flow data attack may allow


the attacker to gain control over the execution. While non-control-
flow data attack would allow the attacker to bypass authentication
and get its packet processed. In addition, local MATE attack can
modify the definition instruction, i.e. substitute line 1 to be int
authenticated = 1. We will show how our program data integrity
reinforcement approach can prevent all these attacks.
Figure 3: Example vulnerable code in GIMPLE intermediate
3.3 Static Program Analysis representation
In the first phase, we compute reaching definitions using a combina-
tion of two analyses: a flow-sensitive intraprocedural analysis and
a context-sensitive interprocedural analysis, which are introduced • __𝑐ℎ𝑒𝑐𝑘𝐷𝑒 𝑓 (𝑣𝑎𝑟 ): launch a system call with corresponding
in [1]. We plan to implement both analysis based on the GNU Com- entry for RDT as the parameter.
piler Collection (GCC) [14]. They operate on GCC’s intermediate
representation [12] . Figure 3 shows the GIMPLE representation The first instruction sets the Runtime Definition Table (RDT)
for the vulnerable C code in Figure 2. for var to id. The second one record the value of var after a definition
The intraprocedural analysis takes flow control into account. to RDT. The third one retrieves the runtime definition identifier
It is implemented by traversing the static single assignment repre- for var from the RDT and checks if the identifier is in the reaching
sentation [13] produced by GCC. We use this analysis to compute definitions set with name setName. The compiler maintains a map
reaching definitions [1] for uses of local variables that have no from set names to set values that is used when lowering the high-
definitions external to the function in which they are declared. The level instructions to the assembly of the target machine. Currently,
interprocedural analysis considers control-flow and it takes the we only target the x86 architecture but it would be simple to target
calling context into account when analyzing functions. We can other architectures with our high-level instrumentation.
use Andersen’s pointsto analysis [4] to compute the set of objects Figure 4 shows the GIMPLE for the vulnerable code with high-
that each pointer can point to, and we use these points-to sets to level instrumentation generated from the information computed
compute reaching definitions. by the reaching definitions analysis.
We applied the analysis to the sample code in Figure 3 using the Before describing how the high-level instrumentation is lowered
numbers at the end of the lines to identify definitions. The set of to assembly, we need to describe how we implement the RDT. To
reaching definitions is {5, 12} for both uses of authenticated (in lines enable efficient accesses, the RDT is implemented as an array with a
14 and 20). reserved 32-bit memory space for each variable in the instrumented
program. The exapmle RDT for variable authenticated is shown in
3.4 Instrumentation figure 5.
The program is instrumented to compute the definition that
We add instrumentation by inserting new high-level instructions reaches each read at runtime and to check if this definition is in
into the GIMPLE representation of the program. The instructions the set of reaching definition identifiers that was computed stat-
have the form: ically. To compute reaching definitions at runtime, we maintain
• __𝑠𝑒𝑡𝐷𝑒 𝑓 (𝑣𝑎𝑟, 𝑖𝑑): reserve relative offset of last definition the runtime definitions table (RDT) that records the identifier
and next definition to RDT; of the last instruction to write to each memory position. Every
• __𝑟𝑒𝑐𝑜𝑟𝑑𝐷𝑒 𝑓 (𝑣𝑎𝑟 ): reserve assigned value of last definition write is instrumented to update the RDT. The instrumentation be-
to RDT; fore reads uses the address of the value being read to retrieve the
4
Enforcing Runtime Software Integrity by Finer-grained Self-checking Conference’17, July 2017, Washington, DC, USA

__𝑟𝑒𝑐𝑜𝑟𝑑𝐷𝑒 𝑓 (_𝑎𝑢𝑡ℎ𝑒𝑛𝑡𝑖𝑐𝑎𝑡𝑒𝑑) instruction is lowered to:

__𝑐ℎ𝑒𝑐𝑘𝐷𝑒 𝑓 (_𝑎𝑢𝑡ℎ𝑒𝑛𝑡𝑖𝑐𝑎𝑡𝑒𝑑) instruction is lowered to:

From now on the instrumented code is no longer vulnerable to


the threats we defined in Section 3.1. We will show how we detect
and prevent each of these attacks in Section 4.

3.5 Kernel-level Monitor


Our kernel-level monitor is actually a customized kernel driver. The
overview of kernel-level monitor is shown in figure 6.

Figure 4: Example vulnerable code in GIMPLE with instru-


mentation
Figure 6: Overview of our kernel-level monitor

At runtime, the instruments in the reinforced program will com-


municate asynchronously with our kernel monitor and the monitor
will scan the memory space of the program to check whether anom-
aly memory overwrite happens. If the answer is yes, it will raise an
exception. Our solution will not generate false positives; when we
raise an exception, there is an attack in process.
Figure 5: Part of RDT for variable authenticated Kernel-mode tasks mainly do three kind of checks:
• test RDT[&authenticated_id+24] % RDT[&authenticated_id]
== 0: the offset of the last definition should be a factor of least
common multiple (LCM) of all possible offset of definitions;
• test baseaddress+RDT[&authenticated_id] ==
identifier from the RDT. Then, it checks if this identifier is in the RDT[&authenticated_id+8]: the executed definition should
statically-computed set. be the original definition of the code;
The high-level instrumentation is lowered to x86 assembly as il- • test &authenticated == RDT[&authenticated_id+16]: the
lustrated by the following examples. __𝑠𝑒𝑡𝐷𝑒 𝑓 (_𝑎𝑢𝑡ℎ𝑒𝑛𝑡𝑖𝑐𝑎𝑡𝑒𝑑, 12) value of the variable should not be changed since last defini-
instruction is lowered to: tion.
5
Conference’17, July 2017, Washington, DC, USA Jiaxuan Wu and Zheng Zhu

4 EVALUATION = 0;. So an exception will be raised to prevent the program from


To evaluate our data-flow integrity detection system, we address continuing.
the following research questions:
4.4 Compared to related works
• RQ1: Can data-flow integrity detection detect various MATE
attacks? We address this question by considering three sub- Through the previous three examples we have explained why our
questions: approach is effective against runtime code overwrite, data-flow
– RQ1.a: Can runtime code overwrite (local) and be detected data attack and control-flow data attack. However the approach
by our approach? described in [7] can only partially prevent data-flow data attack.
– RQ1.b: Can runtime data-flow data attack (local and re- The approach described in [3] can only partially prevent data-flow
mote) be detected by our approach? data and control-flow attack. The root cause is that in pursuit of
– RQ1.c: Can runtime control-flow data attack (local and low overheads, they cannot provide enough fine-grained memory
remote) and be detected by our approach? detection at runtime. Here we give anomaly detection tasks to a
• RQ2: How does our approach compare to primary works? kernel monitor asynchronously, so that our reinforced program
can executed forward with least system interruptions. Thus our
approach can provide more comprehensive instrumentation while
4.1 Detect Runtime Code Overwrite
ensuring low overhead in both time and space.
In this subsection, we will illustrate how we detect code overwrite at
runtime with the example we defined in Section 3.2. Code overwrite
4.5 Limitation
means attackers may change the instructions stored in the code
segmentation of the memory space while the program is running. No matter how powerful the system is, it will have its Achilles’
For example, a hacker may change the definition instruction in heel. The Achilles’ heel of our system is the integrity of RDT. If
the code segmentation int authenticated = 0; to be int authenticated the attacker can find the location of RDT and forge part of it to be
= 1;. Let see what would happen if the hacker does this. When the "normal data", our kernel level monitor can detect nothing. In order
instruction int authenticated = 1; is executed, the instrument __set- to solve this, we plan to use redundant design or customization
Def(_authenticated, 5); would record the instruction to the RDT. approach described in [5], so that MATE attackers can hardly write
Then when the variable is used in while (!authenticated), __check- a stable prove of concept (PoC) to tamper with RDT without been
Def(_authenticated); would be executed and launch a system call to detected.
our kernel monitor. Then it will find the instruction is inconsistent
with the original instruction int authenticated = 0;. So an exception 5 CONCLUSION
will be raised to prevent the program from continuing. We presented a new self-checking technique to prevent various
MATE attacks through program instrumentation and kernel level
4.2 Detect Runtime Data-flow Data Overwrite monitoring. Basically we enforced three safety properties: 1. the off-
Then we will illustrate how we detect data-flow data overwrite at set of the last definition should be a factor of least common multiple
runtime with the example we defined in Section 3.2. Data-flow data (LCM) of all possible offset of definitions; 2. the executed definition
overwrite means attackers may change the values of the variables should be the original definition of the code; 3. the value of the vari-
without definition while the program is running. able should not be changed since last definition. Previously, there
For example, a hacker may overwrite the definition instruction was no comprehensive defense against various runtime data over-
on the stack of PacketParser(packet); to be int authenticated = 1;. write because of high overheads. While we are confident that our
Then the instrument __setDef(_packet, 9); would record the in- approach can prevent all code, data-flow data and control-flow data
struction to the RDT. Then when the variable is used in Authenti- attacks we know about. Our design can be used in practice because
cate(packet), __checkDef(_packet); would be executed and launch a we use an asynchronous kernel monitor to reduce the overhead of
system call to our kernel monitor. Then it will find the instruction is the instrumentation and it does not have false positives.
inconsistent with the original instruction PacketParser(packet);. So
an exception will be raised to prevent the program from continuing. REFERENCES
[1] Alfred V Aho, Monica S Lam, Ravi Sethi, and Jeffrey D Ullman. 2007. Compilers:
principles, techniques, & tools. Pearson Education India.
4.3 Detect Runtime Control-flow Data Attack [2] Adnan Akhunzada, Mehdi Sookhak, Nor Badrul Anuar, Abdullah Gani, Ejaz
Ahmed, Muhammad Shiraz, Steven Furnell, Amir Hayat, and Muhammad Khur-
Then we will illustrate how we detect control-flow data overwrite ram Khan. 2015. Man-At-The-End attacks: Analysis, taxonomy, human aspects,
at runtime with the example we defined in Section 3.2. Control- motivation and future directions. Journal of Network and Computer Applications
flow data overwrite means attackers may change the values of the 48 (2015), 44–57.
[3] Periklis Akritidis, Cristian Cadar, Costin Raiciu, Manuel Costa, and Miguel Castro.
variables that could affect the condition judgment in control-flow 2008. Preventing memory error exploits with WIT. In 2008 IEEE Symposium on
while the program is running. Security and Privacy (sp 2008). IEEE, 263–277.
[4] Lars Ole Andersen. 1994. Program analysis and specialization for the C program-
For example, a hacker may overwrite the value of variable authen- ming language. Ph. D. Dissertation. Citeseer.
ticated to be 1 right after PacketParser(packet); is executed. Before [5] David Aucsmith. 1996. Tamper resistant software: An implementation. In Inter-
the next loop starts, __checkDef(_authenticated); would launch a national Workshop on Information Hiding. Springer, 317–333.
[6] Andrew Baumann, Marcus Peinado, and Galen Hunt. 2015. Shielding applications
system call to our kernel monitor. Then it will find current value is from an untrusted cloud with haven. ACM Transactions on Computer Systems
inconsistent with the last definition instruction int authenticated (TOCS) 33, 3 (2015), 1–26.
6
Enforcing Runtime Software Integrity by Finer-grained Self-checking Conference’17, July 2017, Washington, DC, USA

[7] Miguel Castro, Manuel Costa, and Tim Harris. 2006. Securing software by view=o365-worldwide
enforcing data-flow integrity. In Proceedings of the 7th symposium on Operating [17] Jasvir Nagra and Christian Collberg. 2009. Surreptitious Software: Obfuscation,
systems design and implementation. 147–160. Watermarking, and Tamperproofing for Software Protection: Obfuscation, Water-
[8] Hoi Chang and Mikhail J Atallah. 2001. Protecting software code by guards. In marking, and Tamperproofing for Software Protection. Pearson Education.
ACM Workshop on Digital Rights Management. Springer, 160–175. [18] Ricardo Neisse, Dominik Holling, and Alexander Pretschner. 2011. Implementing
[9] Shuo Chen, Jun Xu, Emre Can Sezer, Prachi Gauriar, and Ravishankar K Iyer. 2005. trust in cloud infrastructures. In 2011 11th IEEE/ACM International Symposium
Non-Control-Data Attacks Are Realistic Threats.. In USENIX security symposium, on Cluster, Cloud and Grid Computing. IEEE, 524–533.
Vol. 5. 146. [19] Nick L Petroni Jr, Timothy Fraser, Jesus Molina, and William A Arbaugh. 2004.
[10] Christian Collberg, Clark Thomborson, and Douglas Low. 1997. A taxonomy of Copilot-a coprocessor-based kernel runtime integrity monitor.. In USENIX secu-
obfuscating transformations. Technical Report. Department of Computer Science, rity symposium. San Diego, USA, 179–194.
The University of Auckland, New Zealand. [20] Chenxi Wang, Jonathan Hill, John Knight, and Jack Davidson. 2000. Software
[11] Christian S. Collberg and Clark Thomborson. 2002. Watermarking, tamper- tamper resistance: Obstructing static analysis of programs. Technical Report.
proofing, and obfuscation-tools for software protection. IEEE Transactions on Technical Report CS-2000-12, University of Virginia, 12 2000.
software engineering 28, 8 (2002), 735–746. [21] Claes Wohlin. 2014. Guidelines for snowballing in systematic literature studies
[12] gcc.gnu.org. 2022. GIMPLE. https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html and a replication in software engineering. In Proceedings of the 18th international
[13] gcc.gnu.org. 2022. Static Single Assignment. https://gcc.gnu.org/onlinedocs/ conference on evaluation and assessment in software engineering. 1–10.
gccint/SSA.html [22] Jeff Yan and Brian Randell. 2005. A systematic classification of cheating in online
[14] Github.com. 2022. GNU Compiler Collection. https://github.com/gcc-mirror/gcc games. In Proceedings of 4th ACM SIGCOMM workshop on Network and system
[15] Simon Hansman and Ray Hunt. 2005. A taxonomy of network and computer support for games. 1–9.
attacks. Computers & Security 24, 1 (2005), 31–43. [23] Michael Zalewski. 2001. Ssh1 crc-32 compensation attack detector vulnerability.
[16] Microsoft. 2022. Customize exploit protection. https://learn.microsoft.com/en-
us/microsoft-365/security/defender-endpoint/customize-exploit-protection?

You might also like