0CTF 2015 Quals CTF VEZEL Writeup

Category: Mobile
Points: 100
Solves: 105
Description:

Evermars says he is good at repackaging Android applications, for example.

Write-up

分析過程可以參考下面三個鏈接, 程序很簡單flag由兩個字符串相加內(nèi)容計(jì)算, 其中一個getCRC可以直接得到, 而apk簽名可以用Main.class運(yùn)行得到, 比較笨的辦法是自己寫一個apk, 利用PackageManager得到簽名.

Other write-ups and resources

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.security.Signature;
import java.security.cert.*;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.logging.Level;
import java.util.logging.Logger;
 
public class Main {
 
 private static final Object mSync = new Object();
 private static WeakReference<byte[]> mReadBuffer;
 
 public static void main(String[] args) {
  if (args.length < 1) {
   System.out.println("Usage: java -jar GetAndroidSig.jar <apk/jar>");
   System.exit(-1);
  }
 
  System.out.println(args[0]);
 
  String mArchiveSourcePath = args[0];
 
  WeakReference<byte[]> readBufferRef;
  byte[] readBuffer = null;
  synchronized (mSync) {
   readBufferRef = mReadBuffer;
   if (readBufferRef != null) {
    mReadBuffer = null;
    readBuffer = readBufferRef.get();
   }
   if (readBuffer == null) {
    readBuffer = new byte[8192];
    readBufferRef = new WeakReference<byte[]>(readBuffer);
   }
  }
 
  try {
   JarFile jarFile = new JarFile(mArchiveSourcePath);
   java.security.cert.Certificate[] certs = null;
 
   Enumeration entries = jarFile.entries();
   while (entries.hasMoreElements()) {
    JarEntry je = (JarEntry) entries.nextElement();
    if (je.isDirectory()) {
     continue;
    }
    if (je.getName().startsWith("META-INF/")) {
     continue;
    }
    java.security.cert.Certificate[] localCerts = loadCertificates(jarFile, je, readBuffer);
    if (false) {
     System.out.println("File " + mArchiveSourcePath + " entry " + je.getName()
         + ": certs=" + certs + " ("
         + (certs != null ? certs.length : 0) + ")");
    }
    if (localCerts == null) {
     System.err.println("Package has no certificates at entry "
         + je.getName() + "; ignoring!");
     jarFile.close();
     return;
    } else if (certs == null) {
     certs = localCerts;
    } else {
     // Ensure all certificates match.
     for (int i = 0; i < certs.length; i++) {
      boolean found = false;
      for (int j = 0; j < localCerts.length; j++) {
       if (certs[i] != null
           && certs[i].equals(localCerts[j])) {
        found = true;
        break;
       }
      }
      if (!found || certs.length != localCerts.length) {
       System.err.println("Package has mismatched certificates at entry "
           + je.getName() + "; ignoring!");
       jarFile.close();
       return; // false
      }
     }
    }
   }
 
   jarFile.close();
 
   synchronized (mSync) {
    mReadBuffer = readBufferRef;
   }
 
   if (certs != null && certs.length > 0) {
    final int N = certs.length;
     
    for (int i = 0; i < N; i++) {
     String charSig = new String(toChars(certs[i].getEncoded()));
     System.out.println("Cert#: " + i + "  Type:" + certs[i].getType()
      + "\nPublic key: " + certs[i].getPublicKey()
      + "\nHash code: " + certs[i].hashCode()
       + " / 0x" + Integer.toHexString(certs[i].hashCode())
      + "\nTo char: " + charSig);
    }
   } else {
    System.err.println("Package has no certificates; ignoring!");
    return;
   }
  } catch (CertificateEncodingException ex) {
   Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
  } catch (IOException e) {
   System.err.println("Exception reading " + mArchiveSourcePath + "\n" + e);
   return;
  } catch (RuntimeException e) {
   System.err.println("Exception reading " + mArchiveSourcePath + "\n" + e);
   return;
  }
 }
 
 private static char[] toChars(byte[] mSignature) {
    byte[] sig = mSignature;
    final int N = sig.length;
    final int N2 = N*2;
    char[] text = new char[N2];
 
    for (int j=0; j<N; j++) {
      byte v = sig[j];
      int d = (v>>4)&0xf;
      text[j*2] = (char)(d >= 10 ? ('a' + d - 10) : ('0' + d));
      d = v&0xf;
      text[j*2+1] = (char)(d >= 10 ? ('a' + d - 10) : ('0' + d));
    }
 
    return text;
    }
 
 private static java.security.cert.Certificate[] loadCertificates(JarFile jarFile, JarEntry je, byte[] readBuffer) {
  try {
   // We must read the stream for the JarEntry to retrieve
   // its certificates.
   InputStream is = jarFile.getInputStream(je);
   while (is.read(readBuffer, 0, readBuffer.length) != -1) {
    // not using
   }
   is.close();
 
   return (java.security.cert.Certificate[]) (je != null ? je.getCertificates() : null);
  } catch (IOException e) {
   System.err.println("Exception reading " + je.getName() + " in "
       + jarFile.getName() + ": " + e);
  }
  return null;
 }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歧杏,一起剝皮案震驚了整個濱河市先舷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薄湿,老刑警劉巖蘸嘶,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盼铁,居然都是意外死亡指煎,警方通過查閱死者的電腦和手機(jī)蹋偏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來至壤,“玉大人威始,你說我怎么就攤上這事∠窠郑” “怎么了黎棠?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镰绎。 經(jīng)常有香客問我脓斩,道長,這世上最難降的妖魔是什么畴栖? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任随静,我火速辦了婚禮,結(jié)果婚禮上吗讶,老公的妹妹穿的比我還像新娘燎猛。我一直安慰自己,他們只是感情好照皆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布重绷。 她就那樣靜靜地躺著,像睡著了一般膜毁。 火紅的嫁衣襯著肌膚如雪昭卓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天爽茴,我揣著相機(jī)與錄音葬凳,去河邊找鬼。 笑死室奏,一個胖子當(dāng)著我的面吹牛火焰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胧沫,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼昌简,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了绒怨?” 一聲冷哼從身側(cè)響起纯赎,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎南蹂,沒想到半個月后犬金,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年晚顷,在試婚紗的時候發(fā)現(xiàn)自己被綠了峰伙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡该默,死狀恐怖瞳氓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栓袖,我是刑警寧澤匣摘,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站裹刮,受9級特大地震影響音榜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜必指,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一囊咏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塔橡,春花似錦梅割、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至癞谒,卻和暖如春底燎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弹砚。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工双仍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桌吃。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓朱沃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茅诱。 傳聞我的和親對象是個殘疾皇子逗物,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,276評論 25 707
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,444評論 0 17
  • 用十分鐘這下點(diǎn)小感悟吧 最近尤愛文字瑟俭,多數(shù)的感情文字的表達(dá)與演繹甚至超越直觀面對表演翎卓,在體會過人生幾何大的轉(zhuǎn)折后所...
    Belle__閱讀 173評論 0 0
  • 姓名:樓靈芝 單位:杭州熙林服飾 【日精進(jìn)打卡第170天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》背誦1遍,共620遍摆寄; 《大...
    心鏡_8ef4閱讀 160評論 0 0