06/06/2011

Defcon 19 f400 writeup

Hint

Can you beleive people do this? ddTEK doesn't. (http://pwn32.ddtek.biz/)

Résolution

Si on allait sur la page en question avec un user agent différent d'un iphone / ipod, on se faisait jeter sur la page faq.html. Afin d'étudier la page il fallait simplement rentrer dans l'url le keyword "faq"

http://pwn32.ddtek.biz/?suce_mes_couilles=faq

A partir de là, on pouvait étudier les sources comme on voulait. Un wget aurait suffit aussi. On voit que la page request un pdf :

http://pwn32.ddtek.biz/_/iPhone2,1_3.1.2.pdf

Donc on va étudier le pdf en question avec un outil pdf-parser.py.
On peut remarquer que l'objet 13 contient du stream, on décide donc de l'extraire.

python2 pdf-parser.py -o 13 --raw --filter iPhone2,1_3.1.2.pdf > bin

Quand on regarde l'output de cette objet avec la commande string, on a l'impression que c'est une application iphone.
Mais là une chaine nous saute aux yeux :

http://pwn32.ddtek.biz/wad.bin

Une fois ce fichier récupéré, on teste la commande file et se rend compte que ce ne sont que des datas.
Mais on peut voir une archive 7z à l'offset 0x1b521 :

hexdump -C wad.bin | grep -i 7zx
0001b520  01 82 a1 9c ec fd 37 7a  58 5a 00 00 04 e6 d6 b4  |......7zXZ......|

On va extraire donc l'archive :

dd if=./wad.bin skip=111905 of=./wad.xz bs=1 count=3797368

Une fois l'archive récupéré, on se rend compte que c'est un rootfs.
On touille dedans pendant un moment, en se demandant mais qu'est qu'on cherche ?

A partir de là on teste de faire differ à partir du pdf original :

http://jailbreakme.com/_/iPhone2%2c1_3.1.2.pdf

Mise à part des ".svn" un binaire nous saute aux yeux : /usr/bin/dd
Si on string dessus, ca n'a pas du tout l'air d'un binaire dd.
On regarde avec IDA le code ARM mais sans résultat, ce code ne fait strictement rien, d'intéressant.
Par ailleur il y a 4 grand nombres qui ressortent, on décide donc de les mettre dans des double dans un programme en C :

#include <stdio.h>

double
a=41358753080588780315500696417148503196370008505043360338644939021284539327654424368206170740213813076058322365516034006270625614745638277215965686397551374257625369654940618745555501980517665488240640.000000;
double
b=273020167277193934342483321951392739131140631949880731514555218503200924051802886516416983650292597201352459748672990971210795734498587443982103979231419127824384.000000;
double
c=109868682199889090983893607446542759799370795099978204527886814871815275332732684149782782932243583477726231807149879389352427825978796531514954916754473975757796372140255258111985922092457311221042226817127194804092923531694479704498641458322997248.000000;
double
d=8887824086628450300085222950423508459269193936749714415660759918033307608850811297588582757614917095982291010098451602122996273175590810261747631678220597664532468741350897995232883808808537964727011624779797357169712195651789942060581116921485444775936.000000;


int main(void)
{
  char *p = NULL;
  int i;

  p = (char*)&a;
  for (i = 0; i < sizeof(double); i++)
    printf("%c", p[i]);
  p = (char*)&b;
  for (i = 0; i < sizeof(double); i++)
    printf("%c", p[i]);
  p = (char*)&c;
  for (i = 0; i < sizeof(double); i++)
    printf("%c", p[i]);
  p = (char*)&d;
  for (i = 0; i < sizeof(double); i++)
    printf("%c", p[i]);
}

Key

Et cela nous affiche gentiment la clef qui est :

DDTEKJailbreaksarethemostbestest