# Easy Crack
Chạy thử file:
Nhập đại "Nhihi" vào thử:

thế nên cần tìm chuỗi đúng để nhập vào
kiểm tra thì thấy Easy_CrackMe.exe: Pe32 thế nên mở IDA để kiểm tra
Mới vào thì chả thấy gì, nhưng mà biết được nếu nhập sai thì có một cái khung hiểu thị "Incorrecr Password" thế nên shift + F12 để tìm xem có chuỗi khi nhập đúng và "X" t`ại chỗ đó để tìm `với điều kiện như thế nào thì input đầu vào của mình mới đúng:
- Shift F12:

- Nhấn đúp vào "Congratulation !!" và "x" tại địa chỉ đó thì nó nhảy tới đây

lướt lên để kiểm tra các giá trị điều kiện
thì thấy tại 4 vị trí này có so sánh ký tự


mình bay vô debug thì thấy nó so sánh lần lược là str1 + str2 + str3 + str0 = "a5yR3versingE" -> sắp xếp lại string nhập vào là: "Ea5yR3versing"
>flag: "Ea5yR3versing"
# Easy Keygen
chạy thử file thì thấy file bảo nhập name với serial (name mình nhập là "Nhihi" còn serial mình nhập là cái serial của bài luôn thì biết đâu để để flag là "Nhihi" luôn thì sao)

"Nhihi" mà đúng là mình mừng lắm luôn ă mà rất tiếc nó wrong rồi tác giả kì ghê 😒
Ném vào ida để kiểm tra, bài này mình cũng debug đặt đại một BP nào đó sau khi nhập name thì thấy sau khi biến đổi name thì có in ra một dãy hex nào đó chắc đây là serial của name mới nhập vào rồi
Nhập thử "Nhihi" và đặt một BP sau đoạn đã nhập

rồi bay lên coi lại dãy hex của biến "Buffer" ở trên = "5E48597849"
chạy thử chương trình với name và serial là ["Nhihi", "5E48597849"] thấy đã oke rồi nè

tiếp là kiểm tra xem serial biết đổi như thế nào thì thấy
bấm tab để chuyển qua code c:

viết lại dưới python là:
```python
a = [16,32,48]
t = "Nhihi"
for i in range (len (t)):
print(hex(ord(t[i]) ^ a[i%3]))
```
vậy nên chúng ta xor ngược lại cái serial để cho để tìm name:
```python
a = "5B134977135E7D13"
b = bytes.fromhex(a)
key = [16,32,48]
for i in range(len(b)):
print(chr(b[i]^ key[i%3]),end = "")
#K3yg3nm3
```
> flag: K3yg3nm3
# Easy Unpack
mở cái ReadMe.txt lên thì nó chỉ bảo mình tìm OEP thôi

mở IDA (tick vào Manual load và tắt create import segment nha)

>flag: 00401150
# Easy ELF
chạy file:

mở ida:

trong hàm `main` có gọi tới 2 hàm là `sub_8048434` và `sub_8048451` hàm đầu dùng để gọi tới scanf để nhập chuỗi vào và hàm sau dùng để kiểm tra chuỗi nhập vào có đúng hông

có 6 trường hợp để so sánh lận thế nên F5 cho dễ đọc

```python
byte_804A020 = 120 ^ 0x34
byte_804A021 = 49
byte_804A022 = 124 ^ 0x32
byte_804A023 = (-35 & 0xff) ^ 0x88
byte_804A024 = 88
byte_804A025 = 0
arr = [byte_804A020,byte_804A021,byte_804A022,byte_804A023,byte_804A024,byte_804A025]
print("".join(chr(i) for i in arr))
# L1NUX
```
còn không bài này cũng có thể dùng [`angr`](https://blog.notso.pro/2019-03-20-angr-introduction-part0/) để làm vì đã biết được địa chỉ gọi tới "Correct!\n" là `0x08048505`

script:
```python
import angr
import sys
def main(argv):
path_to_binary = "./Easy_ELF" # path of the binary program
project = angr.Project(path_to_binary)
initial_state = project.factory.entry_state()
simulation = project.factory.simgr(initial_state)
print_good_address = 0x08048505 # :integer (probably in hexadecimal)
simulation.explore(find=print_good_address)
if simulation.found:
solution_state = simulation.found[0]
solution = solution_state.posix.dumps(sys.stdin.fileno())
print("[+] Success! Solution is: {}".format(solution.decode("utf-8")))
else:
raise Exception('Could not find the solution')
if __name__ == '__main__':
main(sys.argv)
```
>flag: L1NUX
# ImagePrc
chạy thử file:

viết "Nhihi" bảo thêm bông hoa vào và check thử thì thấy nó bảo "Wrong" rồi
vì thế vứt vào ida:
trong WinMain thấy có gọi tới hàm `sub_401130` vì chưa biết hàm đó dùng để làm gì nên nhảy vào đó xem thì thấy

ảnh có kích thước (0xc8,0x96)

ở đây nó có gọi `LoadResource` và so sánh nếu hông bằng thì nhảy thẳng tới "Wrong" luôn nên vứt file này vào [ Resource Hacker](https://www.majorgeeks.com/files/details/resource_hacker.html)

trong này chỉ có giá trị `FF` và `00` đại diện cho màu đen(00) màu trắng (FF) vậy nên nén `101 : 1042` này thành file raw (chuột phải -> save *manifest resource...) tên là "ImagePrc.raw"
và đọc file này
```python=
import numpy as np
import matplotlib.pyplot as plt
imgData = np.fromfile('ImagePrc.raw', dtype = np.uint8)
imgData = imgData.reshape([150, 200, 3])
plt.imshow(imgData, origin = 'lower')
plt.show()
```

flag đây rồi hihi
> flag: "GOT"
# Replace
chạy file thì thấy thế này nè:

đi tìm số đầu vào thôi (nó cho nhập vào số thuii)
shift F12 thấy có "Correct!" nè

nhảy tới nơi gọi nó thui

nhảy tới thì thấy có `GetDlgItemInt` cái này chắc để chuyển chuỗi mình nhập vào thành số đây mà
debug đặt BP tại chỗ này và debug thôi
nếu mà nhập vào `0409` thì thấy lỗi này

`0410` thì lỗi này

debug mấy l thầy thì thấy giá địa chỉ không tìm thấy này (bị lỗi) tỉ lệ thuận với nhau
vì thế để gọi tới `loc_401071` thì giá trị tính được phải = 00401071 để nhảy về "Correct!" nè
vì mấy cái số này tỉ lê thuận với nhau và số nhập vào là số dương thế nên & 0xfff


> flag là: 2687109798
# CSHOP
Chạy thì thấy chả có gì


kiểm tra thì thấy là là dot net nên vứt vào dnSpy

trong `FrmMain` có khởi tạo một số text là ký tự nè
xuống dưới tới dòng 64 thì gọi lại cái đống ký tự trên nè

nhưng mà ở dòng 61 set size = (0,0) thế sao mà xem được sửa lại nó bằng số mình thích thôi (mình thích số 49)
sửa (chuột phải(dòng 61)-> edit IL Instructions...)

và lưu file rồi chạy file mới lưu

thấy password luôn rồi nè
> flag: "P4W6RP6SES"
# x64 Lotto
Bài này lúc chạy nó bị ngáo ă
nhập vào 6 số là nó quay về bắt nhập lại nên vứt vào ida check

đây đây chính là lý do tại sao phải nhập vào 6 số
nhưng mà xuống dưới tại `loc_7FF6B6F51142` nó lại so sánh nếu edx = 6 (mà edx = 0 và += 1 sau mỗi lần nhập số) nên nó sau mỗi lần nhập nó quay lại lúc đầu ă

đặt 1 BP tại đây và debug để chương trình thoát ra khỏi vòng lặp (thay đổi ZF = 1)

xuống dưới thì thấy có gọi tới `wprintf` nè thế nên debug cho chương trình nhảy tới đó xem nó in ra cái gì nè
debug thì thấy

tại đây khi nào nó cũng nhảy xuống dưới mà không vào cái ô `wprintf` mà mình muốn vào nên cũng đặt BP ở đâu và đổi ZF (ZF đổi thành 0)
F9 tới `wprintf`

nhảy qua chương trình đang chạy

> flag là: "from_GHL2_-_!"
# Multiplicative
down về thì thấy bài là `JavaCrackMe.jar`
vì là file jar nên mở jadx:

hàm main nó chỉ đơn giản là như thế này
```
long (input) * 26729 == -1536092243306511225
```
nhưng mà vì bài này là số âm nên `+ 2^64` để nó thành số dương tương ứng và vì nó kép kiểu thành `long` nên + `+ (2^64 *i)` là số trước khi kép kiểu
có được sờ cờ ríp:
```python
a = -1536092243306511225
a = a +2**64
i = 0
while True:
s = a + (2**64) * i
if s %26729 == 0:
break
i +=1
print(s//26729 - 2**64)
# -8978084842198767761
```
> flag là: "-8978084842198767761"
# CSHARP
chạy thử file:


vì là file dot net 32 bit nên vứt vào dnSpy 32 bit

vừa mới vào thì đã thấy nơi gọi kiểm tra chuỗi nhập vào rồi nè bay vào debug thôi cái `array` nó được biến đổi qua`Invoke` nên đặt BP ở đây , F5 để debug

và cứ thế F11 (step into) hoài thì thấy

có hàm kiểm tra rồi nè
```python
A_1 = [0] *12
A_1[0] = 16 ^ 74
A_1[3] = 51 ^ 70
A_1[1] = 17 ^ 87
A_1[2] = 33 ^ 77
A_1[11] = 17 ^ 44
A_1[8] = 144 ^ 241
A_1[4] = 68 ^ 29
A_1[5] = 102 ^ 49
A_1[9] = 181 ^ 226
A_1[7] = 160 ^ 238
A_1[10] = 238 ^ 163
A_1[6] = 51 ^ 117
print(end = "".join(chr(i) for i in A_1))
#ZFluYWFNaWM=
```
check thì thấy nó chưa có đúng, nhìn có vẻ nó là base64 🤔
base64 của `"ZFluYWFNaWM="` là `"dYnaaMic"`

chạy thử thì thấy "correct!" rồi nè
> flag: "dYnaaMic"
# Direct3D FPS
bài này làm game fps
chơi game
không biết do mình không biết cánh điểu chỉnh hay sao mà mình chạy chậm rù à
mà chạy tới bắt đầu được chơi lại như thế này

ủa là sao
cay thật chớ
vứt vào ida kiểm tra thôi
Shift F12:

nếu mà thua thì chắc hiện ra "Game Over!, You are dead"
xrefs (X) "Game Clear!"

sau khi push tới địa chỉ của "Game Clear!" thì còn push địa chỉ của `byte_C27028` nữa thế nên `byte_C27028` chắc là password cần tìm rồi

địa chỉ này đã là các giá trị sẵn rồi nhưng khi xrefx thì thấy nó còn `xor byte_C29184`

`byte_C29184` chưa được khởi tạo giá trị nên đặt BP tại đây để kiểm tra gia trị của nó thôi

đạt thêm BP tại 0x00C23409 vào thay đổi cờ ZF để chương trình chạy xuống ô mình muốn

tại vì ở `0x0C2340D` có nhân tự tự với `0x210` nên lúc tìm giá trị có nhân i với 0x210 thấy output là các `i * 4`

mặc dù `byte_C27028` có 56 kí tự nhưng khi xor 6 ký tự sau không phải ascii nên bỏ
có được password rồi nè hihi
> flag: "Thr3EDPr0m"