Recent posts

HITCON Quals 2015 - puzzleng

Next Generation of Puzzle!

puzzleng은 파일을 암호화해주는 프로그램인 encrypt와 암호화된 파일인 flag.puzzle두 파일로 구성된 forensic 문제이다.

1. encrypt 분석

encrypt는 간단한 프로그램이다. 암호화 과정은 다음과 같다.

  • 주어진 비밀번호를 SHA1 해시하여 얻은 20바이트를 암호화 키로 사용한다.
  • 대상 파일을 같은 크기의 20조각으로 나누어 각 조각을 암호화 키의 한 바이트로 xor한다.

2. 파일 헤더 복구

암호화 키에 대한 정보가 하나도 없으므로 직접 모든 경우를 대입해 봐야 한다. 그러나 20바이트를 전부 시도할 수는 없어서 파일 헤더가 있을 것으로 예상되는 첫 번째 블록만 xor해보았다.

from hexdump import hexdump

f = open("flag.puzzle")
raw = f.read()
f.close()

raw = map(ord, list(raw))
L = len(raw)
B = (L + 19) // 20
k = [0]*20

def decrypt():
    for i in range(20):
        start = i * B
        end = min((i+1) * B, L)
        for j in range(start, end):
            raw[j] ^= k[i]

def dump_block(i):
    start = i * B
    end = min((i+1) * B, L)
    block = raw[start:end]
    block = ''.join(map(chr, block))
    hexdump(block)

n = 0
for i in range(256):
    print "="*40, i
    k[n] = i
    decrypt()
    dump_block(n)
    decrypt()

그 결과 키의 첫 번째 바이트가 101일 때 PNG 헤더가 나오는 것을 확인했다.

======================================== 101
00000000: 89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  .PNG........IHDR
00000010: 00 00 03 90 00 00 03 90  01 03 00 00 00 75 82 0c  .............u..
00000020: 67 00 00 00 06 50 4c 54  45 8f 77 b5 8f 77 b4 6d  g....PLTE.w..w.m
00000030: c4 59 ac 00 00 00 02 74  52                       .Y.....tR

Read more


LD_PRELOAD hooking

https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/

/* target.c */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
  srand(time(NULL));
  int i = 10;
  while(i--) printf("%d\n",rand()%100);
  return 0;
}
/* hook.c */
int rand()
{
  return 42;
}

이렇게 두 파일을 작성한다.

gcc target.c -o target
./target

이걸 실행하면 0~99 사이의 랜덤한 숫자가 열 개 출력된다.

gcc -shared -PIC hook.c -o hook.so
env LD_PRELOAD=$PWD/hook.so ./target

이렇게 hook.so를 만들고 LD_PRELOAD를 설정한 뒤 실행하면 42가 열 개 출력된다. 함수 이름만 맞춰주면 모든 dynamically linked call을 후킹할 수 있다.


HITCON Quals 2015 - fireblossom

fireblossom은 misc 카테고리의 문제이다. 문제는 fireblossom과 fireblossom_claypot이라는 두 개의 ELF로 구성되어있고, nc 주소와 포트가 주어져있다.

1. Reverse claypot

fireblossom_claypot은 매우 작은 프로그램인데, 외부에서의 ptrace를 허용하고 코드를 읽은 뒤, 이를 실행해주는 것이 다이다.

claypot.png

Read more


HITCON Quals 2015 - Risky

Risky is a RISC-V revserse task.

1. Install tools

When I opened the binary in IDA, it showed Unknown CPU [243]. ELF Header says that architecture #243 is RISC-V.

Next I installed riscv toolchain from https://github.com/riscv/riscv-tools. Installation took quite long but went well.

Now we have readelf and objdump for riscv.

Read more


LLVM Obfuscator

홈페이지: https://github.com/obfuscator-llvm/obfuscator/wiki

LLVM Obfuscator는 LLVM으로 C/C++ 프로그램을 컴파일하는 과정에서 IR(Intermediate Representation) 수준의 난독화(Obfuscation)를 해주는 툴이다.

Control Flow Flattening, Instructions Substitution, Bogus Control Flow, 이 세 기법을 구현해 놓았다.

1. 설치 및 사용

https://github.com/obfuscator-llvm/obfuscator/wiki/Installation 를 따라하면 된다.

cmake 외에 특별한 dependency는 없는 듯 하다. 소스에 clang과 LLVM이 통째로 포함되어 있어서 빌드가 상당히 오래 걸린다. 최소 2~30분 정도는 생각해야 한다.

Read more