hw4: prepare for submission
This commit is contained in:
parent
eb710a3bb8
commit
0f45bca709
11 changed files with 459 additions and 0 deletions
5
hw4/.gitignore
vendored
Normal file
5
hw4/.gitignore
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
artist.txt
|
||||
.idea/
|
||||
target/
|
||||
/ExcerciseD/
|
||||
/ExcerciseE/
|
3
hw4/ExerciseF/compile.sh
Executable file
3
hw4/ExerciseF/compile.sh
Executable file
|
@ -0,0 +1,3 @@
|
|||
#!/bin/bash
|
||||
|
||||
mvn clean compile package
|
BIN
hw4/ExerciseF/compiled/ch/usi/inf/ajp22/Main.class
Normal file
BIN
hw4/ExerciseF/compiled/ch/usi/inf/ajp22/Main.class
Normal file
Binary file not shown.
BIN
hw4/ExerciseF/compiled/ch/usi/inf/ajp22/Point.class
Normal file
BIN
hw4/ExerciseF/compiled/ch/usi/inf/ajp22/Point.class
Normal file
Binary file not shown.
55
hw4/ExerciseF/pom.xml
Normal file
55
hw4/ExerciseF/pom.xml
Normal file
|
@ -0,0 +1,55 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>ch.usi.inf.ajp22</groupId>
|
||||
<artifactId>Assignment4Agent</artifactId>
|
||||
<version>1.0</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
<maven.compiler.target>17</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
<addClasspath>true</addClasspath>
|
||||
</manifest>
|
||||
<manifestEntries>
|
||||
<Premain-Class>ch.usi.inf.ajp22.agent.Agent</Premain-Class>
|
||||
<Boot-Class-Path>target/Assignment4Agent-1.0.jar</Boot-Class-Path>
|
||||
<Agent-Class>ch.usi.inf.ajp22.agent.Agent</Agent-Class>
|
||||
<Can-Redefine-Classes>true</Can-Redefine-Classes>
|
||||
<Can-Retransform-Classes>true</Can-Retransform-Classes>
|
||||
</manifestEntries>
|
||||
</archive>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>.</directory>
|
||||
<excludes>
|
||||
<exclude>Main.java</exclude>
|
||||
<exclude>Point.java</exclude>
|
||||
</excludes>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
</project>
|
4
hw4/ExerciseF/run-instrumented.sh
Executable file
4
hw4/ExerciseF/run-instrumented.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/bin/bash
|
||||
java -javaagent:target/Assignment4Agent-1.0.jar \
|
||||
-cp compiled/ ch.usi.inf.ajp22.Main
|
||||
|
4
hw4/ExerciseF/run.sh
Executable file
4
hw4/ExerciseF/run.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/bin/bash
|
||||
|
||||
java -cp compiled/ ch.usi.inf.ajp22.Main
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package ch.usi.inf.ajp22.agent;
|
||||
|
||||
import java.lang.instrument.Instrumentation;
|
||||
|
||||
public class Agent {
|
||||
public static void premain(final String agentArgs, final Instrumentation instrumentation) {
|
||||
instrumentation.addTransformer(new Modifier());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
package ch.usi.inf.ajp22.agent;
|
||||
|
||||
|
||||
import java.lang.instrument.ClassFileTransformer;
|
||||
import java.security.ProtectionDomain;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Modifier implements ClassFileTransformer {
|
||||
public byte[] transform(final ClassLoader loader,
|
||||
final String className,
|
||||
final Class<?> classBeingRedefined,
|
||||
final ProtectionDomain protectionDomain,
|
||||
byte[] classfileBuffer) {
|
||||
final byte[] newBuffer = Arrays.copyOf(classfileBuffer, classfileBuffer.length);
|
||||
|
||||
if ("ch/usi/inf/ajp22/Point".equals(className)) {
|
||||
newBuffer[7] = 61;
|
||||
}
|
||||
|
||||
return newBuffer;
|
||||
}
|
||||
}
|
BIN
hw4/report.pdf
Normal file
BIN
hw4/report.pdf
Normal file
Binary file not shown.
357
hw4/report.tex
Normal file
357
hw4/report.tex
Normal file
|
@ -0,0 +1,357 @@
|
|||
\documentclass[a4paper]{article}
|
||||
|
||||
\usepackage{graphicx}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{chngpage}
|
||||
\usepackage{calc}
|
||||
\usepackage[hidelinks]{hyperref}
|
||||
\usepackage[english]{babel}
|
||||
\usepackage{fancyvrb}
|
||||
\usepackage{tikz}
|
||||
\usepackage{forest}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage{commath}
|
||||
\usepackage{minted}
|
||||
\usepackage{quotes}
|
||||
\usepackage{listings}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{minted}
|
||||
|
||||
\def\infinity{\rotatebox{90}{8}}
|
||||
\usepackage[shortlabels]{enumitem}
|
||||
\usepackage{caption}
|
||||
\usepackage{float}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{diagbox}
|
||||
\usepackage{slashbox}
|
||||
\usepackage{geometry} % For page dimensions and margins
|
||||
\geometry{
|
||||
paper=a4paper,
|
||||
top=2.5cm, % Top margin
|
||||
bottom=3cm, % Bottom margin
|
||||
left=2cm, % Left margin
|
||||
right=2cm, % Right margin
|
||||
}
|
||||
\usepackage{pgfplots}
|
||||
\pgfplotsset{width=15cm, height=10cm}
|
||||
\setminted{
|
||||
autogobble
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
\begin{titlepage}
|
||||
\scshape
|
||||
|
||||
\centering
|
||||
\includegraphics[width=3cm, keepaspectratio]{logo_usi.png}
|
||||
\par
|
||||
\vspace{0.1cm}
|
||||
\texttt{FACULTY OF INFORMATICS}
|
||||
\vspace{1cm}
|
||||
|
||||
|
||||
\raisebox{-\baselineskip}{\rule{\textwidth}{1px}}
|
||||
\rule{\textwidth}{1px}
|
||||
\vspace{0.2cm}
|
||||
|
||||
{\LARGE{{Advanced java programming}}}\par \vspace{0.1cm}
|
||||
Assignment 4
|
||||
|
||||
|
||||
\rule{\textwidth}{2px}
|
||||
|
||||
\vspace{1cm}
|
||||
|
||||
|
||||
\begin{tabular}{lp{1cm}l}
|
||||
Author & \rule{0pt}{3ex} & FEDERICO \mbox{LAGRASTA}\\
|
||||
&&\\
|
||||
& \rule{0pt}{3ex} & CLAUDIO \mbox{MAGGIONI}
|
||||
|
||||
\end{tabular}
|
||||
|
||||
\vspace{1.3cm}
|
||||
|
||||
|
||||
\vfill
|
||||
\today
|
||||
|
||||
\end{titlepage}
|
||||
|
||||
\section*{Exercise A: Concurrency}
|
||||
|
||||
As no synchronization b[Oetween the started threads exists, all the possible permutations of ``tX'' where $x$ is 1, 2 or 3 are valid outputs. Namely, all possible combinations are: \marginpar[right
|
||||
text]{\color{white}\url{https://youtu.be/4U_06LuzwJY}}
|
||||
|
||||
\begin{itemize}
|
||||
\item ``t1 t2 t3 ``
|
||||
\item ``t1 t2 t3 ``
|
||||
\item ``t2 t1 t3 ``
|
||||
\item ``t2 t3 t1 ``
|
||||
\item ``t3 t1 t2 ``
|
||||
\item ``t3 t2 t1 ``
|
||||
\end{itemize}
|
||||
|
||||
\section*{Exercise B: Concurrency}
|
||||
|
||||
\begin{enumerate}
|
||||
\item No, as the method is \texttt{synchronized} and requires a mutually exclusive lock to be acquired to execute it, therefore only one thread at a time can execute;
|
||||
\item Yes, as \textit{getCounter()} is not marked with the \texttt{synchronized} keyword;
|
||||
\item Yes, as one thread may acquire the lock for \textit{incrementCounter()} while the other just released it and is executing \textit{getCounter()};
|
||||
\item Yes, as the updates to the \textit{count} variable in \textit{Counter} are atomic and safe,
|
||||
therefore the count will always be exact;
|
||||
\item The object will acquire and release the intrinsic lock of the \textit{counter} object defined at line 17.
|
||||
\end{enumerate}
|
||||
|
||||
\section*{Exercise C: Concurrency}
|
||||
|
||||
No, as the foreach loops may indeed run simultaneously. According to the Java 17 standard library documentation for \texttt{Collections.synchronizedList(...)}\footnote{\url{https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Collections.html\#synchronizedList(java.util.List)}}, in order to obtain such access behaviour we would need to use the intrinsic lock of the list object wrapping the foreach loop with a \texttt{synchronized (integerList)} block.
|
||||
|
||||
\section*{Exercise D: JVM Architecture}
|
||||
|
||||
\begin{enumerate}
|
||||
\item As invoking \texttt{javap Secret} reports:
|
||||
\begin{verbatim}
|
||||
Warning: File ./Secret.class does not contain class Secret
|
||||
Compiled from "Login.java"\end{verbatim}
|
||||
the name of the original Java file is \texttt{Login.java};
|
||||
\item According to the output of \texttt{javap -c -l Secret}, specifically these lines:
|
||||
\begin{verbatim}
|
||||
0: ldc #55 // String Hello, try to find the username and the password [...]
|
||||
71: ldc #79 // String Congratulations, now write the username and the [...]
|
||||
[...]
|
||||
LineNumberTable:
|
||||
line 27: 0
|
||||
[...]
|
||||
line 41: 68
|
||||
line 42: 76
|
||||
[...]\end{verbatim}
|
||||
the string starting with ``Hello'' is stored in tag 55 of the constant pool and is loaded at line 27. The string starting with ``Congratulations'' is stored in tag 79 of the constant pool and is loaded at line 42.
|
||||
\item According to the output of \texttt{javap Secret} showing the class's interface:
|
||||
\begin{verbatim}
|
||||
public class Login {
|
||||
public Login();
|
||||
public static char transform(char);
|
||||
public static boolean access(java.lang.String, java.lang.String);
|
||||
public static void main(java.lang.String...);
|
||||
}\end{verbatim}
|
||||
there are three \texttt{public static} methods in the class.
|
||||
\end{enumerate}
|
||||
|
||||
To aid the explanation of how we found the secret password we report the full output of
|
||||
\textit{javap -c -l Secret}:
|
||||
|
||||
\begin{minted}{java}
|
||||
public class Login {
|
||||
public Login();
|
||||
Code:
|
||||
0: aload_0
|
||||
1: invokespecial #1 // Method java/lang/Object."<init>":()V
|
||||
4: return
|
||||
|
||||
public static char transform(char);
|
||||
Code:
|
||||
0: iload_0
|
||||
1: bipush 97
|
||||
3: isub
|
||||
4: istore_1
|
||||
5: iload_1
|
||||
6: iconst_1
|
||||
7: isub
|
||||
8: bipush 26
|
||||
10: irem
|
||||
11: bipush 97
|
||||
13: iadd
|
||||
14: istore_2
|
||||
15: iload_2
|
||||
16: i2c
|
||||
17: ireturn
|
||||
|
||||
public static boolean access(java.lang.String, java.lang.String);
|
||||
Code:
|
||||
0: ldc #7 // String tvvvvqfstuspohqbttxpse
|
||||
2: astore_2
|
||||
3: ldc #9 // String
|
||||
5: astore_3
|
||||
6: iconst_0
|
||||
7: istore 4
|
||||
9: iload 4
|
||||
11: aload_2
|
||||
12: invokevirtual #11 // Method java/lang/String.length:()I
|
||||
15: if_icmpge 40
|
||||
18: aload_3
|
||||
19: aload_2
|
||||
20: iload 4
|
||||
22: invokevirtual #17 // Method java/lang/String.charAt:(I)C
|
||||
25: invokestatic #21 // Method transform:(C)C
|
||||
28: invokedynamic #27, 0 // InvokeDynamic #0:makeConcatWithConstants:
|
||||
// (Ljava/lang/String;)Ljava/lang/String;
|
||||
33: astore_3
|
||||
34: iinc 4, 1
|
||||
37: goto 9
|
||||
40: aload_0
|
||||
41: ldc #31 // String admin
|
||||
43: invokevirtual #33 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
46: ifeq 70
|
||||
49: aload_1
|
||||
50: aload_3
|
||||
51: invokevirtual #37 // Method java/lang/String.toString:()Ljava/lang/String;
|
||||
54: invokevirtual #33 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
|
||||
57: ifeq 70
|
||||
60: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
|
||||
63: ldc #47 // String Success!! Access granted
|
||||
65: invokevirtual #49 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
|
||||
68: iconst_1
|
||||
69: ireturn
|
||||
70: iconst_0
|
||||
71: ireturn
|
||||
|
||||
public static void main(java.lang.String...);
|
||||
Code:
|
||||
0: ldc #55 // String Hello, try to find the username and the [...]
|
||||
2: astore_1
|
||||
3: aload_1
|
||||
4: invokedynamic #57, 0 // InvokeDynamic #1:makeConcatWithConstants:
|
||||
// (Ljava/lang/String;)Ljava/lang/String;
|
||||
9: astore_1
|
||||
10: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
|
||||
13: aload_1
|
||||
14: iconst_0
|
||||
15: anewarray #2 // class java/lang/Object
|
||||
18: invokevirtual #60 // Method java/io/PrintStream.printf:(Ljava/lang/String;
|
||||
// [Ljava/lang/Object;)Ljava/io/PrintStream;
|
||||
21: pop
|
||||
22: aload_0
|
||||
23: arraylength
|
||||
24: iconst_2
|
||||
25: if_icmpeq 48
|
||||
28: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
|
||||
31: ldc #64 // String Usage:
|
||||
33: invokevirtual #49 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
|
||||
36: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
|
||||
39: ldc #66 // String java Login username password
|
||||
41: invokevirtual #49 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
|
||||
44: iconst_m1
|
||||
45: invokestatic #68 // Method java/lang/System.exit:(I)V
|
||||
48: aload_0
|
||||
49: iconst_0
|
||||
50: aaload
|
||||
51: aload_0
|
||||
52: iconst_1
|
||||
53: aaload
|
||||
54: invokestatic #72 // Method access:(Ljava/lang/String;Ljava/lang/String;)Z
|
||||
57: ifne 68
|
||||
60: new #76 // class java/lang/RuntimeException
|
||||
63: dup
|
||||
64: invokespecial #78 // Method java/lang/RuntimeException."<init>":()V
|
||||
67: athrow
|
||||
68: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
|
||||
71: ldc #79 // String Congratulations, now write the username and [...]
|
||||
73: invokevirtual #49 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
|
||||
76: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
|
||||
79: ldc #81 // String Provide an explanation on how you discover it.
|
||||
81: invokevirtual #49 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
|
||||
84: goto 113
|
||||
87: astore_2
|
||||
88: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
|
||||
91: ldc #83 // String Wrong username and/or password.
|
||||
93: invokevirtual #49 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
|
||||
96: getstatic #41 // Field java/lang/System.out:Ljava/io/PrintStream;
|
||||
99: aload_0
|
||||
100: iconst_0
|
||||
101: aaload
|
||||
102: aload_0
|
||||
103: iconst_1
|
||||
104: aaload
|
||||
105: invokedynamic #85, 0 // InvokeDynamic #2:makeConcatWithConstants:
|
||||
// (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
|
||||
110: invokevirtual #49 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
|
||||
113: return
|
||||
Exception table:
|
||||
from to target type
|
||||
48 84 87 Class java/lang/RuntimeException
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
We first understand from instructions 28 to 45 of the \textit{main} method that
|
||||
the class is meant to be launched with two parameters, which are namely the
|
||||
username and the password.
|
||||
|
||||
We see that from instructions 48 to 54 the \textit{access} static method is
|
||||
invoked with the first command line argument as the first parameter and the
|
||||
second command line argument as the second parameter, which are namely the
|
||||
username and the password provided for login. Then the \textit{access} method
|
||||
checks if its first parameter is equal to the string ``admin'' at instructions
|
||||
40 to 46, returning \texttt{false} if not. Therefore we can say the the right
|
||||
username is ``admin''.
|
||||
|
||||
We then analyze the \textit{transform} method. Instructions 0 to 4 subtract the
|
||||
constant 97 (the character code of a lowercase ``a'') to the character given as
|
||||
argument, storing the result in the stack variable position 1. Then,
|
||||
instructions 5 to 7 subtract the constant 1 to the saved variable, instructions
|
||||
7 to 10 compute the modulo 26 (\texttt{\% 26}, where 26 is the number of ASCII
|
||||
lowercase letters) of the result and instructions 11 to 13 increment the final
|
||||
result with the constant 97 and returns the result as a character. Instructions
|
||||
14 to 17 in order store what the method computed in variable 2, loads variable 2
|
||||
and returns a copy cast to type \texttt{char}. Therefore, an equivalent Java
|
||||
source for the method is:
|
||||
|
||||
\begin{minted}{java}
|
||||
public static char transform(char c) {
|
||||
return (char) (((c - ((int) 'a') - 1) % 26) + ((int) 'a'));
|
||||
}
|
||||
\end{minted}
|
||||
|
||||
Instructions 0 to 37 show that a string with value ``tvvvvqfstuspohqbttxpse'' is
|
||||
read character by character the method \textit{transform} is applied, forming a
|
||||
new String. Given the reverse engineered \textit{transform} method and the fact
|
||||
that the string is composed only of lowercase letters starting from ``b'', both
|
||||
adding and subtracting ``a'' and computing a modulo 26 of each character are
|
||||
operations that lead to the same character. Indeed, the only change
|
||||
\textit{transform} applies to every single character is to subtract 1, or return
|
||||
the preceding character of each given character. Therefore, given this, we
|
||||
determine the decoded password to be the string ``suuuuperstrongpassword''.
|
||||
|
||||
\section*{Exercise E: Monitoring JIT}
|
||||
|
||||
\begin{enumerate}
|
||||
\item \begin{enumerate}[(a)]
|
||||
\item \texttt{-XX:-PrintCompilation}
|
||||
\item \texttt{-XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining}
|
||||
\item \texttt{-XX:NativeMemoryTracking=summary}
|
||||
\end{enumerate}
|
||||
\item The output of the command \texttt{java -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining Inlining} is the following:
|
||||
\begin{verbatim}
|
||||
@ 17 java.lang.String::isLatin1 (19 bytes) inline
|
||||
@ 27 java.lang.StringLatin1::hashCode (42 bytes) callee is too large
|
||||
@ 37 java/lang/StringUTF16::hashCode (not loaded) not inlineable
|
||||
@ 6 java.lang.String::coder (15 bytes) inline
|
||||
@ 6 Point::<init> (15 bytes) inline
|
||||
@ 1 java.lang.Object::<init> (1 bytes) inline
|
||||
@ 20 Point::getY (5 bytes) inline
|
||||
@ 25 Point::setX (6 bytes) inline
|
||||
@ 30 Point::setY (6 bytes) inline
|
||||
@ 6 Point::<init> (15 bytes) inline
|
||||
@ 1 java.lang.Object::<init> (1 bytes) inline
|
||||
@ 20 Point::getY (5 bytes) inline
|
||||
@ 25 Point::setX (6 bytes) inline
|
||||
@ 30 Point::setY (6 bytes) inline
|
||||
@ 20 Point::getY (5 bytes) accessor
|
||||
@ 25 Point::setX (6 bytes) accessor
|
||||
@ 30 Point::setY (6 bytes) accessor\end{verbatim}
|
||||
Therefore we can confirm that all methods listed were inlined while executing class \textit{Inlining}.
|
||||
\end{enumerate}
|
||||
|
||||
\section*{Exercise F: Java Agent}
|
||||
|
||||
\begin{enumerate}
|
||||
\item The compiled code given cannot be executed as-is as the class \textit{ch.usi.inf.ajp22.Point} contains an invalid java class file format version of 255 (where e.g. for Java 17 the correct value is 61).
|
||||
\item Please find the relevant source code in folder \texttt{ExcerciseF}.
|
||||
\end{enumerate}
|
||||
|
||||
\end{document}
|
||||
|
||||
|
||||
|
Reference in a new issue