Initial commit. First page done
This commit is contained in:
commit
9c3ddfa96d
10 changed files with 296 additions and 0 deletions
9
.editorconfig
Normal file
9
.editorconfig
Normal 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
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*.pdf
|
3
README.md
Normal file
3
README.md
Normal file
|
@ -0,0 +1,3 @@
|
|||
# curriculum-vitae
|
||||
|
||||
Charlotte's CV (in Typst)
|
116
cv.typ
Normal file
116
cv.typ
Normal 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
7
icons/calendar.svg
Normal 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
7
icons/email.svg
Normal 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
7
icons/github.svg
Normal 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
7
icons/link.svg
Normal 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
7
icons/location.svg
Normal 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
132
layout.typ
Normal 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
|
||||
]
|
||||
]
|
||||
]
|
Loading…
Reference in a new issue