技能競賽前稍微練下reverse
差一題爛題rev破台
其實有加入隊伍(CFW),但直到比賽結束隊友好像都沒通過我的加入申請, 這場算是單打
rk. 1715
Rev
Flag Hunters
lyric-reader.py
1 | import re |
輸入 ;RETURN 0;
Quantum Scrambler

quantum_scrambler.py
1 | import sys |
flag.txt 用 abcdefghijkl 測試
輸出整理後發現規律
1 | [ |
solve.py
1 | enc = [ ...(略)... ] |

Tap into Hash
block_chain.py
1 | import time |
沒hash沒加密,XOR而已
1 | import base64 |

perplexed
ida
1 | __int64 __fastcall check(const char *a1) |
- v3 是 v4[-1]
- v4[-1] 最後 1 byte 會被覆蓋,由於小端序實際
- 所以總共 23 bytes =>
for ( i = 0; i <= 22; ++i ) - 用
byte & 1 << (7 - j) > 0的方式提取byte的 8 個 bit =>for ( j = 0; j <= 7; ++j ) - 23 bytes 依序跟 a1 的指定 byte 指定 bit 比較,全部一樣就是 flag
solve.py1
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
30import struct
v = struct.pack('<Q',0x617B2375F81EA7E1) + b'\xB9\x9D\xFC\x5A\x5B\xDF\x69' + struct.pack('<Q',0xF467EDF4ED1BFED2)
print(v)
a1 = ["\x00"] *27
print(a1)
idx = 0
k = 0
for i in range(23): # v 23 byte
for j in range(8): # 8 bit
if k == 0:
k = 1
x = 1 << (7 - j)
# y = 1 << (7 - k)
v_bit = x & v[i] > 0
# print(v_bit)
a1[idx] = chr(ord(a1[idx]) | v_bit << (7 - k))
k += 1
if k == 8:
k = 0
idx += 1
print(''.join(a1))
Binary Instrumentation 1
bininst1.exe 直接執行
ida
1 | __int64 start() |
一堆 windows api,看不出跟cmd輸出有甚麼關聯
由於似乎輸出後就停住,推測有用 windows api Sleep(),用 frida-trace 檢測
1 | frida-trace .\bininst1.exe -i "*Sleep*" |

把參數都改成 0
frida.js
1 | var Sleep = Module.getExportByName("KERNEL32.DLL", "Sleep"); |
1 | frida .\bininst1.exe -l .\frida.js |



Binary Instrumentation 2
bininst2.exe 執行後沒有任何輸出就結束
題目敘述包含 create a file and write the flag directly to the file
1 | frida-trace .\bininst2.exe -i "*Create*" |

"*Write*" 沒找到
frida.js
1 | var func = Module.getExportByName("KERNEL32.DLL", "CreateFileA"); |
1 | frida .\bininst2.exe -l .\frida.js |


Pwn
PIE TIME

vuln.c
1 |
|
1 | └─$ r2 vuln |

1 | └─$ python3 |

hash-only-1
1 | └─$ ssh ctf-player@shape-facility.picoctf.net -p 63629 |

有 SUID
1 | ctf-player@pico-chall$ strings flaghasher |

由於md5sum會用root執行,嘗試建立假的 md5sum 並修改 $PATH
