205 results for "":
And now for a bit of an announcement
Hey all, thanks for checking in!
After much soul searching, I have arrived to the following conclusion:
- Teaching folks about stuff is my jam.
I’ve been writing multiple articles that sort of read like course material, if there was no dress code, maybe?
In 2013, I organized a 1st year Computer Science student project. Instead of making them implement “control tower software” for a fictional airline, I decided to go for something real - the BitTorrent protocol.
Day 3 (Advent of Code 2020)
Hello all, and welcome back to Advent of Code 2020, featuring Cool Bear.
fortris
Hey y’all!
Let’s get right to it.
The problem statement for Day 3 is as follows: we’re given a map, that looks like this:
..##.......
#...#...#..
.#....#..#.
..#.#...#.#
.#...##..#.
..#.##.....
.#.#.#....#
.#........#
#.##...#...
#...##....#
.#..#...#.#
And we imagine that it repeats infinitely to the right, like so:
Day 13 (Advent of Code 2020)
In the Day 13 problem, we’re trying to take the bus.
Our input looks like this:
939
7,13,x,x,59,x,31,19
The first line indicates the earliest minute we can leave from the bus terminal, and the second line indicates the “identifier” of the buses that are active.
Each bus departs every “bus ID” minutes - bus 7 leaves at minute 0, minute 7, minute 14, minute 21, etc. The question is: which bus can we take first (apparently they either all go to the same destination, or we don’t really care where we’re going), and how long do we have to wait for it?
Day 8 (Advent of Code 2020)
Time for another Advent of Code 2020 problem!
That one sounds like it’s going to be fun. Our input is pretty much assembly, like this:
nop +0
acc +1
jmp +4
acc +3
jmp -3
acc -99
acc +1
jmp -4
acc +6
So, the first thing we’re going to do is write down some types.
There’s more than one way to approach this problem, but let’s go with this:
#[derive(Debug, Clone, Copy)]
enum InstructionKind {
Nop,
Acc,
Jmp,
}
#[derive(Debug, Clone, Copy)]
struct Instruction {
kind: InstructionKind,
operand: isize,
}
type Program = Vec<Instruction>;
Beware the Google Password Manager
Hey internet! So, someone broke into some of my accounts.
I’m taking entire responsibility for this - there’s the part where I fucked up, and if I didn’t fuck up, then none of this would’ve happened.
But there’s also the part where a series of design decisions from various vendors combined into the perfect storm for me.
And we’re going to talk about both! Separately! And calmly.
A static poppler build: the easy way
So! Now our asset processing pipeline is almost complete. But we’ve just traded dependencies against CLI tools, for dependencies against dynamic libraries:
$ ldd ./target/debug/pdftocairo
linux-vdso.so.1 (0x00007ffd615be000)
libpoppler-glib.so.8 => /lib64/libpoppler-glib.so.8 (0x00007f2ba1bb4000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f2ba1b59000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f2ba1a1e000)
libcairo.so.2 => /lib64/libcairo.so.2 (0x00007f2ba1902000)
libcairo-gobject.so.2 => /lib64/libcairo-gobject.so.2 (0x00007f2ba18f6000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f2ba18dc000)
libm.so.6 => /lib64/libm.so.6 (0x00007f2ba17fe000)
libc.so.6 => /lib64/libc.so.6 (0x00007f2ba15f4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2ba216c000)
libpoppler.so.112 => /lib64/libpoppler.so.112 (0x00007f2ba1288000)
libfreetype.so.6 => /lib64/libfreetype.so.6 (0x00007f2ba11bd000)
libgio-2.0.so.0 => /lib64/libgio-2.0.so.0 (0x00007f2ba0fe4000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f2ba0dc5000)
libffi.so.6 => /lib64/libffi.so.6 (0x00007f2ba0db8000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2ba0d40000)
libpixman-1.so.0 => /lib64/libpixman-1.so.0 (0x00007f2ba0c94000)
libfontconfig.so.1 => /lib64/libfontconfig.so.1 (0x00007f2ba0c45000)
libpng16.so.16 => /lib64/libpng16.so.16 (0x00007f2ba0c0c000)
libxcb-shm.so.0 => /lib64/libxcb-shm.so.0 (0x00007f2ba0c07000)
libxcb.so.1 => /lib64/libxcb.so.1 (0x00007f2ba0bda000)
libxcb-render.so.0 => /lib64/libxcb-render.so.0 (0x00007f2ba0bca000)
libXrender.so.1 => /lib64/libXrender.so.1 (0x00007f2ba0bbd000)
libX11.so.6 => /lib64/libX11.so.6 (0x00007f2ba0a75000)
libXext.so.6 => /lib64/libXext.so.6 (0x00007f2ba0a60000)
libz.so.1 => /lib64/libz.so.1 (0x00007f2ba0a46000)
libjpeg.so.62 => /lib64/libjpeg.so.62 (0x00007f2ba09c2000)
libopenjp2.so.7 => /lib64/libopenjp2.so.7 (0x00007f2ba0968000)
liblcms2.so.2 => /lib64/liblcms2.so.2 (0x00007f2ba0903000)
libtiff.so.5 => /lib64/libtiff.so.5 (0x00007f2ba087c000)
libsmime3.so => /lib64/libsmime3.so (0x00007f2ba0850000)
libnss3.so => /lib64/libnss3.so (0x00007f2ba0712000)
libplc4.so => /lib64/libplc4.so (0x00007f2ba0709000)
libnspr4.so => /lib64/libnspr4.so (0x00007f2ba06c6000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f2ba06b3000)
libharfbuzz.so.0 => /lib64/libharfbuzz.so.0 (0x00007f2ba05dd000)
libbrotlidec.so.1 => /lib64/libbrotlidec.so.1 (0x00007f2ba05cf000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f2ba05c8000)
libmount.so.1 => /lib64/libmount.so.1 (0x00007f2ba0581000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f2ba0556000)
libxml2.so.2 => /lib64/libxml2.so.2 (0x00007f2ba03cd000)
libXau.so.6 => /lib64/libXau.so.6 (0x00007f2ba03c7000)
libwebp.so.7 => /lib64/libwebp.so.7 (0x00007f2ba0358000)
libzstd.so.1 => /lib64/libzstd.so.1 (0x00007f2ba0260000)
libjbig.so.2.1 => /lib64/libjbig.so.2.1 (0x00007f2ba0252000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007f2ba021f000)
libplds4.so => /lib64/libplds4.so (0x00007f2ba021a000)
libgraphite2.so.3 => /lib64/libgraphite2.so.3 (0x00007f2ba01f9000)
libbrotlicommon.so.1 => /lib64/libbrotlicommon.so.1 (0x00007f2ba01d4000)
libblkid.so.1 => /lib64/libblkid.so.1 (0x00007f2ba019c000)
libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f2ba0105000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f2ba00d9000)
Things I struggle with
Putting thoughts in bits
I think about lots of things but when it comes down to writing them, drawing them, implementing them, it’s not that easy. Even with years of practice in each of these trades, it’s still an uphill battle.
Which is why I am not going to read that article after I wrote it and will go straight to publication.
Not assuming nobody cares
Veronica Mars and NTLM password hashes
Intro
When I started my Patreon, I had no idea if it would work at all. The whole thing seemed like a gamble: spend an inordinate amount of time writing quality articles, and hope that folks will like it enough to kick in 5, 10, or 50 bucks a month just to see more of them.
I’m happy to say the gamble paid off - literally. Take that, impostor syndrome!
Reading files the hard way - Part 3 (ftrace, disk layouts, ext4)
So far, we’ve seen many ways to read a file from different programming languages, we’ve learned about syscalls, how to make those from assembly, then we’ve learned about memory mapping, virtual address spaces, and generally some of the mechanisms in which userland and the kernel interact.
But in our exploration, we’ve always considered the kernel more or less like a “black box”. It’s time to change that.
Making our own executable packer
In this series, we’ll attempt to understand how Linux executables are organized, how they are executed, and how to make a program that takes an executable fresh off the linker and compresses it - just because we can.