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}

Không có nhận xét nào:

Đăng nhận xét