Initial commit. First page done
commit
9c3ddfa96d
|
@ -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
|
|
@ -0,0 +1 @@
|
||||||
|
*.pdf
|
|
@ -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
|
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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 |
|
@ -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
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
Loading…
Reference in New Issue