Free Palestine
Enjoying Fluffle? MaybeSupport on Ko-Fi

Writeup: AOC LC32D1320 — Stack OverFlow via Media Player + Port de DOOM

Aviso:
Olá. Este writeup foi feito em Abril de 2026 e foi reescrito em julho de 2026 porque entreguei pra uma IA escrever e sempre odiei o resultado. Mas só agora, em julho, estou reescrevendo no meu jeito.

  1. Sumário

Este writeup foi feito para a TV AOC LC32D1320, lançada em 2012.
O sistema da LC32D1320 e de outras TVs irmãs que rodam a mesma base contém uma vulnerabilidade de Stack Buffer Overflow no sistema de legendas do Media Player do Sistema.
A vulnerabilidade utiliza um arquivo de legenda .psb craftado, junto com um vídeo qualquer.
O Media Player, quando abre o vídeo, ele percebe que existe um arquivo .psb com o mesmo nome do vídeo, e joga ele para o sistema de legenda do sistema, que passa para o parser de legenda PSB. O parser pega o texto da legenda e copia pra um buffer de tamanho fixo, só que sem checar o tamanho da legenda antes. Caso a legenda seja grande o suficiente, ele estoura o buffer e sobrescreve o que vem depois na stack.

  1. A TV

A TV AOC LC32D1320 roda um SoC da família Trident com CPU MIPS32 big-endian.
O sistema fala que o processador é um "DIGITAL TRIHIDTV SYSTEM".
O firmware usa o sistema de arquivos MTD multi-partição.
O boot é controlado por scripts shell, como sbtvd.sh, common.sh, live.sh, etc.

  1. A Vulnerabilidade

3.1 Achando ela

A exploração da vulnerabilidade é influenciada bastante pelo common.sh, já que ele contém um trecho que configura o sistema para deixar coredumps em um dispositivo de armazenamento USB.

Linha 121 até 138 do common.sh:
#Coredump Config

if test -n "$(mount | grep "/opt type nfs")"
then
	echo "nfs"

#2 gen coredump to pwd
	echo "core.%e.%p.%s" > /proc/sys/kernel/core_pattern
else
	echo "image"

#1 gen coredump to USB Disk
	mkdir -p /etc/core
	mount -t vfat /dev/sda /etc/core/
	echo "/etc/core/core.%e.%p.%s" > /proc/sys/kernel/core_pattern
fi

ulimit -c unlimited

Caso essa parte não existisse, provavelmente, mesmo com a vulnerabilidade achada no parser de legenda, não seria possível criar o PSB craftado com os endereços necessários para funcionar, já que não seria possível encontrá-los sem o coredump ou sem abrir a TV fisicamente.
Mas mesmo com o coredump, eu ainda precisava de uma vulnerabilidade para usar os endereços, e foi assim que fui encontrar a vulnerabilidade no parser.

A cadeia de chamada que vai para a vulnerabilidade começa no mmApp(Media Player), com a função APP_MediaSUB_GetSubtitle(), que chama Tplf_TMP_GenSub_GetSubfileDesc() em libtplftmplayerClient, que vai para int_tapi_TMP_GenSub_GetSubfileDesc em libtapi, que chama gensub_splitter_init() em libGenSub, e que finalmente chama a função vulnerável, gensub_ParsePsb(), na mesma libGenSub.

3.2 O gensub_ParsePsb()

Em gensub_ParsePsb, o parser copia o texto da legenda para um buffer de tamanho fixo sem verificação de comprimento:

Trecho do código descompilado do gensub_ParsePsb no Binary Ninja:
strcpy(arg2 + 0x11, texto_da_legenda)

Uma legenda longa o suficiente faz o buffer transbordar e sobrescrever a stack do gensub_splitter_init. Isso é importante, já que a stack guarda, além da legenda, registradores e o return address($ra), que é o endereço pra onde a função deve voltar quando terminar de executar. Caso eu consiga sobrescrever esse endereço com outro endereço que eu quiser, eu controlo pra onde o programa tem que pular.
Usando o coredump conseguido pelo common.sh, consegui confirmar onde cada valor cai dentro da legenda.

Tabelinha:

Offset no PSBO que é sobrescrito
0x000 - 0x0FFTexto da legenda (onde vai o payload)
0x100 - 0x103$s0 salvo em gensub_ParsePsb
0x104 - 0x107$s1 salvo em gensub_ParsePsb
0x108 - 0x10B$ra salvo em gensub_ParsePsb

3.3 Montando o Exploit

No libc que o sistema usa, existe o gadget que usei. O gadget preserva $a0, que o parser aponta para o início da legenda.

Trecho do libc que contem o gadget:
move $t9, $s1
jalr $t9
nop

O gadget pega o valor $s1 e salta pra ele. Como eu controlo o $s1 através do PSB, eu posso botar qualquer endereço que eu quiser, e escolhi botar o endereço do system(). Assim, quando o gadget executa, ele chama o system(). E como $a0 aponta para o texto da legenda, o texto vira o argumento para system().

Com isso, fiz um PSB com um comando que escreve em /etc/core, onde é montado o dispositivo USB. Depois do comando, boto # para o shell ignorar o que vem depois, que são os bytes dos registradores.

Trecho da legenda:

:>/etc/core/ace_psb.log #[padding até 0x104][s0][s1=system()][ra=gadget]

Usando os endereços obtidos pelo coredump, eu consegui executar o comando e foi escrito ace_psb.log no meu dispositivo USB.

Tabelinha dos endereços para caso você queira usá-los (Esses endereços nunca mudam, mas acho que são apenas da minha LC32D1320, e não funcionam em outras unidades.)

O quêEndereços
libGenSub.so0x2b273000
libc.so.00x2bbb8000
libc system()0x2bc07240
gadget0x2bbfaa44
caller_sp0x7c6e5d40

  1. Rodando meu código na TV

Como consegui executar um comando shell na TV, eu fui executar binários feitos por mim mesmo na TV.

4.1 Toolchain

Para compilar, é preciso do cross-compiler mips-linux-gnu-gcc, com as flags -EB -mips32r2 -mabi=32.

Todos os binários devem usar para conseguirem ser executados:

  • -nostartfiles com custom start.S (Querido Leitor, já existe um start.S que eu fiz para o libaoc, mas você vai descobrir ele mais pra frente.)
  • -fno-stack-protector
  • RUNPATH /usr/lib:/lib
  • Intérprete forçado: /lib/ld-uClibc.so.0

4.2 Framebuffer

Eu tentei usar o DirectFB, mas ele tem um problema de bootstrap pthread. O processo iniciado pelo system() herda um ambiente de runtime incompatível com a inicialização do manager de threads do LinuxThreads.

Eu decidi tentar usar o /dev/hidtv2dge, que é o framebuffer/OSD. Ele é diretamente mapeável via mmap sem nenhuma dependência do DirectFB ou pthread.

Com isso, peguei os valores do framebuffer.

Valores
id:            HiDTV SVP OSD
resolução:     960 x 540
bpp:           32 (ARGB8888)
stride:        3840 bytes/linha
framebuffer:   0x0e000000, 33554432 bytes (32 MiB)
page_len:      2073600 bytes (1 página = 960×540×4)
páginas mmap:  16

  1. DOOM

Após eu ter conseguido fazer meu próprio código, eu tive que fazer o que todo mundo faz quando consegue a mesma coisa, rodar DOOM.

5.1 O DOOM em si

Bem antes de achar a vulnerabilidade, eu já conhecia o doomgeneric, que é uma modificação do código do DOOM, para ser possível portar mais facilmente para outras plataformas.
Quando finalmente consegui achar a vulnerabilidade etc, como já documentado aqui nesse writeup, eu comecei a portar o doomgeneric para a TV.

Para ser possível ver o DOOM, ele escreve diretamente em /dev/hidtv2dge.

Como eu quero que essa seção seja pequena já que para mim não importa, porque o writeup é focado na vulnerabilidade em si e não no DOOM, eu não vou incluir detalhadamente como os gráficos são renderizados.

5.2 Input

Para andar, atirar, etc no DOOM, obviamente eu preciso de controles.
Como eu não tinha o controle remoto da TV, eu tive que adaptar, e usar os botões que existem fisicamente na TV.

O libdirectfb_trid_input.so cria um socket em /tmp/hp_dfb_handler para escutar quais botões são pressionados na TV. Ele recebe um pacote de 8 bytes.
O DOOM cria um socket no mesmo path, para capturar os pacotes de input que a TV envia.

Tabelinha do mapeamento dos botões físicos da TV

BotãoRawDOOM
Vol+0x0000003cFrente
Vol-0x0000003dAtrás
Menu0x00010319Atirar
CH+0x00010316Virar para esquerda
CH-0x00010317Virar para direita
Input0x00010318 / 0x3e / 0x100017 (Não tenho certeza, mas funciona)Usar

5.3 Resultado

O DOOM compilou, e consegui jogar o Shareware diretamente na TV, com os botões físicos, sem controle remoto.

Claro, teve alguns bugs e comportamentos estranhos nesse DOOM.

  • Do jeito que o DOOM escreve no framebuffer, ele fica bem lento e injogável. Tive que fazer um jeito para ao invés dele escrever toda hora os frames, ele pular alguns, para aí sim ser possível jogar, mesmo em uma velocidade média.
  • O DOOM não tem áudio, porque não fui mais a fundo para saber como funciona o sistema de áudio da TV.
  • Quando você chega no elevador do final, ele crasha e fica travado na tela.
  • Isso seria mais para outra seção, mas o Media Player continua rodando o vídeo em baixo do DOOM. Acho que apenas o parser de legendas trava, e não o media player, então o vídeo continua rodando. Minha solução foi apenas criar um vídeo sem áudio.
  • Sem inimigos no jogo.

  1. libaoc

Após eu fazer o DOOM funcionar, pensei em fazer um mini-SDK, para quem tiver o mesmo modelo de TV, ou uma TV com o mesmo sistema, conseguir fazer seus próprios binários.
Eu chamei ele de libaoc. O libaoc empacota o necessário para compilar binários e abrir esses binários pela vulnerabilidade que expliquei.

6.1 Funções

Ele é um "faz tudo" para a TV, acha os endereços com o coredump, dá suporte a teclado pra TV usar, suporte para os botões físicos, etc. Atualmente, ele está meio parado, mas estou tentando implementar suporte a Ethernet com o adaptador qf9700, e via tethering usb do celular, mas o qf9700 está mais próximo de concluir. O código do qf9700 ainda não está no libaoc porque ainda estou desenvolvendo e acho melhor não fazer push até concluir.

Lista do que ele mais faz

  • Cria os PSB craftados para conseguir o coredump e executar os binários.
  • No repositório já tem o código do port do DOOM que eu fiz.
  • Suporte para usar o framebuffer.
  • O que é necessário, como o start.S, etc para a TV rodar os binários.
  • Configura o dispositivo USB para usar na TV.
  • PSBs já feitos.

  1. Extra

Essa seção é para simplesmente eu falar qualquer coisa sobre a tv, writeup, etc. Provavelmente vai ter vários erros ortográficos porque vou simplesmente botar as coisas que vierem na minha mente sobre isso.

Bem, o writeup antigo, como já expliquei lá no início, foi feita pela IA, que eu não me lembro qual, que desde quando eu fiz, nunca gostei de como ele escreveu, o jeito, as seções, etc. Ele botou um monte de coisa aleatório lá que não precisava, tipo uns binários que eu fiz para testar sendo que aquilo nem para público iria, ia sempre ter o código fechado e não ia liberar para ninguém. Quando eu fiz esse writeup, que demorou só 1 dia mesmo, eu tava com tédio e na madrugada, e não sabia o que fazer, então eu pensei em finalmente reescrever o writeup.
Inclusive, o libaoc infelizmente foi feito por IA tbm, eu pessoalmente sempre nunca quis criar por IA, porque por exemplo, o readme é uma bosta, sinceramente, dá pra ver muito que é IA aquilo, e tem coisa nada a ver no repositório, quando eu conseguir acesso a internet via qf9700 e finalmente fazer o push, eu vou modificar tudo dali, tirar oq n é necessário, fazer um readme novo, etc.

O que primeiramente fez eu pensar nessa vulnerabilidade, foi em 2024, quando a TV que eu tinha, era uma LE22H158, onde eu tinha pensado que tinha achado uma vulnerabilidade no libpng no sistema, já que quando botei na TV o png do poc do CVE-2010-1205, a TV simplesmente desligou, eu tinha pensado que foi Kernel Panic, então liguei dnv e tentei dnv, simplesmente não desligava mais, nem achava o png. Acho que aconteceu uma coisa no sistema que simplesmente não mostrava mais o png, e eu achava que o libpng tinha corrompido. Acho que foi em 2025 ou nesse ano mesmo, de 2026, eu tentei dnv achar uma vulnerabilidade nela, e eu descobri que o libpng não tinha corrompido, porque tinha achado um jeito de ver png, apenas trocando a foto para raw, e a TV achava e mostrava o png, então tentei dnv o CVE-2010-1205, e nesta vez, não deu certo, só era uma tela preta. Então tentei procurar algo que não seja aquele CVE, tentei via música, não deu certo, tentei denovo via foto, eu achei sim uma vulnerabilidade, mas era bem besta e n conseguia ter acesso para executar código na tv, era uma vulnerabilidade de quando tu girava a foto, do nada a foto ficava um monte de coisa na tela, eu acho que era simplesmente a ram do sistema, pq sempre trocava toda hora, não era algo predefinido, sempre trocava. Sabe por que eu não falei sobre o vídeo? Porque por algum motivo do além, essa TV não suporta vídeo, e é o mesmo sistema da LC32D1320, se tu baixar a firmware da LC32D1320 no site da AOC, tem coisa da LE22H158 lá, e vice-versa, então não sei o motivo, mas a AOC só tirou o suporte de vídeo, chuto que seja por via de software mesmo, só com um código que se detectava que era o LE22H158, ele não mostrava a parte de vídeo. Pior que naquela época, quando estava fazendo a engenharia reversa usando IDA, eu tinha encontrado uma parte de vídeo, e suspeitava que tinha uma vulnerabilidade lá, só que nunca busquei a fundo porque obviamente não ia servir para mim. Então, foi em um dia, eu fiz uma coisa que não era para eu fazer(ou até foi necessário para eu tá escrevendo esse writeup), eu tentei modificar o firmware através de atualizando o firmware com um firmware modificado, naquele dia, quando botei o pendrive e atualizei, eu fiquei esperando e vendo uma tela preta, depois de alguns minutos, vendo que não tinha sinal de vida, fiquei desesperado. Nossa, achava que tinha feito um hard brick na TV, pq tentei atualizar com o firmware original mesmo e acontecia nada, então tirei ela do suporte que eu tenho para virar igual um monitor, e fui dormir triste. No dia seguinte, meus pais descobriram, e disseram que ia dá a TV AOC deles que eles usam, mas pararam de usar porque minha mãe não tinha tempo de usar, e meu pai usa o celular dele mesmo. Essa TV AOC é a LC32D1320, que foi a qual descobrir a vulnerabilidade que estou falando agora. Nesse mesmo dia, meu tio foi para minha casa, e meu pai falou sobre a minha TV para ele, então, eu, ele, e meu pai, ligamos a TV, a TV simplesmente ressuscitou, e tava lá funcionando. Só que meu pai simplesmente queria dá a TV para meu tio, porque ele conhecia um amigo que consertava TV e blá blá blá, já que tinha fungo, sei lá o que era na tela, e era horrível para minha visão, e só deu para ele e meu tio disse que ia dá pro amigo dele pra ver se resolvia e provavelmente ia pagar pro amigo dele pra ficar com a TV. Eu disse não, mas fazer o que, meu pai deu do mesmo jeito. Alguns dias depois, ou foi no mesmo dia não lembro direito. Eu e meu pai botamos a LC32D1320 dele no meu quarto, eu já sabia que era o mesmo sistema faz tempo só que com o suporte a vídeo no media player. E depois de um tempo, não lembro se foi alguns meses ou dias, eu pensei em achar vulnerabilidade naquela TV, e como que estou escrevendo esse texto agora, eu achei a vulnerabilidade no parser, e aí foi tipo um buraco de coelho, acho que o nome é isso, achei mais modelos com o mesmo sistema, duas smart tv que usam o mesmo sistema da LC32D1320 como base, etc etc, até chegar aqui. Eu agora não estou muito ativo naquela TV LC32D1320, já que agora estou com uma péssima TV Philco Roku TV de 24 polegadas, que comprei no meu aniversário já que também falaram que a TV AOC era péssima para minha visão por causa do tamanho e pipipopo. Eu queria muito achar uma vulnerabilidade nela, porque o sistema é horrível, mas como se ninguém achou uma vulnerabilidade que funcionasse até hoje, já que o primeiro e único foi em uma versão específica e tinha que ter uma placa específica, não é eu que vou achar.

Eu tenho uma ideia de criar um app tipo o Homebrew Channel do Wii, só que para a TV, porque queria transformar ela em Smart, já que como tem uma TV semelhante com o mesmo sistema, e tudo, então certeza que se eu botar internet na LC32D1320 eu consiga também. Chamo ele de Loader, só que desisti dele pq até agora falando sincero não consegui internet na TV de forma estável, foi só uma única vez que consegui um ip na TV, e a TV travava em seguida, então não serve.

Meu próximo alvo seria as TVs AOC Smart que usa o próprio sistema dela, sem ser a Roku que usam hoje em dia, e não, não tou falando daquela duas que falei antes, tou falando daquelas que é smart mesmo, com loja de aplicativo e tudo. Mas como que é horrível de achar uma TV dessa barata vendendo, eu infelizmente provavelmente nunca vou ter uma para explorar e conseguir fazer um aplicativo próprio pra ela, sem ser assinado ou da loja de aplicativos, e fazer um jailbreak para essas TVs.

Não está vindo mais nada na minha cabeça para comentar.
Espero que alguem leia realmente este writeup e fique feliz, animado, sei lá, com que sua TV, caso você tenha ela também, ou uma TV de um parente, etc, tenha uma vulnerabilidade que consiga acesso root no sistema. Eu não mencionei em lugar algum que era acesso root mas é acesso root sim, não tem um usuário etc nessa tv a não ser o superusuário.
Espero também que algum Youtuber aí, pode ser de outro país, do Brasil mesmo, faça um vídeo sobre a TV AOC e rodando DOOM, programas feito por ele mesmo, etc, usando a vulnerabilidade que achei e usando também o libaoc. Eu sei que tem pelo menos UMA pessoa que gostaria isso já que eu tava em um vídeo em inglês, ia falar gringo mas acho que não é um bom tom, e o vídeo era alguma coisa de o cara usando um exploit, eu acho, alguma coisa assim, para rodar acho que era ou outro sistema ou era o RetroArch? E não, não era o vídeo do Bringus Studios ou algo dele não, mas era um vídeo semelhante ao estilo dele, gravando uma mesa e tudo mais, só não lembro quem, e tinha um comentário dessa pessoa pedindo para o cara gravar um vídeo jogando DOOM em um monitor da AOC, claro, monitor não é igual a uma TV, mas acho que a pessoa que comentou ia gostar do mesmo jeito, e o criador do vídeo comentou lá, falando que ia tentar achar um jeito de rodar e ia fazer o vídeo, mas tipo, o cara não é do Brasil, fala inglês, e acho que foi só um ano depois que fiz writeup e o libaoc, tudo em português, então eu ACHO, que ele desistiu, e é claro que ele desistiu, duvido que ele achou um jeito porque eu também pesquisei antes do writeup e tudo mais e não tinha nada, e se eu pesquisar agora vídeos sobre conseguir jogar DOOM em qualquer coisa da AOC, eu não acho. E mesmo se eu fizesse o libaoc, o writeup etc, tudo na mesma época, ele não iria achar porque ele ia pesquisar em inglês e não ia achar porque não ia indexar direito o libaoc e o writeup, e porque tanto o writeup e o libaoc(claro que tem uma parte em inglês lá do libaoc mas acho que não interfere em nada), mesmo pesquisando em português, você não acha. Depois eu vou tentar achar o comentário do cara para ver se ele falou mais alguma coisa ou o criador do vídeo falou que fez o vídeo mas não postou, ou se ele não achou nada, e etc etc. Se tu tiver mais informações sobre isso ou qualquer coisa que queira, vai no meu site normal e pegue meu email e converse comigo.

Obrigado para quem leu isso.

Pub: 2026-07-13 23:43 UTCEdit: 2026-07-13 23:43 UTCViews: 7