start	end	text
11430	13570	All right, everybody. We are back.
13610	18570	Hello. We are here with the second to last match of the whole tournament.
18570	21590	This is the finals of the lower bracket of the live CTF.
21590	23490	So these are teams who have all lost once.
23490	27230	They are playing back for the chance to come back into the final match,
27230	29550	which will be the very next match that will happen right after this.
29550	31230	Again, I'm CypherTex.
31270	32730	Hello, I'm Zeta2.
33030	36650	And we're looking to see if we're about ready for the countdown.
36650	39570	So let's go ahead and prepare. We're going to count the teams in.
39570	41490	They know it's time to go.
42330	46330	Five, four, three, two, one.
46330	47030	Go.
47030	47890	All right.
47990	48950	All right.
49230	51110	Oh, a quick lead.
51410	52910	Tell Straw Hat. Tell Straw Hat.
52910	53230	Yeah.
53230	54090	There we go. All right.
54090	56390	Okay. We're on. We're on.
56730	58210	Right. So who do you want to look at first?
58450	60790	Let's go with Straw Hat.
60790	61370	All right.
61370	64330	And so, as we said, lower bracket finals.
64330	68770	We have Team Straw Hat versus the Maple Mallard Magistrates, or MMM.
68770	69510	Or Mighty Ducks.
69510	70390	Mighty Ducks.
70390	71550	Or whatever name.
71550	73430	Those people.
75090	80450	And this is, yeah, you know, we're down to the final three teams.
80450	85690	So whoever wins here will go to the grand finals facing off against Hypeboi.
86130	88030	Who's really just had such a run.
88030	89690	This entire tournament, Hypeboi has just been flowing through it.
89790	91810	Really, really impressive.
93190	97390	So we can see here opening up the challenge in Ida.
97570	100670	Doing some analysis here.
100670	104370	But we do actually have Ghidra as well on the other side.
104370	104550	Right.
104550	106630	So this is, I haven't seen a whole lot of other things.
106630	107850	It's been mostly Ida so far.
107850	109050	Mostly Ida.
109290	110650	But we eventually got to Ghidra.
110650	112030	Yep. Yep.
112130	115170	And the way this challenge.
115170	116310	The way this challenge.
116310	116950	Yeah, right, right.
116950	117770	Let's clarify.
117770	119090	What's the name of this challenge?
119090	121210	So this challenge is called The Way.
121210	122010	This is The Way.
122010	126370	It's actually the only challenge that I have created for this event.
126370	126950	I only have one too.
126950	128030	So you did infrastructure.
128030	129090	I did streaming stuff.
129090	129370	Yeah.
129370	130530	So we were busy with other stuff.
130530	131570	But I have one challenge.
131570	132290	And this is the one.
132290	133270	And this is The Way.
134010	135650	And this is a reversing challenge.
135650	136930	We've seen mostly.
137230	137930	Actually, funny.
137930	138590	The two of us.
138590	139970	We made the two reverse.
139970	142570	The two non-pawn challenges in this tournament.
142570	142770	Yeah.
142770	144630	So this is another reversing challenge.
145850	148930	And we can get back a little bit into the details in a bit.
148930	151930	Let's keep looking here at what they're doing.
151930	155910	So MMM is just doing some initial reversing.
155950	157330	Renaming some variables.
158490	161350	We have kept the symbols in this.
161350	162210	We have the function names.
162210	163030	And what do we tell the team?
163030	165790	So we have categories for each of these matches on the bracket.
165790	168830	We told them, in this case, every day the day before.
169670	172170	We told them all of the categories for each of the challenges.
172170	174010	So what do they know about this one?
174010	174290	Right.
174290	175930	So they know that it's a reversing challenge.
175930	178550	And they know that it's around algorithms.
178550	181410	So they were given reverse engineering algorithms.
181410	184170	Did we tell them specifically, I think, Optimize Me, Even Me?
184350	189250	Right. We said Optimize Me, which may be a good time to explain what this is.
189250	197410	So in the reverse engineering category, there are various standard formats of challenges.
197610	201870	Maybe the most commonly known is the Crack Me, where you send in a flag as an input.
201870	204690	And the program will tell you whether it's correct or not.
204690	209530	And you need to work your way backwards from the verifier to figure out what the input should be.
209530	210910	And Optimize Me...
210910	212390	That was what my challenge was, essentially.
212390	214690	It was a bunch of checks. You gave an input. It verified at the end.
214690	217190	You had to reverse those or invert those or solve through those.
217190	222630	So the constraints, they define the unique input that gives the solution.
223250	232270	In the case of an Optimize Me, you have some computation that is implemented in a terribly inefficient way.
232270	237950	So you have a program that usually takes no input, and it just calculates the flag for you.
237950	239110	All you do is just run it.
239110	243430	You run it, except it will take to the end of the universe before the computation finishes.
243470	250930	So you need to understand what the algorithm is trying to do and optimize the computation so that you can actually complete it.
250930	254210	I remember playing back. I think it was Plaid CTF.
254850	258630	Several years ago, it had a whole category that they called their supercomputer category.
258630	265550	And the same idea was that you would need a supercomputer to run this as it is and to get anything out of it.
265550	271750	But you could also be more efficient if you wanted to do it like the algorithmic solution.
271750	275590	So we're expecting them to do just kind of a lot.
275590	280850	There we go. CallMysteryAlgorithm, I think I saw, was the name over on Straw Hat.
280850	285970	So we have this. So there's a bunch in the main function.
285970	289510	We try to separate out the things that they should not care about.
289510	290670	We try to guide them.
291350	292930	Oh, right. This is interesting.
296630	302970	Oh, my God. It's actually making the correct answer.
303230	305070	It doesn't give them the name.
305930	310450	So to explain here, just go back a few steps.
310450	313650	They basically, they're trying to identify what algorithm this is.
313650	316610	And they asked over chat about this.
316610	326050	And you could see there that it said like it's calculating the shortest path from this to this using this.
326050	328230	And this is actually completely correct.
328230	332770	This is the Floyd-Warshall.
332770	339050	It's actually not the Floyd-Warshall algorithm because it's the unoptimized computation.
339050	342690	If they replaced it with the textbook version of the algorithm, that would be...
342690	350470	Right. So this is like when you come up with or when you prove the Floyd-Warshall algorithm,
350470	356950	this is like the recursion relationship you start with and then you turn and use dynamic programming to make it efficient.
356950	361330	This is just a recursion relationship without the dynamic programming applied.
361330	365730	So this has like a time complexity of like 3 to the N or something like this.
366890	371710	So great move. It looks like they got a fantastic hint certainly from chat.
372110	379330	I'm really impressed by this because one of our test solvers actually tried this and they did not get it to work.
379330	384450	Or like they did after like already knowing the solution and kind of like...
384450	387390	So that's really impressive.
387390	389650	Well, that was before you added symbols I believe too maybe, right?
389650	396030	Yeah, but the only symbol that is relevant here is just I called it mystery algorithm.
396030	399710	Oh, right. This is called the getEdge function. That's true.
400170	409210	So I used this helper function to, you know, you have this matrix of like distance from A to B
409210	414450	and just this helper function to give you a pointer to the relevant entry in the matrix.
415590	416910	Yeah, so...
416910	420470	So I think that was... it looks like that may have been just enough to get it to produce it.
420470	422610	And we've actually got... so yeah, you want to go back over to...
422610	428490	Yeah, because I just saw there if we can switch over... we can't see the code yet, but if we switch back to this, I think the...
429190	435470	Yeah, so here is the... this is really cool because this is the other approach you can take to this.
435470	444430	So you can see over on the straw hat side, they were kind of trying to identify the specific algorithm and then use, you know, knowledge...
444430	445890	Go find a textbook version of that or re-implement that, drop it in place.
445890	453210	Right, right, something. But if we go back to MMM, here you can see that the player is re-implementing the function in Python
453210	459750	and you can see this little at cache annotation for the function, which is...
459750	466270	It will, like, look at all the function arguments and then use that as a key and then cache the return value.
466270	469470	Out code those values because it's, you know, fixed input, fixed output.
469470	472070	Exactly, it's a pure function.
472070	472330	Yeah.
472510	481610	So, and this is actually the kind of trick for those who know a little bit about dynamic programming in, like, algorithm construction.
482030	485530	Usually the way you approach is that you start with a recursion
485530	491570	and then you identify that many or most of the various recursive calls actually are the same.
491570	492650	They're, like, a big overlap.
492650	495650	So then you only have to do it once and then you just do a lookup for the remainder.
495650	506790	Right. And then normally, like, if you do it, like, kind of properly, you do it all the way and, like, flip it all around and compute it, like, bottom up.
506850	513010	But you can skip that stuff and keep it as a recursive relationship but add a cache to it.
513010	513450	Interesting.
513450	519670	And so there's literally just an annotation in Python that lets you, like, a decorator that they can add in that says, yeah, please cache this.
520490	523610	It's in the functools library.
523610	529030	I believe you can give it some parameters with, like, the size of the cache and stuff, but I think the default should be plenty enough.
529030	529690	Might actually work well for this.
529690	542150	So if they implement this correctly, they just need to properly translate from the disassemble or the decompile code into the Python and add this annotation and run it and they should get the answer.
542150	547490	And I wonder now if going into this, they specifically chose Ghidra or Ida based on what they knew about the problem, too.
547490	553350	I don't remember if we've seen, I think this was Robert from NNM who's playing, like, have we seen him use one or the other before?
553350	558170	But it could be that he just feels like maybe I've seen better decompilation for very algorithmic things.
558170	564210	And I'm just curious if that factored into it because it is interesting to see that he's doing that approach.
564210	568490	But, yeah, so I love that we've got two kind of very different approaches, each equally viable, right?
568490	572390	Both of these should absolutely be proper ways of solving this problem.
572390	573490	And it kind of makes sense.
573490	575330	They knew the category going into it.
575330	576230	It wasn't a surprise.
576230	578310	And these are sort of standard ways of doing it.
578490	579530	Let's go back and look over.
579530	581170	We've got more chat, GPT from Straw Hat.
581170	582970	Are they just looking up?
582970	584810	Shortest path in a graph.
585990	591850	And you see the keyword here, dynamic programming is a keyword here.
592870	599070	And this function calculates the combined path or cost from A1 to A2 going via A3.
599070	600690	And this is completely correct.
600690	602530	This is exactly what it's doing.
602530	604810	I'm actually kind of blown away.
604810	609070	So I will admit that I'm a little bit of an AI skeptic.
609230	612730	You see a lot of hype and not a lot of...
612730	615470	I believe there's a bit of an overhype.
615470	619090	And especially in these reverse engineering scenarios,
619090	622730	people have been claiming, oh, you can just put the code in here and it will tell you what it is.
622730	625990	And I've been thinking, well, can you actually, though?
625990	627750	But this is really impressive.
627750	628210	Yeah.
628770	631290	So here we can see the big...
631290	634830	This is the matrix of all of the edges and the...
634830	640590	Right, so this is the matrix defining the individual, the cost or the distances between the nodes.
640590	643070	And you have this full FFFF or minus one.
643070	648550	And this is like a marker for there being no edge between those two nodes.
648550	651350	And this is why you had all of those if statements in the algorithm,
651350	654750	where it's checking if it's minus one.
656430	658330	It's a dead end, essentially.
658330	663150	And then I fortunately had to add in a little bit because checking for overflow
663150	666670	when adding two costs together and stuff like this.
666670	671130	So this made the code a tad messier than what it could have been.
671130	672930	So let's talk about the hints we've got.
672930	675150	Because I know a lot of the challenges, the hints have been super useful.
675150	677490	They've really come down and made a difference.
678050	681110	How much hints do we have for them?
681110	683370	Are we just going to tell them the algorithm at some point?
683370	685350	Or what comes through there?
685370	687910	Yeah, I'm trying to remember the exact hint.
687910	691130	But I know that the second hint that they get says,
691130	695350	like, this is an unoptimized version of the Floyd-Werschel shortest path algorithm
695350	696610	or something like this.
696610	699210	So theoretically, we hopefully won't need a sudden death
699210	701030	because if worst case comes to worst,
701030	703010	they should be able to just look up that implementation
703010	704850	of an efficient version of that algorithm.
704850	707310	Right. And if we go back over to MMM here,
707310	712410	you can see the player looking here at this function
712410	715030	called decrypt flag with the solution.
715330	719110	So once they have calculated this whole thing.
719190	725750	So what this algorithm does is that you give it a graph with nodes
725750	728450	and you tell the distance between all the nodes.
728450	731230	And the algorithm will then produce a new matrix
731230	736930	with the total shortest distance from each node to each node.
736930	737170	Oh, wow.
737170	740370	So it fully characterizes every possible path.
740370	743630	Right. I don't know if you have one of those old map book or something
743630	746650	that's saying if you want to travel from this city to this city,
746650	747790	it's this long and so on.
747790	749670	It builds up this matrix.
749730	752850	And then this function, it will just take that whole matrix
752850	755510	and serialize it into a long sequence of bytes
755510	759050	and use that as a decryption key to get the flag.
759170	760690	Okay. So they have to get it perfectly right
760690	763690	because that whole resulting value is...
763690	764950	and it is a deterministic algorithm.
764950	767250	It's not like it's a heuristic that can produce different results.
767250	769590	It is going to be there is one correct answer
769590	771250	and the algorithm will... which makes sense then
771250	774150	because graph traversal, that's a hard problem.
774490	777590	So it makes sense then that this would be done inefficiently,
777590	780290	would not be possible at all in the scope of this.
780290	781730	How long does your solution take to run?
781730	782590	If you have your implementation...
783150	785090	I mean, it's pretty much instant.
785090	785970	Yeah, yeah.
785970	788670	So the algorithm is...
788670	789530	Is it even in Python then?
789530	790490	It's in Python.
790490	791130	Okay.
791130	793350	So it's the optimized version.
793350	796270	So I said the unoptimized version is like 3 to the n,
796270	798930	so exponential, like it goes up completely.
798970	803650	The optimized version is cubic, so n to the power of 3.
804350	806430	There are faster algorithms for this,
806430	809030	but yeah, anyway, this is what we went for.
809670	813170	So, which is still pretty bad for like a polynomial.
813170	815030	Like cubic is still...
815030	816690	How many nodes do we have?
816690	820710	Right, so it's a 50 node, so it's a 50 by 50 grid.
820710	823430	So I made it small enough that, you know,
823430	826830	like 50 cubed is still a very small number.
827670	831970	And you can see there, like you saw on the screen,
831970	832870	that he was running...
832870	834450	Was that running a debugger dumping out things?
834630	836250	I don't think it was a debugger.
836250	838270	He was just, I think he was just running it
838270	842070	and printing values maybe?
842330	844330	Or I'm trying to...
844330	847750	I want to see the terminal output again.
849350	851770	So I haven't seen a whole lot of people
851770	853690	actually writing like scripts for this.
853690	855990	Like all the solutions so far have been standalone scripts
855990	857810	that really haven't interacted directly with the binaries
857810	859730	for the matches I've casted,
859730	861030	so I've definitely missed some of them.
861030	865450	But I'm seeing some IDA API here to pull out the values.
866250	867450	This is kind of interesting.
867450	870310	They are, it seems like they're generating C code
871210	872570	from the Python scripts.
872570	873770	Do you think they're just not convinced
873770	875610	that their implementation is going to be efficient enough?
875610	875730	Yeah.
875730	877690	It's going to lose some native performance out of it probably?
877730	882990	Might be, which is a bit of a premature optimization.
883010	883430	Yeah, yeah.
883450	887030	Get it working first and then decide if you need that, yeah.
887030	887730	Yeah.
887950	892270	I guess the tricky thing here is that
893830	897430	it's kind of hard to tell,
899010	901390	no, actually, he's just doing test values.
901390	902110	That's fine.
902110	903830	So if you don't get the correct answer,
903830	907390	you don't quite know what's wrong.
907470	909550	Because if you have the wrong decryption key,
909550	910590	you will just get garbage.
910590	910930	Right, right.
910930	912090	There's no close.
912090	913410	There's only done and not done.
913410	914290	Yeah, exactly.
914290	918390	Well, I mean, of course, you can always try to convince yourself
918390	921290	that your algorithm is correct by creating a smaller test case
921290	923990	that you can do with pen and paper.
924370	926390	So when I was doing this, when I was implementing this,
926390	929890	I actually had a bug in the code,
929890	933210	and something was off.
933850	937630	And I solved this by having a very small,
937630	939790	like I had a three-by-three matrix or something,
939790	942330	and I worked it out by hand and eventually found
942330	946590	that the Wikipedia article that I was referencing,
946590	949870	they were using one indexing and I was using zero-based indexing.
949870	950470	Ah, that makes sense.
950470	950970	Yeah.
952610	953950	So let's go back to the straw hat.
953950	955710	Just for a second there, they actually,
955710	957350	I've seen two different things that were interesting
957350	959550	for both of the solutions so far.
959570	961870	So if I pull back up their script again,
961870	966870	or maybe we'll have to go back over to MMM.
967110	969310	Yeah, MMM is, if we switch back to MMM,
969310	971730	they are also using ChatGPT.
971730	971990	Ah, there we go.
972350	974910	And then, right.
974910	979530	And this is basically the output that our tester got.
979530	980390	So interesting.
980390	980990	Right.
980990	982270	It's not able to produce now.
982270	984350	They did feed in the output from different decompilers.
984350	986610	So it could be that Ghita's output versus Ida's output
986610	988850	is different enough that we'd have to test that,
988850	989330	go back and watch.
989330	990570	Oh, that's so interesting.
990570	992990	That very small difference in the inputs.
992990	995430	Just the formatting or even the,
995430	997530	these are non-deterministic systems.
997530	997870	Right.
997870	1003250	So maybe there is some input training data out there
1003250	1004350	that just happens to look...
1004350	1005490	Looks more like this.
1005490	1007110	Yeah, it's entirely possible.
1007390	1009410	Which is pretty cool.
1009410	1010710	That's very interesting.
1010710	1013330	I think this is the...
1013330	1018810	We might have seen a little bit of chat GPT in some of the other...
1018810	1019230	We have.
1019230	1022030	This one is where it seems to have been actually useful.
1022030	1022830	Let's look at Straw Hat.
1022830	1024630	We've actually seen now the output of the script.
1025230	1028010	So they're actually generating values that they've...
1028010	1029130	Are these pulling out...
1029130	1031950	Are they just using this to dump the data?
1031990	1032710	Yeah.
1032710	1035130	So the minus one, I think, is the initial state.
1035130	1037090	So when the algorithm starts,
1037090	1040230	it creates the memory to hold the results.
1040230	1041490	Well, I see 50 lines.
1041490	1042110	So 50 lines.
1042110	1044250	This is just essentially...
1044250	1048130	I think they're dumping the raw values of the grid.
1048130	1048170	Right.
1048170	1051370	So all the minus one, that's like the initial state
1051370	1053630	before filling out the values.
1053630	1055110	Yeah, but so some of the rows were minus ones
1055110	1056090	and some of the rows were not.
1056090	1058950	No, no, but there was this big block, right, of minus ones.
1058950	1059690	And then there's...
1059690	1062330	So I think in my code that generates the problem,
1062330	1066810	about every fifth edge is a minus one.
1067250	1068070	I think that's like...
1068070	1071590	I randomly generated the input graph.
1072330	1074530	So, yeah.
1074530	1077210	Although you can see there in this Google search history,
1077210	1077850	torque.
1079310	1080670	Poor CTF players.
1080670	1084910	In the main event, one of the challenges is a torque 3D engine script.
1084910	1087410	So I know that a lot of people suddenly became familiar
1087410	1088270	with the 3D engine.
1088270	1089730	They weren't beforehand.
1089830	1090510	Yeah.
1091690	1092130	And...
1092130	1093150	Oh, no.
1093150	1094410	Verify that you are human.
1094410	1095230	Yeah, I was kidding.
1095230	1096150	You typed too fast.
1096150	1097710	We're going to see a capture.
1097710	1098410	Yeah.
1098490	1100950	And while we were looking a little bit more into this,
1103130	1105270	I saw earlier that I was looking...
1105270	1106050	I was reading the chat.
1106050	1109890	So, unfortunately, we don't have the YouTube chat in front of us.
1109890	1111870	But I saw previously looking from the stream
1111870	1114710	that someone asked about if we could, you know,
1114710	1116990	explain a little bit more about, like, the setup
1116990	1119970	and the environment that we have here.
1121490	1121930	But...
1121930	1125050	So we have behind us...
1125550	1129250	Behind this wall, we have the players sitting across each other at a table.
1129250	1132410	So, like, they are really, like, face-to-face with their laptops.
1132410	1134430	They are on a isolated...
1134430	1136270	Well, kind of isolated network.
1136270	1137570	They can reach the Internet.
1137570	1141650	They can reach the game servers that we have on that network.
1142390	1144250	By the way, I want to go back and really get the straw hat
1144250	1147550	because they just asked ChatGPT to optimize it,
1147550	1149750	and it used a memo approach, actually.
1149750	1150750	And it suggested...
1150750	1151290	Oh, nice.
1151870	1154750	Suggested essentially doing really what that hash was doing
1154750	1155670	on the other side in the Python.
1155670	1156050	Yeah.
1156050	1159570	But using, like, a massive array instead of, like, a hash table
1159570	1160830	or something like this.
1160950	1161330	Right.
1161370	1163270	So it's kind of a similar concept.
1163270	1164030	So it is...
1164030	1167530	I've got to say the ChatGPT hints that Straw Hat's getting out
1167530	1168350	seem to be pretty good.
1168350	1170470	They're, like, certainly not bad advice, bad ideas.
1170470	1171790	No, it's very valid.
1171790	1175210	And if we go over to MMM, I saw...
1175790	1177750	Let's see if we can get this again.
1177750	1183830	You can see there in the terminal there was a lot of, like...
1183830	1185910	It was running it in a debugger.
1185910	1187690	Okay, so that was a debugger we saw earlier.
1187690	1191610	And I think he's, like, validating that his...
1191610	1194750	Well, this is, you know, a little bit of speculation from my side,
1194750	1195770	but this is what I would do.
1195770	1200510	Like, even though the calculation that's being done in the program,
1200510	1203910	even though it's slow, you can probably still, like, do a little bit
1203910	1207270	of debugging and just checking that, like, things are, like,
1207270	1208430	agreeing with your values.
1208430	1210450	Your first couple of results of calculation maybe.
1210450	1212550	I was going to ask earlier if the problem is dividable enough
1212550	1213370	that you could do that.
1213370	1216370	So you can go... I think you can...
1216370	1219350	Yeah, yeah, I think you can bottom out in, like, one branch
1219350	1221190	and get that result.
1221190	1222410	And then just compare it to what you have.
1222410	1225590	Yeah, so you can get a little bit of information out to do a little bit
1225590	1226090	of validation.
1226090	1228410	By the way, Newbie Edge on the chat, thank you for chiming in.
1228410	1232310	We did pull that up now, pointed out that we've got chat GPT-3
1232310	1233750	and chat GPT-4.
1233750	1239090	So MMM is using GPT-3.5, and we've got Straw Hat using 4.
1239090	1240090	3.5.
1240170	1242730	Yeah, so we've got MMM using 3.5.
1242730	1245150	And we've got Straw Hat using GPT-4.
1245150	1247470	So it is entirely possible that's actually just the difference
1247470	1249690	in terms of which version they were using.
1249690	1251090	Oh, that's really cool.
1251530	1254490	Newbie Edge, by the way, is one of the players in Norse Code
1254490	1256130	who did play a match earlier.
1256210	1260310	Unfortunately lost to MMM, but they did really well
1260310	1261210	in the tournament.
1261210	1262990	Had a really great run there.
1262990	1265050	Well, they can take some pleasure in knowing that the person
1265050	1267490	that defeated them is being stumped by the old version
1267490	1269250	that they caught on stream.
1269250	1270650	They saw the difference.
1270650	1271230	Thank you for pointing that out.
1271230	1276110	So here we do see the debugger and checking some value,
1276110	1279470	dumping out some memory of this.
1279870	1280230	Oh, right.
1280230	1282210	So here we also see a dump of this.
1282330	1286470	So W is the name of the table with all the edges.
1286470	1289130	So this is what's being dumped out here.
1289590	1291430	Even just having symbols helps with that too
1291430	1292850	when you're in the debugger and you've got symbols,
1292850	1294710	being able to global variable names and whatnot
1294710	1296450	is a nice convenience.
1296450	1298450	So I did a little bit of a give and take.
1298450	1304830	So we made it a little bit easier where we kept the symbols,
1304830	1306390	but I did choose to...
1306390	1309190	So that variable was initially called distance matrix
1309190	1310450	or something like this.
1310450	1312210	So I did choose to just...
1312210	1314290	A couple of things were sort of anonymized a little bit.
1314470	1316590	So the algorithm is called mystery algorithm
1316590	1317950	instead of the actual name.
1317950	1321230	The table is called just W instead of distance matrix.
1321230	1323830	And then they get all the other symbols to tell them,
1323830	1326310	hey, you don't really need to look at these other functions.
1326730	1328310	So we are seeing...
1328830	1332350	They both feel like they've got...
1332770	1336050	Certainly the beginnings of code, they could be doing this.
1337290	1338410	But let's see.
1338410	1340410	So again, we went with the C approach.
1340410	1343050	Now we've got to fix up all the errors from our auto-generated code
1343550	1350210	in our chat GPG output that are not valid C potentially.
1350290	1352030	But that looks a little bit like IDA output actually
1352030	1353930	with the comments, with the stack.
1353930	1357850	Well, they generated it from an IDA script.
1357850	1361870	So their IDA Python script actually generated both the header file
1361870	1364150	that they're using, that W dot H is literally just W.
1364150	1366110	So those are the values that they dump from there.
1366230	1368330	Although again, I am thinking about this though.
1368330	1371130	You said about every fifth edge was negative one.
1371130	1375590	But we saw in that W dot H a bunch of rows of all negative ones.
1375590	1378690	What I think it was was that they dumped stuff in the debugger.
1378930	1381850	So the big thing with all the minus one,
1381850	1385870	that's if you would dump the kind of the state variable
1385870	1388890	before it goes into the algorithm.
1389630	1390990	Or they just made a mistake.
1390990	1393010	But there's no reason they should have received that.
1393010	1394610	It should be pretty straightforward, yeah.
1394990	1398790	So I think that was just a, you know, we kind of misread that, I think.
1398930	1400450	Could be. We'll have to see if it comes back up again.
1405150	1408190	Let's move over to MMM.
1408190	1411410	And we can see there is like some calculations going on.
1411950	1414410	In the background.
1414410	1417210	And you can see it looks like this is going.
1417210	1419610	So you see kind of these pairs of numbers.
1419810	1421050	One is going pretty fast.
1421050	1424150	And then one is taking up 15 and so on.
1424610	1427250	That's actually a counter. That could be pretty close to itself.
1427250	1429470	And I will say earlier they had an RC4 script.
1429470	1432510	They were already pulling it there to say they copied and pasted their RC4.
1434270	1436390	So they've got the code.
1436390	1439410	I mean, it's entirely possible that this is a working solution.
1439410	1441530	We won't really know, just like they won't, until they run it right.
1441530	1442290	As you were saying earlier.
1442290	1445870	And then, of course, you also have to be very careful here how you...
1445870	1450210	So in Python, because you have these S integers and you need to pack them,
1450210	1453850	you know, make sure you get the ndns correct there.
1454510	1455990	There's a lot of little fiddly bits.
1456250	1457510	Yeah, this is like the...
1458090	1459330	Oh, there's the flag.
1459330	1459910	That's the flag.
1459910	1460690	Yeah, yeah, yeah.
1460810	1465250	So now it just needs to connect to the server and submit this.
1465290	1468650	And that's the solution.
1468650	1470110	That is it. Congratulations.
1470370	1474490	We've got a win from MMM right their way into the final.
1474490	1475890	Really well done.
1476530	1478210	All right, let them know we've got a winner.
1478210	1480070	Yeah, that's really, really cool.
1480410	1481830	Yeah, that was impressive.
1481830	1484890	I think it was really cool to see both the different approaches.
1484890	1486410	It was cool to see...
1486410	1493670	I mean, I will admit, even though, you know, my skepticism, it was cool to see it did work, even though they didn't win.
1493670	1497170	I think just the speed of it came down, so they just kind of got beat on speed.
1497170	1498590	But the approach was sound.
1498590	1502690	And they may not have even honestly been that far off just looking at where they were and looking at what they had done.
1502690	1503490	No, totally.
1504850	1510030	So, yeah, I think... I don't know if there is anything else to add at the moment.
1510030	1510750	Not for this round.
1510750	1515010	So just as a reminder for the bracket for folks, this now is one match left.
1515010	1516230	We have the final event.
1516230	1526110	The teams that score, the number one team, the individual scores for their team will be getting 1,337 points in the main CTF.
1526110	1528730	So I think, though, they've blacked out the scoreboard.
1528730	1533590	They've brought us actually up on the projector just now to see the end of the game.
1533590	1538910	So for this last match, if you're in the Capture the Flag room, we'll be showing the match in here.
1538910	1539730	All the teams will be done.
1539730	1544650	Because our last match happens in 30 minutes, which is actually after the main CTF ends.
1544650	1548110	So it is the last possible points you can score for your team.
1548470	1551030	Although I think MMM had a pretty solid lead yesterday.
1551030	1552450	So depending on what happened today...
1552450	1554490	Yeah, they are in a very good spot.
1554510	1555910	Also, they are in the Grand Finals here.
1555910	1558510	So even... I mean, of course, you know, of course you want to win.
1558550	1561310	But even if they lose, they still get a good amount of points.
1561310	1562910	I think the difference between 1 and 2 here...
1562910	1565770	And again, I don't remember where Straw Hat was on the scoreboard before it...
1565770	1567570	They were in a good position, but...
1567570	1569310	Yeah, they may have been like 4th or 3rd or so.
1569350	1571390	So they're both, you know, kind of solid teams.
1571390	1575570	But really what would have mattered is one of the 2nd or 3rd place teams that was behind MMM at the time.
1575570	1578710	If they had come into 1st and MMM had ended up last...
1578710	1581350	That's really where you might have seen Live CTF impact the main event.
1581350	1582830	But it's unlikely.
1582830	1584890	That said, I'm really excited to see DRAMA.
1584890	1588230	We've got a really fun challenge, I think, for the Finals.
1588230	1591350	I'm looking forward to seeing how teams approach it.
1591350	1592250	It's going to be really cool.
1592250	1596590	So we will have the Grand Finals of the Live CTF coming up in about 30 minutes.
1596590	1600690	We will have MMM against Hypeboy.
1600690	1603710	It's going to be a really cool match.
1603950	1606130	And yeah, looking forward to it.
1606130	1608630	So we will be back in about 30 minutes.
1608630	1609450	We'll see you then. Take care.
1609450	1609850	Bye.
