Thứ Hai, 10 tháng 10, 2016

[writeup][PPC] HITCON2016

Vì pwn heap khó nên mình chỉ làm 2 bài PPC

FLAME






Đề cho một file elf sử dụng cấu trúc powerpc. Vì IDA của mình không có pseudo-code C được powerpc. Ban đầu mình nhin asm code rồi xem instruction để tự dịch sang code C nhưng vì khó với nếu dịch thiếu thì sẽ rất mất công nên quyết định kiếm tool. Sau một hồi mò thì kiếm đuọc một web decompile khá tốt https://retdec.com .
http://bugs.vn/5120

Đọc sơ qua code (có vẻ hơi khác với asm nhưng vẫn đúng).
Ban đầu sẽ kiểm tra flag nhập vào có độ dài là 35. Nếu sai thì thoát khỏi chương trình.
Vòng lặp đầu tiên, sẽ lấy từng kí tự trong chuỗi nhập vào xor với một số random (Chuối các số random này là cố định, các số trong chuỗi khác nhau nhưng mọi lần là như nhau ).
Vòng lặp thứ hai là kiểm tra từng số đã xor với một chuỗi các số đã có sẵn trong stack.

Việc đầu tiên là leak hết chuỗi số random.
thêm một dòng printf("%d",v7) và compile code lại. Sau khi chạy thử ta có chuỗi số.

Sau khi xem thì để ý trong IDA có đoạn này. Xem xét các giá trị trong đó thì hơi vô nghĩa

























Vì biết chắc flag có format hitcon{...27char....}
nên sẽ thử kiểm tra
3222^ord('h') = 3326 số này thì vô nghĩa nên thử div cho 256 sau do chuyen ve hex xem sao thì ra được như hình


export data này ra... Sau đó code kiếm flag thôi.
Code :


a=[254, 89, 93, 113, 13, 6, 222, 168, 97, 218, 120, 130, 
169, 95, 94, 176, 191, 198, 56, 93, 9, 237, 7, 192, 153, 
86, 69, 146, 138, 47, 74, 100, 148, 218, 31]
x=[3222,2096,2345,2066,1122,104,2725,4088,1361,2445,
2123,1776,4089,3900,513,3537,3981,3060,3339,2320,3377,
1953,894,415,936,2404,2586,737,3258,2416,121,2384,417,2467,354]
flag=''
for i in range(35):
    k=x[i]/256
    flag+=chr((k*256+a[i])^x[i])
print flag 
http://bugs.vn/5121
FLAG : hitcon{P0W3rPc_a223M8Ly_12_s0_345y}





BEELZEMON

Đề đại khác cho cho 2 số n và k trong khoảng 0 -> 20. Sau đó sinh ra bộ S {a | -2^n <= a <= 2^n-1}
Rồi tự bộ trên sinh ra 2 bộ A và B sao cho số phần tử của 2 bộ là như nhau và bộ thỏa mãn điều kiện sum(a^k | a in A) = sum(b^k | b in B)

nc thử thì thấy trả về các cặp số như 1 1, 4 1, 2 2,4 3... Theo như xem xét thì các cặp số này thỏa mãn sum(S) chia hết cho 2.
Mình thử với các cặp số nhỏ như 1 1, 2 2, 3 1 trước. Và sau đó mình nhận ra một điều là thứ tự lấy các số trong S vào bộ A luôn theo một thứ tự nhất định 0,3,5,6,9,... Thử tìm thử dãy số này trên google thì biết rằng đây là dãy các số Evil number.
Evil number là các số thỏa mãn điều kiện là số các số một trong mã nhị phân của số đó = 2a (ngoại trừ số 0). Vì n<=20 nên mình sẽ sinh ra khoảng 2^20 số.
Đến đây thì xong  rồi. Code :
from pwn import *

indexA=[]
print '[+] Evil Numbers...'

def evil(n):
    if n==1:
        return 0
    if n%2==0:
        return 3*n-3-evil(n/2)
    elif n%2==1:
        return evil((n+1)/2)+n-1
        
for i in xrange(1,2**20-1):
    indexA.append(evil(i))
    
print '[*] Done'

def genSet(n):
    s=[]
    for i in range(-2**n,2**n):
        s.append(i)
    return s

def genSetA(s):
    A=[]
    for i in indexA:
        if i>len(s):
            break
        A.append(s[i])
    return A
    

def solve():
    r =remote('52.198.217.117',6666)

    while(1):
        c=r.recvline()
        c=c[:c.find('\n'):]
        data=c.split(' ')
        if c[:6]=='hitcon':
            print 'FLAG:',c
            break
        n=int(data[0],10)
        k=int(data[1],10)
        pl=''
        for i in genSetA(genSet(n)):
            pl+=str(i)
            pl+=' '
        r.send(pl+'\n')
solve()
FLAG : hitcon{8Ee121m0n kNow3 ev1l Num8e2}

Thứ Hai, 3 tháng 10, 2016

[showup][H4ck1t] Blabla

Giải xài platform của facebook ctf nên rất lag. Pwn cũng chả mấy bài nên toàn làm for, misc này nọ thôi.
1 vài bài mình làm
https://drive.google.com/drive/folders/0B-QPcxnExPUcbDNmUC1OdTJDa0E?usp=sharing
Bài nào có có code thì show code thôi chứ cũng k khó lắm. Mấy bài pcap thì khá dễ nên không bàn...

100 PPC
Bài này thì giải nén mấy file đó ra. Trong đó có khoảng 100 file nén lại với nhau thì phải (?). File cuối cùng là flag.
code :
import os
filename=98
#thay duong dan 
path = "/home/z22/ctf/h4ck1t/100_00edb54bed7e46bd5cdb7c06059881c2.1/work_folder/99.1/work_folder/"
while (1):
 try:
  os.system('dtrx -f --no-directory *')
  path = path + "work_folder/"
  os.chdir(path)
 except:
  os.system("cat flag")
  break
#flag 0W_MY_G0D_Y0U_M4D3_1T


CryptoPixels:
Đọc code, hiểu, sau đó code decrypt.
code :
from PIL import Image
img1=Image.open('encrypted.png')
flag=''
l_flag=img1.getpixel((0,0))[0]
x=img1.getpixel((0,0))[1]
y=img1.getpixel((0,0))[2]
for i in range(l_flag):
  x1=img1.getpixel((x,y))[1]
  y1=img1.getpixel((x,y))[2]
  flag+=chr(img1.getpixel((x,y))[0])
  x=x1
  y=y1
print 'h4ck1t{'+flag+'}'
Planet :
Nhìn kĩ có mấy pixels khác màu. Get từng pixel ra xong ghép lại ra flag
code:
from PIL import Image

data=[]
im=Image.open('planet.png')
im1=Image.open('flag.png')
pix=im.load()
it=0
for i in range(0,1512,24):
 for j in range(0,1512,24):
  data.append(pix[i,j]);
 it=it+1
print it

t=0

for i in range(63):
 for j in range(63):
  im1.putpixel((i,j),data[t])
  t=t+1

im1.save('flag.png')
Test :
đọc đoạn đầu " \'00\'89\'50\'4e\'47\ "
là đoán đây là mã hex file signature của file png (code dễ lắm nên tự code nha ).
Sau khi lấy được hình. dùng binwalk xem thì thấy có file zip.
Trong file zip có chưa flag.txt.
Lấy đoạn đó ra. unzip ra được flag.