Initial commit. First page done

main
Charlotte Som 2023-07-03 22:35:25 +01:00
commit 9c3ddfa96d
10 changed files with 296 additions and 0 deletions

9
.editorconfig Normal file
View File

@ -0,0 +1,9 @@
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = true

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.pdf

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# curriculum-vitae
Charlotte's CV (in Typst)

116
cv.typ Normal file
View File

@ -0,0 +1,116 @@
#import "layout.typ": cv, event, article, divider
#show: doc => cv(
name: "Charlotte Som",
tagline: "Systems programmer, videogame cheat developer, reverse engineer, multispecialist.",
links: (
(icon: "email", link: "mailto:charlotte@som.codes", text: "charlotte@som.codes"),
(icon: "github", link: "https://github.com/char", text: "@char"),
(icon: "link", link: "https://som.codes", text: "som.codes"),
(icon: "link", link: "https://hackery.site", text: "hackery.site"),
),
doc,
)
#grid(columns: (1fr, 2fr), column-gutter: 1cm, [
== Competitions
#event[Google Hash Code 2020][Google][February 2020][]
Worldwide intractable problem optimization competition. Competed as part of a globally-distributed team of three.
- *UK*: 6#super[th] place out of 406 teams.
- *USA*: 13#super[th] place out of 619 teams.
- *Canada*: 3#super[rd] place out of 135 teams.
- *Worldwide*: 252#super[nd] place out of 10724 teams.
#divider()
#event[Deloitte UK CTF][Deloitte][December 2020][London]
UK-wide infosec competition, organised by Deloitte.
Participated as a university team of six.
- *Qualifiers*: 10#super[th] place.
- *London finals*: 7#super[th] place.
#divider()
#event[BLÅHAJ CTF Team][][2021 -- Present][]
Casual infosec competition team. Since I joined:
- *Hack-A-Sat 2 CTF*: Organised by the _US Air Force & US Space Force_. Placed 15#super[th] out of 697 teams.
- *corCTF 2021*: Placed 11#super[th] out of 904 teams.
== Writing
#article(title: "Circumventing the JVM Classfile Verifier", date: 2019, url: "som.codes/jvm-force-no-verify")
#divider()
#article(title: "Reverse Engineering GTA V's Stunt Jumps", date: 2021, url: "hackery.site/writing/gta-v-stunt-jumps")
#divider()
#article(title: "Circumventing Cisco Duo's Authenticator App", date: 2021, url: "som.codes/cisco-duo-bypass")
#divider()
#article(title: "CyberDiscovery's 'Valhalla'", date: 2019, url: "hackery.site/writing/cyberdiscovery-valhalla")
], [
== Experience
#event[Multiplayer game technology][WorldQL Corporation][April 2022 -- Present][]
I currently work at WorldQL, building technology to reduce the barrier between singleplayer and multiplayer game development techniques.
The work is varied and has involved machine learning models, image processing pipelines, high-performance networking software, and 3D programming.
I mainly work with *Rust*, *TypeScript*, *Python*, *PyTorch*, *CUDA*, and *ONNX*.
#divider()
#event[Game modding / game-hacking][Self-employed][2016 -- Present][]
- _GTA Online_: *C++*, Rust
- _Minecraft_: *Java*, Kotlin, Scala, JVM Bytecode
- _Counter-Strike: Global Offensive_: *C++*, Rust
- Various Unity3D: *C\#*, .NET MSIL, C++ (for `il2cpp` games)
Professionally, I used to sell a custom client for Minecraft
(5-figure USD revenue from 2016 -- 2019),
and a subscription trainer menu for GTA Online
(4-figure annually recurring USD revenue until 2020).
#divider()
#event(company_newline: true)[Commercial obfuscator for JVM programs][paramorphism.dev (Self-employed)][2017 -- 2022][]
Java bytecode is one of my specialist areas.
Involved writing the product itself and internal tooling around JVM bytecode to aid debugging.
Working primarily with *Kotlin* and *Java*.
- _Paramorphism_: Bytecode obfuscator for JVM programs written in *Kotlin*.
- _libparamorphism_: Optional native runtime opaque library for programs
obfuscated by Paramorphism written in *Zig* and *Rust*.
- _Koffee_: Domain-specific language for *Kotlin* for Java classfile generation.
- _Aksara_ (internal): Bytecode assembly language and assembly/disassembly toolchain written in *Kotlin*.
- _Katon_ (internal): Bytecode viewer and editor with a GUI written in *Rust* and interfacing via *Java Native Interface* to *Kotlin* (_Aksara_) and *Java* (_Fernflower_).
#divider()
#event["Splashforce"][Force Software LLC][November 2020 -- October 2021][]
At Force Software, I was a "Software developer and strategy coordinator".
The flagship "Splashforce" product is an end-user e-commerce automation suite
for various sneaker sites. My duties included:
- `cronet`: Custom patches for & isolation of Chromium's HTTP stack.
(To evade TLS fingerprinting.)
- Pairing an Electron (node.js / web *JavaScript*) frontend to a *Go* backend.
- Anti-piracy, reverse-engineer-deterrent releases for the *Go* backend.
(Code virtualization, `cgo` FFI bindings, etc.).
- Reverse engineering bot protection measures on websites.
- Reverse engineering & circumventing bot prevention measures on Android apps. (*Java*, *Smali*, etc).
])
#pagebreak()
TODO: PAGE 2

7
icons/calendar.svg Normal file
View File

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<!-- Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License -
https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
Copyright 2022 Fonticons, Inc. -->
<path
d="M152 64H296V24C296 10.75 306.7 0 320 0C333.3 0 344 10.75 344 24V64H384C419.3 64 448 92.65 448 128V448C448 483.3 419.3 512 384 512H64C28.65 512 0 483.3 0 448V128C0 92.65 28.65 64 64 64H104V24C104 10.75 114.7 0 128 0C141.3 0 152 10.75 152 24V64zM48 448C48 456.8 55.16 464 64 464H384C392.8 464 400 456.8 400 448V192H48V448z" />
</svg>

After

Width:  |  Height:  |  Size: 627 B

7
icons/email.svg Normal file
View File

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<!-- Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License -
https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
Copyright 2022 Fonticons, Inc. -->
<path fill="#870c66"
d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z" />
</svg>

After

Width:  |  Height:  |  Size: 581 B

7
icons/github.svg Normal file
View File

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512">
<!-- Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License -
https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
Copyright 2022 Fonticons, Inc. -->
<path fill="#870c66"
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

7
icons/link.svg Normal file
View File

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512">
<!-- Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License -
https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
Copyright 2022 Fonticons, Inc. -->
<path fill="#870c66"
d="M579.8 267.7c56.5-56.5 56.5-148 0-204.5c-50-50-128.8-56.5-186.3-15.4l-1.6 1.1c-14.4 10.3-17.7 30.3-7.4 44.6s30.3 17.7 44.6 7.4l1.6-1.1c32.1-22.9 76-19.3 103.8 8.6c31.5 31.5 31.5 82.5 0 114L422.3 334.8c-31.5 31.5-82.5 31.5-114 0c-27.9-27.9-31.5-71.8-8.6-103.8l1.1-1.6c10.3-14.4 6.9-34.4-7.4-44.6s-34.4-6.9-44.6 7.4l-1.1 1.6C206.5 251.2 213 330 263 380c56.5 56.5 148 56.5 204.5 0L579.8 267.7zM60.2 244.3c-56.5 56.5-56.5 148 0 204.5c50 50 128.8 56.5 186.3 15.4l1.6-1.1c14.4-10.3 17.7-30.3 7.4-44.6s-30.3-17.7-44.6-7.4l-1.6 1.1c-32.1 22.9-76 19.3-103.8-8.6C74 372 74 321 105.5 289.5L217.7 177.2c31.5-31.5 82.5-31.5 114 0c27.9 27.9 31.5 71.8 8.6 103.9l-1.1 1.6c-10.3 14.4-6.9 34.4 7.4 44.6s34.4 6.9 44.6-7.4l1.1-1.6C433.5 260.8 427 182 377 132c-56.5-56.5-148-56.5-204.5 0L60.2 244.3z" />
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

7
icons/location.svg Normal file
View File

@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512">
<!-- Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License -
https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
Copyright 2022 Fonticons, Inc. -->
<path
d="M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 256c-35.3 0-64-28.7-64-64s28.7-64 64-64s64 28.7 64 64s-28.7 64-64 64z" />
</svg>

After

Width:  |  Height:  |  Size: 504 B

132
layout.typ Normal file
View File

@ -0,0 +1,132 @@
#let icon(name, shift: 0.25em) = {
box(
baseline: shift,
height: 1.25em,
image("icons/" + name + ".svg", alt: name)
)
h(0.35em)
}
#let cv(
name: "",
tagline: "",
links: (),
paper: "a4",
accent: rgb("#870c66"),
heading_font: "Inter",
body_font: "Inter",
mono_font: "BerkeleyMono",
doc,
) = {
set text(size: 9pt, font: body_font, weight: "medium")
set page(paper, margin: (x: 0.8cm, y: 0.8cm))
set par(justify: true)
show raw: it => text(size: 1.2em, font: mono_font, baseline: -0.05em)[#it]
show heading.where(level: 1): it => text(
size: 1.6em,
font: heading_font,
tracking: 0.1pt,
weight: "semibold",
block[
#{it.body}
]
)
show heading.where(level: 2): it => text(
fill: accent,
font: heading_font,
tracking: 0.1pt,
weight: "bold",
size: 1.35em,
[
#{it.body}
#v(-0.85em)
#line(length: 100%, stroke: 1pt + accent)
#v(0.2em)
]
)
show heading.where(level: 3): it => text(
size: 1.2em,
weight: "semibold",
block[#it]
)
[= #name]
text(
font: body_font,
fill: accent,
size: 1.2em,
weight: "semibold",
block[#{tagline}]
)
v(-0.5em)
links.map(l => {
link(l.link)[
#set text(weight: "medium")
#icon(l.icon)
#if "text" in l.keys() { l.text } else { l.link }
]
h(1em)
}).join()
doc
}
#let divider(accent: rgb("#870c66")) = {
line(length: 100%, stroke: (paint: accent, thickness: 1pt, dash: "dotted"))
}
#let event(
accent: rgb("#870c66"), company_newline: false,
title, company, period, location
) = [
#text(1.2em)[
#text(weight: "semibold")[#title]
#h(1fr)
#if not company_newline {
text(fill: accent, weight: "bold", size: 0.8em, baseline: -0.125em)[_#[#company]_]
} else {
text(fill: accent, weight: "bold", size: 0.8em)[\
_#[#company]_]
}
]\
#text(1em)[
#if period != [] {
icon("calendar", shift: 0.18em)
[_#[#period]_]
}
#h(1fr)
#if location != [] {
icon("location")
location
}
]
]
#let article(
accent: rgb("#870c66"),
title: "", date: "", url: ""
) = [
#par(justify: false)[
#text(weight: "semibold")[
#text(size: 1.2em)["#title"]
]\
#text(size: 0.85em, style: "italic", weight: "bold", tracking: -0.025em, fill: accent)[
#icon("link", shift: 0.25em)
#h(-0.25em)
#link("https://" + url)[#url]
]
#v(-0.85em)
#text(size: 0.85em, style: "italic", weight: "semibold", tracking: -0.025em)[
#icon("calendar", shift: 0.15em)
#h(0.1em)
#date
]
]
]