---
# System prepended metadata

title: Reversing.Kr

---


# Easy Crack
Chạy thử file:
Nhập đại "Nhihi" vào thử:
![](https://hackmd.io/_uploads/r1xn_SwuL3.png)
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:
 ![](https://hackmd.io/_uploads/Sy0t8wuUn.png)
- Nhấn đúp vào "Congratulation !!" và "x" tại địa chỉ đó thì nó nhảy tới đây
 ![](https://hackmd.io/_uploads/rJcVDvOUn.png)

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ự
![](https://hackmd.io/_uploads/SyGfdwu82.png)

![](https://hackmd.io/_uploads/HyBmdDdU3.png)

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)
![](https://hackmd.io/_uploads/BJFN7uOU2.png)
"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
![](https://hackmd.io/_uploads/HkR3R_KU3.png)
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è 
![](https://hackmd.io/_uploads/Bk_MyKKUh.png)

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:
![](https://hackmd.io/_uploads/SkeqyKFU2.png)
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
![](https://hackmd.io/_uploads/BJXf3TJKn.png)
mở IDA (tick vào Manual load và tắt create import segment nha)
![](https://hackmd.io/_uploads/HkqM0TJY2.png)

>flag: 00401150

# Easy ELF
chạy file:
![](https://hackmd.io/_uploads/B1UxTyui3.png)
mở ida:
![](https://hackmd.io/_uploads/HyEOJxus2.png)
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
![](https://hackmd.io/_uploads/SyLMlxuoh.png)

có 6 trường hợp để so sánh lận thế nên F5 cho dễ đọc
![](https://hackmd.io/_uploads/SykaxeOs2.png)

```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`

![](https://hackmd.io/_uploads/BJmaQlOsh.png)
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:

![](https://hackmd.io/_uploads/Hk1VG2woh.png)
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 
![](https://hackmd.io/_uploads/H11SQnDs3.png)
ảnh có kích thước (0xc8,0x96)
![](https://hackmd.io/_uploads/SkiNr3vs2.png)

ở đâ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)

![](https://hackmd.io/_uploads/S1gSLhDi3.png)
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()
```

![](https://hackmd.io/_uploads/SyHk_hvoh.png)

flag đây rồi hihi
> flag: "GOT"

# Replace
chạy file thì thấy thế này nè:
![](https://hackmd.io/_uploads/Sy_XOx_i2.png)
đi tìm số đầu vào thôi (nó cho nhập vào số thuii)

shift F12 thấy có "Correct!" nè
![](https://hackmd.io/_uploads/BJBs_xdon.png)
nhảy tới nơi gọi nó thui
![](https://hackmd.io/_uploads/B1PX5gdi3.png)
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 
![](https://hackmd.io/_uploads/H1ch9l_jn.png)

`0410` thì lỗi này 
![](https://hackmd.io/_uploads/B1qlixOs3.png)

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
![](https://hackmd.io/_uploads/rkK-0edj2.png)

![](https://hackmd.io/_uploads/By5Y0gdoh.png)
> flag là: 2687109798

# CSHOP
Chạy thì thấy chả có gì
![](https://hackmd.io/_uploads/BJAlI9uin.png)
![](https://hackmd.io/_uploads/B1OKIqOjh.png)
kiểm tra thì thấy là là dot net  nên vứt vào dnSpy 
![](https://hackmd.io/_uploads/SJamv5do3.png)
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è 
![](https://hackmd.io/_uploads/S1d3vqusn.png)
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...)
![](https://hackmd.io/_uploads/rybzY5Ojh.png)

và lưu file rồi chạy file mới lưu
![](https://hackmd.io/_uploads/ryAzqqOsh.png)
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
![](https://hackmd.io/_uploads/rkBza5djh.png)
đâ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 ă
![](https://hackmd.io/_uploads/BkmBT9uo2.png)
đặ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)
![](https://hackmd.io/_uploads/S1xz09uin.png)
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
![](https://hackmd.io/_uploads/BJFY0q_i2.png)
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`
![](https://hackmd.io/_uploads/SynYlodj2.png)
nhảy qua chương trình đang chạy
![](https://hackmd.io/_uploads/SJD3xjdj2.png)
> flag là:  "from_GHL2_-_!"

# Multiplicative
down về thì thấy bài là `JavaCrackMe.jar`
vì là file jar nên mở jadx:
![](https://hackmd.io/_uploads/rynezouo3.png)
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:
![](https://hackmd.io/_uploads/HyKp_0tj3.png)
![](https://hackmd.io/_uploads/rJ4StRts3.png)
vì là file dot net 32 bit nên vứt vào dnSpy 32 bit
![](https://hackmd.io/_uploads/Sk2M50Yjh.png)
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 
![](https://hackmd.io/_uploads/B1fRcCFsn.png)
 và cứ thế F11 (step into) hoài thì thấy
![](https://hackmd.io/_uploads/BkccsCts2.png)

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"`

![](https://hackmd.io/_uploads/BJwM6Ati2.png)
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 
![](https://hackmd.io/_uploads/SkIHyCFj3.png)
ủa là sao 
cay thật chớ 
vứt vào ida kiểm tra thôi

Shift F12:
![](https://hackmd.io/_uploads/S1JExRYsn.png)
nếu mà thua thì chắc hiện ra "Game Over!, You are dead"
xrefs (X) "Game Clear!"

![](https://hackmd.io/_uploads/SJIPbRtoh.png)

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
![](https://hackmd.io/_uploads/ryBGz0Fj3.png)
đị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`
![](https://hackmd.io/_uploads/Sy18fCYjn.png)

`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
![](https://hackmd.io/_uploads/B179zAtj2.png)

đạ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 

![](https://hackmd.io/_uploads/S1WBICFj3.png)

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`
![](https://hackmd.io/_uploads/SyGivRYih.png)
 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"