---
# System prepended metadata

title: Angstromctf

---

# Angstromctf

## checkers (rev)

![](https://i.imgur.com/yyyExHU.png)


mở ida thấy ngay flag OMEGALUL

![](https://i.imgur.com/Haha7zA.png)


> actf{ive_be3n_checkm4ted_21d1b2cebabf98}



---


## zaza (rev)

![](https://i.imgur.com/lXviprc.png)

đọc sudo code ida thì ta sẽ chú ý vào cái biến sau `v5, v6, s`

![](https://i.imgur.com/a3YswHJ.png)

ở đây ta nhập `v5 = 4919`, v6 là 1 số bất kì, giờ ta chỉ cần phải đi tìm xem `s` sẽ là gì. thấy nó compare với chuỗi `2& =$!-( <*+*( ?!&$$6,. )' $19 , #9=!1 <*=6 <6;66#` sau khi `s` thực hiện hàm `xor()`.

![](https://i.imgur.com/I29jtM3.png)
 vậy chỉ cần xor ngược 2 chuỗi `2& =$!-( <*+*( ?!&$$6,. )' $19 , #9=!1 <*=6 <6;66#` và `anextremelycomplicatedkeythatisdefinitelyuselessss` thì sẽ tìm được `s`
 
**script**
```
str1 = "anextremelycomplicatedkeythatisdefinitelyuselessss"
str2 = "2& =$!-( <*+*( ?!&$$6,. )' $19 , #9=!1 <*=6 <6;66#"

for i in range(len(str1)):
    print(chr(ord(str1[i]) ^ ord(str2[i])), end = '')
```
 
`s` sẽ là `SHEEPSHEEPSHEEPSHEEPSHEEPSHEEPSHEEPSHEEPSHEEPSHEEP`

![](https://i.imgur.com/snLDQvk.png)


> flag : actf{g00dnight_c7822fb3af92b949}


---


## bananas

![](https://i.imgur.com/cSCJV4k.png)

tải chall về nó sẽ cho ta 1 file bytecode erlang mình có search tool để decompile file này ra source code để ta có thể đọc 

mình có thảo khảo tool này: [https://github.com/michalmuskala/decompile](https://)

![](https://i.imgur.com/dgF4eNs.png)

mình đã decompile ra 1 file source code.mình nhận ra rằng mình sẽ nhập vào input với dạng "number + `bananas`"

vậy cái số nhập vào kia ta sẽ tìm kiểu gì
![](https://i.imgur.com/0Z3phBJ.png)

đọc hàm `check`

![](https://i.imgur.com/f44IWfg.png)

từ hàm này thì mình thực hiện phép tính (971+1)/9-5. và có kết quả là 103

=> input nhập vào là `103 bananas`

![](https://i.imgur.com/XTXmQWt.png)

> actf{baaaaannnnananananas_yum}



---


## moon

![](https://i.imgur.com/0LriCgo.png)

tải file elf 32MB + với cái graph view hàm main trông như thế này đã muốn gập máy đi nằm không làm nữa rồi :<<

![](https://i.imgur.com/iEcxyt1.png)

Đọc code asm của chương trình, mình thấy là hàm main sẽ yêu cầu ta nhập vào cái số tự nhiên với mỗi số thứ N mà ta nhập vào, chương trình sẽ thực hiện hàm `func(N-1)` N lần rồi sẽ yêu cầu ta nhập tiếp

![](https://i.imgur.com/L0onF4g.png) 

![](https://i.imgur.com/AEyd58n.png)

oke giờ ta sẽ vào xem từng `func(N-1)` xem nó sẽ làm gì 

đây là 1 phần của hàm `func0`

![](https://i.imgur.com/vNcCjNW.png)

đây là 1 phần của hàm `func1`

![](https://i.imgur.com/kyISNTe.png)

và đây là 1 phần của hàm `func2`

![](https://i.imgur.com/u6xtJZd.png)

đọc 3 hàm này mình thấy các biến(khởi tạo bằng 0) được thêm vào với 1 giá trị khác nhau theo từng hàm nhưng thứ tự của các biến lại không đổi qua tất cả các hàm

tiếp tục xem đến cuối hàm main thì mình có thấy đoạn code này 

![](https://i.imgur.com/N31paNS.png)

ở đây sau khi thực hiến hết cái luồng của chương trình, kq của trừng biến sẽ được so sánh với lượng data có trong `needed`, nếu như giống sẽ in ra `right` và ngược lại

Tóm lại, có thể hiểu đơn giản bài này chỉ yêu cầu ta giải 1 ma trận hay 1 hệ phương trình 1293 phương trình với 1293 biến.

vậy giờ để giải được, ta cần phải lấy được data ra thì mới tính toán được

![](https://i.imgur.com/xwvxwTk.png)

data check thì ta cop ở đây

cái làm mình thấy đau đầu ở đây chính là copy data cộng vào từng biến ở mỗi hàm. mình có dùng tool `capstone-engine` nhưng mà ngay cái thời điểm mà mình viết cái wu này, mình có tìm tại code của script bốc data ra thì mới nhận ra mình đã save code của script giải ma trận vào code bốc data LMFAOO

![](https://i.imgur.com/YX0ZmLC.jpg)

mình thì quá lười code lại nên là coi như mình cop tay đống data add nhé

ok, giờ ta đã có `data add và data check` thì chỉ cần script giải ma trận nữa là xong

thì mình có hỏi mentor là Ajomix thì được suggest là sử dùng `pwntool` và `sagemath`

**script**

```
from sage.all import *
from pwn import*
N = 1293

with open("values.txt", "r") as f:
    data = f.readlines()
    data = [eval(a) for a in data]

x = [[None for _ in range(N)] for _ in range(N)]
for i in range(N):
    for j in range(N):
        x[j][i] = data[i][j]

y = eval(open("goal.txt", "r").read())
y = vector(y)
x = Matrix(x)
rs = x.solve_right(y)

data = rs.list()
data = [int(i) for i in data]

for i in data:
    print(chr(i&0xff),end="")
```
 khi chạy script thì nó sẽ in như thế này 
 
 ![](https://i.imgur.com/iyap255.png)

> flag: actf{3verything_is_just_linear_algebr4_33e431e52e896c92}
