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 callable

Picker 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โžค start
Stopped 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 โ† $esp
0xffffd054โ”‚+0x0004: 0xffffd228 โ†’ "/media/sf_SHARED_FILE/pico_reverse/brute2"
0xffffd058โ”‚+0x0008: 0x00000000
0xffffd05cโ”‚+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

image.png|550 ๅพžghidra้€š้ˆไพ†็š„9a2้‚ฃ้‚Šๅ†ๆฏ”่ผƒflag_len้•ทๅบฆ

gefโžค x/wx $ebp + 0xc
0xffffcf54: 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))=17
str(0x11)=17

Shop

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ๅๆŽจๅ›žๅŽป