PicoCTF Reverse Writeup
Transformation
cat encโ>็ฉๆฏไไปใถๅฝขๆฅด็ๆฅฎ็ดใดๆๆฝฆๅผธๅผทใคใธใคธๆฝ
decodeโ>print(text.encode(โutf-16-beโ))
โ> picoCTF{16_bits_inst34d_of_8_75d4898b}
vault-door-training
cat
Picker I
cat ๅพ็ฅๅผๅซwinๅฐฑๆๆflag็ถ้่ฝๆ
for c in flag: str_flag += str(hex(ord(c))) + ' 'ๆไปฅreverse it
str_flag = [0x70,0x69,0x63,0x6f,0x43,0x54,0x46,0x7b,0x34,0x5f,0x64,0x31,0x34,0x6d,0x30,0x6e,0x64,0x5f,0x31,0x6e,0x5f,0x37,0x68,0x33,0x5f,0x72,0x30,0x75,0x67,0x68,0x5f,0x36,0x65,0x30,0x34,0x34,0x34,0x30,0x64,0x7d]for i in str_flag: print(chr(i), end = '')Picker II
cat ็ๅฐ่ผธๅ
ฅwinๆๆฏfalse
ๅฆๅคๅ ็บๆ่ชๅๅนซๅฟๅ ๆฌ่()
โโโ(kaliใฟkali)-[/media/sf_SHARED_FILE/pico_reverse]โโ$ nc saturn.picoctf.net 59984==> print(open('flag.txt','r').read().strip())picoCTF{f1l73r5_f41l_c0d3_r3f4c70r_m1gh7_5ucc33d_0b5f1131}'NoneType' object is not callablePicker III*
่ผธๅ ฅ้ธ้ 1-ๅ่กจ 2-่ฎๅฝๆธ 3-ๅฏซๅ ฅๅฝๆธ 4-้จๆฉๆธๅญ ๅ ็บไป็CODE:
def getRandomNumber(): print(4) # Chosen by fair die roll. # Guaranteed to be random. # (See XKCD)ๆผๆฏๅพ3่ฃก้ขๆgetRandomNumberๅฝๆธ็ๅผ่ฎๆwin ้ๆจฃๅท่ก4ๅฐฑๆๆฏflag
0x70 0x69 0x63 0x6f 0x43 0x54 0x46 0x7b 0x37 0x68 0x31 0x35 0x5f 0x31 0x35 0x5f 0x77 0x68 0x34 0x37 0x5f 0x77 0x33 0x5f 0x67 0x33 0x37 0x5f 0x77 0x31 0x37 0x68 0x5f 0x75 0x35 0x33 0x72 0x35 0x5f 0x31 0x6e 0x5f 0x63 0x68 0x34 0x72 0x67 0x33 0x5f 0x61 0x31 0x38 0x36 0x66 0x39 0x61 0x63 0x7d
>>picoCTF{7h15_15_wh47_w3_g37_w17h_u53r5_1n_ch4rg3_a186f9ac}packer
ๅ
ไธIDA็ๅฐๅฎๆฏไธๅUDXๆๅ
ๆช
udx -d <file> ่งฃๅฃ็ธฎ
ๅจไธ้ฒๅป main่ฃก้ข็ๅฐๆชขๆฅๅญไธฒ7069636f4354467b5539585f556e5034636b314e365f42316e34526933535f31613561336633397d
ๅทฆ่ฝcyberchefๅพๅฐflag
OTP
็main่ฃก้ขๆๆฏ่ผ่ผธๅ
ฅๅผ่็ๅพ่ฆๆฏmngjlepdcbcmjmmjipmmegfkjbicaemoemkkpjgnhgomlknmoepmfbcoffikhplmadmganmlojndm fahbhaancamdhfdkiancdjf
ไนๅพๅป่ทflag้ฒ่กXOR
flag: 18a07fbdbcd1af759895328ec4d82d2b411dc7876c34a0ab61eda8f2efa5bb0f198a3aa0ac47ff9a0cf3d913d3138678ce4b
ๅพcode้ๆจ
<ๆชๅฎๅพ ็บ>
Easy as GDB
้ฃๆญปไบMD
ๅจGDB่ฃก้ข ๅ ็บmain/start้ไบfunciton้ฝๆฒๆ่ขซ่ญๅฅ ๆไปฅๅ
gefโค startStopped due to shared library event (no libraries added or removed)[Thread debugging using libthread_db enabled]Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".[*] PIC binary detected, retrieving text base address[+] Breaking at entry-point: 0x56555580[ Legend: Modified register | Code | Heap | Stack | String ]โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ registers โโโโ$eax : 0xf7ffda20 โ 0x56555000 โ jg 0x56555047$ebx : 0xf7ffcfec โ 0x00033f2c$ecx : 0xf7ffdd28 โ 0x00000000$edx : 0xf7fcce40 โ call 0xf7fecba9$esp : 0xffffd050 โ 0x00000001$ebp : 0x0$esi : 0xffffd05c โ 0xffffd252 โ "SHELL=/bin/bash"$edi : 0x56555580 โ xor ebp, ebp$eip : 0x56555580 โ xor ebp, ebp$eflags: [zero carry parity adjust SIGN trap INTERRUPT direction overflow resume virtualx86 identification]$cs: 0x23 $ss: 0x2b $ds: 0x2b $es: 0x2b $fs: 0x00 $gs: 0x63โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ stack โโโโ0xffffd050โ+0x0000: 0x00000001 โ $esp0xffffd054โ+0x0004: 0xffffd228 โ "/media/sf_SHARED_FILE/pico_reverse/brute2"0xffffd058โ+0x0008: 0x000000000xffffd05cโ+0x000c: 0xffffd252 โ "SHELL=/bin/bash"0xffffd060โ+0x0010: 0xffffd262 โ "SESSION_MANAGER=local/kali:@/tmp/.ICE-unix/787,uni[...]"0xffffd064โ+0x0014: 0xffffd2ae โ "WINDOWID=0"0xffffd068โ+0x0018: 0xffffd2b9 โ "QT_ACCESSIBILITY=1"0xffffd06cโ+0x001c: 0xffffd2cc โ "COLORTERM=truecolor"โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ code:x86:32 โโโโ 0x56555576 <__cxa_finalize@plt+0006> xchg ax, ax 0x56555578 <__gmon_start__@plt+0000> jmp DWORD PTR [ebx+0x38] 0x5655557e <__gmon_start__@plt+0006> xchg ax, axโโ 0x56555580 xor ebp, ebp 0x56555582 pop esi 0x56555583 mov ecx, esp 0x56555585 and esp, 0xfffffff0 0x56555588 push eax 0x56555589 push espโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ threads โโโโ[#0] Id 1, Name: "brute2", stopped 0x56555580 in ?? (), reason: BREAKPOINTโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ trace โโโโ[#0] 0x56555580 โ xor ebp, ebpๅพไธ้ข็ฅ้ๅ ฅๅฃ=0x56555580 ็ถๅพ้ๅงๆพๆฏ่ผ็ๅฐๆนๅจๅช่ฃก ็จx/100i 0x56555580 ้ๅง็ x/100i 0x56555680 x/100i 0x56555780โฆ x/100i 0x56555980
0x56555989: add eax,ecx 0x5655598b: movzx eax,BYTE PTR [eax]bp 0x5655598e: cmp dl,al 0x56555990: je 0x5655599b 0x56555992: mov DWORD PTR [ebp-0x18],0xffffffff 0x56555999: jmp 0x565559a7 0x5655599b: add DWORD PTR [ebp-0x14],0x1 0x5655599f: mov eax,DWORD PTR [ebp-0x14]-->0x565559a2: cmp eax,DWORD PTR [ebp+0xc] 0x565559a5: jb 0x56555978 0x565559a7: mov eax,DWORD PTR [ebp-0x18] 0x565559aa: mov ebx,DWORD PTR [ebp-0x4] 0x565559ad: leave
ๅพghidra้้ไพ็9a2้ฃ้ๅๆฏ่ผflag_len้ทๅบฆ
gefโค x/wx $ebp + 0xc0xffffcf54: 0x0000001e
0x000001e = 30ๆไปฅๅฏ็ฅflag้ทๅบฆๆฏ30
ๆ ผๅผๅฐฑๆๆฏ picoCTF{AAAAAAAAAAAAAAAAAAAAA}
็ถๅพ็ตๆผๅฏไปฅ้ๅง็็ ด
ๅ ็บๅฎๆๆฏๅๅญๅ
้ไธๆฏ่ผ ๆไปฅๅจ 0x5655598e: cmp dl,al
่จญๅฎbreakpoint้ฒ่ก็็ ด ๅช่ฆๆชขๆฅๅฐๆฏtrueๅฐฑๆ้ฒ่กไธไธๅ็ๆธฌ่ฉฆ
ๅญๅ
ๆA-z+0-9+"_" ๆไปฅๆฏ55
ๆไปฅๆๅคๆธฌ่ฉฆ55x21=165ๆฌกไธๅฎๅฏไปฅๆพๅฐ
import gdbไธไบๅฐ่ฝๆๅจ Bit-O-Asm ็ณปๅ
print(int(hex_value, 11))=17str(0x11)=17Shop
nc้ฃ็ท้ๅป
็ฌฌไธๅ้ธ้
ๆฒๆ้็ๆชขๆฅๆไปฅๅฏไปฅ็จ-88ไน้ก็ๆธๅญ้ฒ่ก่ณผ่ฒท็ถๅพcoinๅฐฑๆๅขๅ ๏ผๅฏไปฅ้ฒไธๆญฅ่ฒทๅฐFLAG๏ผ้้ก็ฎๆ่ฆบๆ่ชๅๅ่งฃๆณ ๅฏไปฅๅ็ ็ฉถไธไธ
Flag is: [112 105 99 111 67 84 70 123 98 52 100 95 98 114 111 103 114 97 109 109 101 114 95 98 56 100 55 50 55 49 102 125]
num = [112, 105, 99, 111, 67, 84, 70, 123, 98, 52, 100, 95, 98, 114, 111, 103, 114, 97, 109, 109, 101, 114, 95, 98, 56, 100, 55, 50, 55, 49, 102, 125]
print("".join(chr(n) for n in num))from decimal: picoCTF{b4d_brogrammer_b8d7271f}
Virtural Machine
ๆ2ๅๅ
งๅฎนไธๆจฃ็xmlใdae่ทไธๅflagๆ ผๅผ
39722847074734820757600524178581224432297292490103995908738058203639164185
red-input, blue-output
ๅฅนๅชฝ็ๆฏไธๅๆจกๅๆชๆก ็ด ่ฒ40้ฝ ่่ฒๆฏ8
Vaultdoor3
cat -> jU5t_a_sna_3lpm18gb41_u_4_mfr340
for (i=0; i<8; i++) { buffer[i] = password.charAt(i);}### ๅ้ข7ๅๅญไธๆจฃ:jU5t_a_for (; i<16; i++) { buffer[i] = password.charAt(23-i);}## iๅพ15ๅฐ8ใ## ๅๆ็ฑๅ
ฅsna_3lpm >> ็ธๅ
for (; i<32; i+=2) { buffer[i] = password.charAt(46-i);}## 16้ๅงๆฏๆฌก+2## ๅกซๅ
ฅ password ็ (46-i) ็ๅญfor (i=31; i>=17; i-=2) { buffer[i] = password.charAt(i);}## ๅพ31้ๅง๏ผๆฏๆฌกๆธ2๏ผ็ดๆฅ่ค่ฃฝ password[i]ใString s = new String(buffer);return s.equals("jU5t_a_sna_3lpm18gb41_u_4_mfr340");## ๆๅพๆฏๅฐ็ตๆๆฏไธๆฏ่ท้ๅไธๆจฃๅช่ฝ่ชชchatgpt่ฝๅ้ฒๅไบ
target = "jU5t_a_sna_3lpm18gb41_u_4_mfr340"password = [''] * 32
# ็ฌฌไธๆฎต๏ผ็ดๆฅ copy ็ฌฌ 0~7 ไฝfor i in range(8): password[i] = target[i]
# ็ฌฌไบๆฎต๏ผ8~15ไฝ๏ผ้่ไพfor i in range(8, 16): password[23 - i] = target[i]
# ็ฌฌไธๆฎต๏ผ16~30๏ผๅถๆธไฝ็ฝฎfor i in range(16, 32, 2): password[46 - i] = target[i]
# ็ฌฌๅๆฎต๏ผ17~31๏ผๅฅๆธไฝ็ฝฎfor i in range(31, 16, -2): password[i] = target[i]
# ๆๅฏ็ขผ็ตๅไพfinal_password = ''.join(password)print("picoCTF{" + final_password + "}")
>>picoCTF{jU5t_a_s1mpl3_an4gr4m_4_u_1fb380}Vaultdoor5
base64 decode -> url decode
โ> c0nv3rt1ng_fr0m_ba5e_64_e3152bf4
6 ็็ๅพๅ
ญ
ๆๅค ็ฝ็ก
Vaultdoor6
XORๅๆจๅๅป