[๐Ÿฅ‰ Bronze 4] ์‹ฌ๋ณผ ์—†๋Š” STM32F4 ํŽŒ์›จ์–ด์—์„œ ์ง„์งœ ํ‚ค ์ฐพ๊ธฐ โ€” DreamHack Please Discover my Discovery key ํ’€์ด

2026-07-17ยท1๋ถ„ ์ฝ๊ธฐยท

[๐Ÿฅ‰ Bronze 4] ์‹ฌ๋ณผ ์—†๋Š” STM32F4 ํŽŒ์›จ์–ด์—์„œ ์ง„์งœ ํ‚ค ์ฐพ๊ธฐ โ€” DreamHack Please Discover my Discovery key ํ’€์ด

769๋ฐ”์ดํŠธ์งœ๋ฆฌ stripped Cortex-M ํŽŒ์›จ์–ด ํ•˜๋‚˜๊ฐ€ ์ „๋ถ€๋‹ค. strings ๋ฅผ ๊ฑธ๋ฉด "์ง„์งœ ํ‚ค"๋ฅผ ๋ฌป๋Š” ๋ฏธ๋ผ ๋ฌธ์ž์—ด๋“ค์ด ์šฐ์ˆ˜์ˆ˜ ๋‚˜์˜ค๋Š”๋ฐ, ์ •์ž‘ ๋ณด๋“œ๊ฐ€ UART ๋กœ ๋ฑ‰๋Š” ๊ฐ’์€ ํŒ๋… ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฐ”์ดํŠธ๋‹ค. Thumb ์ฝ”๋“œ๋ฅผ ๋””์Šค์–ด์…ˆ๋ธ”ํ•˜๊ณ  Unicorn ์œผ๋กœ ๋Œ๋ ค๋ณด๋ฉด ๊ทธ ๋ฐ”์ดํŠธ๊ฐ€ ๋‘ base64 ๋ฌธ์ž์—ด์˜ XOR ์ž„์ด ๋“œ๋Ÿฌ๋‚˜๊ณ , ๋˜๋Œ๋ฆฌ๋ฉด ์ˆจ์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” Please Discover my Discovery key ๋ถ„๋ฅ˜: Misc (ํŽŒ์›จ์–ด ๋ฆฌ๋ฒ„์‹ฑ) ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 4 ์›๋ณธ: ACSC CTF ์ถœ์ œ์ž‘ (plzdiscoverdiscovery) FLAG: acsc{welcometostm32!!!}

์ฃผ์–ด์ง€๋Š” ๊ฑด stm32f4-discovery.bin ๋”ฑ ํ•˜๋‚˜, ๊ทธ๊ฒƒ๋„ 769๋ฐ”์ดํŠธ๋‹ค. ์„œ๋ฒ„๋„ ์—†๋‹ค. ๋ฌธ์ œ ์„ค๋ช…์€ ํ•œ ์ค„, "Get key from stripped cortex M board" โ€” ์‹ฌ๋ณผ์ด ๋‹ค ๋ฒ—๊ฒจ์ง„(stripped) Cortex-M ๋ณด๋“œ์—์„œ ํ‚ค๋ฅผ ๋ฝ‘์•„๋‚ด๋ผ๋Š” ๋œป์ด๋‹ค.

๊ฐ€์žฅ ๋จผ์ € ์†์ด ๊ฐ€๋Š” ๊ฑด strings ์ธ๋ฐ, ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ํ•จ์ •์ด ์‹œ์ž‘๋œ๋‹ค. doyouwantrealkey("do you want real key"), ppQAwdKeyskeys@=, poppoppoppoppop, 0x001001 ๊ฐ™์€ ๊ทธ๋Ÿด๋“ฏํ•œ "ํ‚ค ํ›„๋ณด"๋“ค์ด ๋Œ€๋†“๊ณ  ๋ฐ•ํ˜€ ์žˆ๋‹ค. ์ด๊ฑธ ํ•˜๋‚˜์”ฉ ๋„ฃ์–ด๋ณด๋‹ค ์‹œ๊ฐ„์„ ๋‹ค ๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์ง„์งœ ํ‚ค๋Š” ์ด ๋ฌธ์ž์—ด๋“ค ์•ˆ์— ์—†๋‹ค. ๋ณด๋“œ๊ฐ€ ๋ถ€ํŒ…ํ•ด์„œ UART ๋กœ ์‹ค์ œ๋กœ ๊ณ„์‚ฐํ•ด ๋‚ด๋ณด๋‚ด๋Š” ๊ฐ’์— ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ๋ฌธ์ œ๋Š” "strings ๋กœ ๋"์ด ์•„๋‹ˆ๋ผ, Thumb ์ฝ”๋“œ๋ฅผ ์ฝ์–ด ๋ฌด์Šจ ๊ณ„์‚ฐ์„ ํ•˜๋Š”์ง€ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•˜๋Š” ๋ฆฌ๋ฒ„์‹ฑ ๋ฌธ์ œ๋‹ค.

์ด ๊ธ€์˜ ๋ช…๋ น์€ ๋ชจ๋‘ ๋ฌธ์ œ ํด๋” ์ตœ์ƒ์œ„(extracted/ ์˜ ๋ถ€๋ชจ) ์—์„œ ์‹คํ–‰ํ•œ๋‹ค.

file extracted/stm32f4-discovery.bin; strings -n 4 extracted/stm32f4-discovery.bin

file ๋ช…๋ น๊ณผ strings ๋กœ stripped ํŽŒ์›จ์–ด์˜ base64 ๋ฌธ์ž์—ด๊ณผ ๋””์ฝ”์ด ๋ฌธ์ž์—ด์„ ํ™•์ธ
file ๋ช…๋ น๊ณผ strings ๋กœ stripped ํŽŒ์›จ์–ด์˜ base64 ๋ฌธ์ž์—ด๊ณผ ๋””์ฝ”์ด ๋ฌธ์ž์—ด์„ ํ™•์ธ


๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…Please Discover my Discovery key
๋‚œ์ด๋„๐Ÿฅ‰ Bronze 4
๋ถ„๋ฅ˜Misc / ํŽŒ์›จ์–ด ๋ฆฌ๋ฒ„์‹ฑ
์ œ๊ณต ํŒŒ์ผstm32f4-discovery.bin (769 bytes)
ํ•ต์‹ฌ ๊ธฐ๋ฒ•stripped Thumb ๋””์Šค์–ด์…ˆ๋ธ” + ๋ฐ˜๋ณตํ‚ค XOR ๋ณตํ˜ธ + base64

ํŒŒ์ผ๋งŒ ์ฃผ์–ด์ง€๋Š” ์˜คํ”„๋ผ์ธ ๋ฌธ์ œ๋ผ VM ์ด ํ•„์š” ์—†๋‹ค. file ์€ ๊ทธ๋ƒฅ data ๋ผ๊ณ ๋งŒ ๋งํ•ด์ค€๋‹ค โ€” ELF ๋„ ์•„๋‹ˆ๊ณ  ํ—ค๋”๋„ ์—†๋Š” ์ˆœ์ˆ˜ ํŽŒ์›จ์–ด ๋ฐ”์ด๋„ˆ๋ฆฌ(raw binary) ๋‹ค. ์ด๋Ÿด ๋• ์•„ํ‚คํ…์ฒ˜์™€ ๋กœ๋“œ ์ฃผ์†Œ๋ฅผ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์•Œ๋ ค์ค˜์•ผ ๋””์Šค์–ด์…ˆ๋ธ”์ด ๋œ๋‹ค.

ํ’€์ด ํ๋ฆ„์€ ์ด๋ ‡๋‹ค. strings ๋กœ ๋ฏธ๋ผ์™€ ์ง„์งœ ์žฌ๋ฃŒ(base64 ๋‘ ๊ฐœ)๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  โ†’ ๋ฒกํ„ฐ ํ…Œ์ด๋ธ”์—์„œ ๋กœ๋“œ ์ฃผ์†Œยท์ง„์ž…์ ์„ ์ฝ์–ด Thumb ์œผ๋กœ ๋””์Šค์–ด์…ˆ๋ธ”ํ•˜๊ณ  โ†’ main ์ด ๋‘ base64 ๋ฌธ์ž์—ด์„ XOR ํ•ด์„œ UART ๋กœ ๋‚ด๋ณด๋‚ธ๋‹ค๋Š” ๊ฑธ ํ™•์ธํ•˜๊ณ  โ†’ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๊ทธ ์ถœ๋ ฅ์„ ์‹ค์ธกํ•œ ๋’ค โ†’ XOR ์„ ๋˜๋Œ๋ ค ์ˆจ์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณต์›ํ•œ๋‹ค.



๐Ÿงฉ ๋ฐฐ๊ฒฝ โ€” raw ํŽŒ์›จ์–ด๋ฅผ ์ฃผ์†Œ๊ณต๊ฐ„์— ์–น๊ธฐ

์ผ๋ฐ˜์ ์ธ ๋ฆฌ๋ฒ„์‹ฑ์€ ELF ๋ฅผ ์ฃผ๋ฉด objdump ๊ฐ€ ์•Œ์•„์„œ ์‹ฌ๋ณผยท์„น์…˜ยท์ง„์ž…์ ์„ ์ฝ์–ด์ค€๋‹ค. ํ•˜์ง€๋งŒ ์ด ํŒŒ์ผ์€ ์„น์…˜ ํ—ค๋”๊ฐ€ ์—†๋Š” raw ์ด๋ฏธ์ง€๋‹ค. Cortex-M ์€ ์ „์›์ด ๋“ค์–ด์˜ค๋ฉด ์ฃผ์†Œ 0 ์—์„œ ๋‘ ๊ฐœ์˜ 32๋น„ํŠธ ์›Œ๋“œ๋ฅผ ์ฝ๋Š”๋‹ค.

  • [0x00] ์ดˆ๊ธฐ ์Šคํƒ ํฌ์ธํ„ฐ(MSP)
  • [0x04] ๋ฆฌ์…‹ ํ•ธ๋“ค๋Ÿฌ ์ฃผ์†Œ (์ตœํ•˜์œ„ ๋น„ํŠธ 1 = Thumb ๋ชจ๋“œ)

ํŒŒ์ผ ๋งจ ์•ž 8๋ฐ”์ดํŠธ๊ฐ€ ์ •ํ™•ํžˆ ์ด ๋ฒกํ„ฐ ํ…Œ์ด๋ธ”์ด๋‹ค.

00000000: 0000 0220  5102 0008   ...
          โ”” SP=0x20020000  โ”” Reset=0x08000251

SP = 0x20020000 ์€ STM32F4 ์˜ SRAM(0x20000000) ์˜์—ญ ๋์ด๊ณ , ๋ฆฌ์…‹ ๋ฒกํ„ฐ 0x08000251 ์€ flash ์˜์—ญ(0x08000000)์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ฆ‰ ์ด ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” 0x08000000 ์— ์–นํžˆ๋Š” flash ์ด๋ฏธ์ง€์ด๊ณ , ์ฝ”๋“œ๋Š” Thumb ์ด๋ฉฐ ์ง„์ž…์ ์€ 0x08000250(์ง์ˆ˜ ์ •๋ ฌ, LSB ๋Š” Thumb ํ‘œ์‹œ๋ผ ๋–ผ๊ณ  ๋ด„)์ด๋‹ค. ์ด ๋‘ ์ˆซ์ž๋งŒ ์žˆ์œผ๋ฉด ๋‚˜๋จธ์ง€๋Š” ์ „๋ถ€ ๋””์Šค์–ด์…ˆ๋ธ”๋กœ ํ’€๋ฆฐ๋‹ค.

STM32F4 ์ฃผ์†Œ๊ณต๊ฐ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” flash 0x08000000 ์˜ ๋ฒกํ„ฐํ…Œ์ด๋ธ”๊ณผ ์ฝ”๋“œ์™€ ๋ฌธ์ž์—ดํ’€, SRAM, USART1, RCC ๋ฐฐ์น˜
STM32F4 ์ฃผ์†Œ๊ณต๊ฐ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” flash 0x08000000 ์˜ ๋ฒกํ„ฐํ…Œ์ด๋ธ”๊ณผ ์ฝ”๋“œ์™€ ๋ฌธ์ž์—ดํ’€, SRAM, USART1, RCC ๋ฐฐ์น˜

objdump ๋Š” ์ด ๋จธ์‹ ์„ ๋ชป ๋ฌผ์–ด์„œ(can't use supplied machine arm) capstone ์œผ๋กœ ์ง์ ‘ Thumb ๋””์Šค์–ด์…ˆ๋ธ”ํ–ˆ๋‹ค. 769๋ฐ”์ดํŠธ ์•ˆ์—๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ช‡ ๊ฐœ ์—†๋‹ค.

  • 0x08 UART ํ•œ ๊ธ€์ž ์ถœ๋ ฅ (์ƒํƒœ ๋ ˆ์ง€์Šคํ„ฐ์˜ TXE ๋น„ํŠธ๋ฅผ ํด๋ง ํ›„ ๋ฐ์ดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ์— write)
  • 0x4c USART1ยทGPIOยทRCC ์ดˆ๊ธฐํ™”
  • 0xc8 busy-loop ๋”œ๋ ˆ์ด
  • 0xf6 ๋ฐ˜๋ณตํ‚ค XOR (ํ•ต์‹ฌ)
  • 0x17e / 0x19c getKey โ€” ๊ฐ๊ฐ 3, 4 ๋งŒ ๋ฐ˜ํ™˜ (๋ฏธ๋ผ)
  • 0x1b8 main

๐Ÿ” ์ •์ฐฐ โ€” ๋ฏธ๋ผ์™€ ์ง„์งœ ์žฌ๋ฃŒ ๊ตฌ๋ถ„ํ•˜๊ธฐ

strings ๊ฒฐ๊ณผ์—์„œ base64 ๋กœ ๋ณด์ด๋Š” ๋‘ ๊ฐœ๊ฐ€ ๋ˆˆ์— ๋ˆ๋‹ค.

c3RtMzJmNC1kaXNjb3Zlcnk=   โ†’ base64 ๋””์ฝ”๋“œ โ†’ "stm32f4-discovery"
d2VsY29tZXRvc3RtMzIhISE=   โ†’ base64 ๋””์ฝ”๋“œ โ†’ "welcometostm32!!!"

๋‚˜๋จธ์ง€ doyouwantrealkey, ppQAwdKeyskeys@=, poppoppoppoppop, 0x001001 ์€ ํ‰๋ฌธ ๊ทธ๋Œ€๋กœ flash ์— ๋ฐ•ํ˜€ ์žˆ๋‹ค. ์‚ฌ๋žŒ ๋ˆˆ์—” ์˜คํžˆ๋ ค ์ด ํ‰๋ฌธ๋“ค์ด "ํ‚ค"์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์ด๊ฑธ ์“ฐ๋Š”์ง€ ์•„๋‹Œ์ง€๋Š” ๋””์Šค์–ด์…ˆ๋ธ”๋กœ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

capstone ์œผ๋กœ ๊ฐ ํ•จ์ˆ˜์˜ PC-์ƒ๋Œ€ ๋ฆฌํ„ฐ๋Ÿด ๋กœ๋“œ๋ฅผ ์ „๋ถ€ ํ•ด์„ํ•ด ๋ดค๋‹ค. ์–ด๋–ค ๋ฌธ์ž์—ด์„ ๋ˆ„๊ฐ€ ์ฐธ์กฐํ•˜๋Š”์ง€๊ฐ€ ์—ฌ๊ธฐ์„œ ๊ฐˆ๋ฆฐ๋‹ค.

capstone ์œผ๋กœ ๋ฆฌํ„ฐ๋Ÿด ํ’€ ํ•ด์„ โ€” main ๊ณผ getKey ํ•จ์ˆ˜๊ฐ€ ๋กœ๋“œํ•˜๋Š” ๋ฌธ์ž์—ด ํฌ์ธํ„ฐ, ์‹ค์‚ฌ์šฉ base64 ๋‘ ๊ฐœ์™€ ๋””์ฝ”์ด ๋„ค ๊ฐœ
capstone ์œผ๋กœ ๋ฆฌํ„ฐ๋Ÿด ํ’€ ํ•ด์„ โ€” main ๊ณผ getKey ํ•จ์ˆ˜๊ฐ€ ๋กœ๋“œํ•˜๋Š” ๋ฌธ์ž์—ด ํฌ์ธํ„ฐ, ์‹ค์‚ฌ์šฉ base64 ๋‘ ๊ฐœ์™€ ๋””์ฝ”์ด ๋„ค ๊ฐœ

  • 0x1be (main) โ†’ d2VsY29tโ€ฆ(welcome base64)
  • 0x1d2 (main) โ†’ c3RtMzJmโ€ฆ(discovery base64)
  • 0x184 (getKey A) โ†’ poppoppoppoppop
  • 0x1a2 (getKey B) โ†’ ppQAwdKeyskeys@=
  • 0x1d6 (main) โ†’ doyouwantrealkey
  • 0x1da (main) โ†’ 0x001001

getKey ๋‘ ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด ํฌ์ธํ„ฐ๋ฅผ ์ง€์—ญ๋ณ€์ˆ˜์— ๋‹ด์•„๋‘๊ณ ๋Š” ์ •์ž‘ ์ •์ˆ˜ 3ยท4 ๋งŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค. main ์—์„œ๋„ doyouwantrealkey ์™€ 0x001001 ์€ ๋กœ๋“œ๋งŒ ๋˜๊ณ  ์ดํ›„ ํ•œ ๋ฒˆ๋„ ์ฝํžˆ์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ ๋„ค ๊ฐœ ๋‹ค ์ฃฝ์€ ์ฝ”๋“œ(dead code) ๋ฏธ๋ผ๋‹ค. ์‹ค์ œ ๊ณ„์‚ฐ์— ๋“ค์–ด๊ฐ€๋Š” ์žฌ๋ฃŒ๋Š” base64 ๋‘ ๊ฐœ๋ฟ์ด๋‹ค.


โ–ถ ์‚ฝ์งˆ: ํ‰๋ฌธ ํ‚ค๋ฅผ ๋„ฃ์–ด๋ณด๊ณ , ์ œ์ถœ ํ˜•์‹ ๋Œ€์†Œ๋ฌธ์ž์— ๋ฐœ๋ชฉ ์žกํžˆ๋‹ค

์ฒ˜์Œ์—” ์ฝ”๋“œ๋ฅผ ์•ˆ ์ฝ๊ณ  strings ๊ฒฐ๊ณผ๋งŒ์œผ๋กœ ์Šน๋ถ€ํ•˜๋ ค ํ–ˆ๋‹ค. base64 ๋‘ ๊ฐœ๋ฅผ ๋””์ฝ”๋“œํ•ด ๋‚˜์˜จ welcometostm32!!!, stm32f4-discovery ๋ฅผ ๊ทธ๋Œ€๋กœ flag ์— ๋„ฃ๊ณ , ๋ฏธ๋ผ doyouwantrealkeyยทppQAwdKeyskeys@= ๋„ ๋„ฃ์–ด๋ดค๋‹ค. ์ „๋ถ€ ์˜ค๋‹ต.

๋ณด๋“œ๊ฐ€ ์ถœ๋ ฅํ•˜๋Š” CT ๋ฅผ ๋ฏธ๋ผ ํ‚ค๋“ค๋กœ XOR ํ•ด๋ณด๊ธฐ๋„ ํ–ˆ๋‹ค. CT ๋ฅผ stm32f4-discovery ์˜ base64 ๋กœ XOR ํ•˜๋ฉด welcometostm32!!! ์˜ base64 ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฑด ๋‹น์—ฐํ•˜์ง€๋งŒ(๊ทธ๊ฒŒ XOR ์˜ ์ •์˜๋‹ˆ๊นŒ), doyouwantrealkeyยทpoppoppoppoppop ๊ฐ™์€ ๊ฑธ๋กœ XOR ํ•˜๋ฉด ์ „๋ถ€ garbage ์˜€๋‹ค.

๊ฐ€์žฅ ์˜ค๋ž˜ ์žก์•„๋จน์€ ๊ฑด ์—‰๋šฑํ•˜๊ฒŒ๋„ ์ œ์ถœ ํ˜•์‹์ด์—ˆ๋‹ค. ์›๋ณธ์ด ACSC CTF ๋ผ ๋‹น์—ฐํžˆ ๋Œ€๋ฌธ์ž ACSC{...} ๊ฒ ๊ฑฐ๋‹ˆ ํ•˜๊ณ  ๋„ฃ์—ˆ๋Š”๋ฐ ์„œ๋ฒ„๋Š” ๊ณ„์† {"flag":["Wrong flag."]} ๋งŒ ๋Œ๋ ค์คฌ๋‹ค. ์•Œ๊ณ  ๋ณด๋‹ˆ ์ด ๋ฌธ์ œ๋Š” ์†Œ๋ฌธ์ž acsc{} ๋ฅผ ๋ฐ›๋Š”๋‹ค โ€” ๋ฌธ์ œ ๋Œ“๊ธ€์— "์ •๋‹ต์„ ์ฐพ์œผ์…จ์œผ๋ฉด ์ด๊ฒƒ์„ ํ”Œ๋ž˜๊ทธ ํ˜•์‹์ธ acsc{} ์— ๋„ฃ์–ด์„œ ์ธ์ฆํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!" ๋ผ๊ณ  ์ ํ˜€ ์žˆ์—ˆ๋‹ค. ๋ณต์›ํ•œ ๊ฐ’์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งž์•˜๊ณ  ๊ป๋ฐ๊ธฐ ๋Œ€์†Œ๋ฌธ์ž ํ•˜๋‚˜ ๋•Œ๋ฌธ์— ํ—ค๋งธ๋˜ ๊ฒƒ. ์ œ์ถœ ์ „์— ๋ฌธ์ œ ์„ค๋ช…ยท๋Œ“๊ธ€ยทplaceholder ๋ฅผ ๋จผ์ € ์ฝ์ž๋Š” ๊ตํ›ˆ์„ ๋‹ค์‹œ ์ƒˆ๊ฒผ๋‹ค.


๐ŸŽฏ ํ•ต์‹ฌ โ€” main ์ด ํ•˜๋Š” ๊ณ„์‚ฐ

main(0x080001b8)์˜ ํ๋ฆ„์€ ์งง๋‹ค.

  1. flash ์˜ d2VsY29tZXRvc3RtMzIhISE=(= welcome base64)๋ฅผ ์Šคํƒ ๋ฒ„ํผ buf ๋กœ ๋ณต์‚ฌํ•œ๋‹ค.
  2. xor_inplace(buf, "c3RtMzJmNC1kaXNjb3Zlcnk=") ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค โ€” buf ๋ฅผ discovery base64 ๋กœ XOR ํ•œ๋‹ค.
  3. USART1 ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , buf ๋ฅผ UART ๋กœ ๋ฐ˜๋ณต ์†ก์‹ ํ•œ๋‹ค.

2๋ฒˆ์˜ xor_inplace(0x080000f6)๊ฐ€ ์ด ๋ฌธ์ œ์˜ ์ „๋ถ€๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ”์„ ๋ณด๋ฉด ์ „ํ˜•์ ์ธ ๋ฐ˜๋ณตํ‚ค XOR ์ด๋‹ค.

#!/usr/bin/env python3
# capstone thumb disassembly of the repeating-key XOR routine @ 0x080000f6
import capstone
BASE = 0x08000000
data = open("extracted/stm32f4-discovery.bin", "rb").read()
md = capstone.Cs(capstone.CS_ARCH_ARM, capstone.CS_MODE_THUMB)
 
notes = {
    0x08000106: "while str1[i]        -> i = strlen(str1)",
    0x0800011e: "while str2[j]        -> j = strlen(str2)  (key length)",
    0x08000142: "sdiv/mul/sub         -> k % strlen(key)",
    0x08000154: "r2 = key[k % keylen]",
    0x0800015c: "r2 ^= str1[k]",
    0x08000160: "str1[k] = r2         <-- repeating-key XOR, in place",
}
for insn in md.disasm(data[0x130:0x172], BASE + 0x130):
    n = notes.get(insn.address, "")
    tail = f"      ; {n}" if n else ""
    print(f"0x{insn.address:08x}:  {insn.mnemonic:6s} {insn.op_str}{tail}")
python3 xor_disasm.py

capstone ๋””์Šค์–ด์…ˆ๋ธ” โ€” 0x080000f6 ์˜ ๋ฐ˜๋ณตํ‚ค XOR ๋ฃจํ”„, sdiv ๋กœ k mod keylen ์„ ๊ตฌํ•˜๊ณ  key ๋ฐ”์ดํŠธ์™€ XOR ํ•œ ๋’ค ์ œ์ž๋ฆฌ์— ์ €์žฅ
capstone ๋””์Šค์–ด์…ˆ๋ธ” โ€” 0x080000f6 ์˜ ๋ฐ˜๋ณตํ‚ค XOR ๋ฃจํ”„, sdiv ๋กœ k mod keylen ์„ ๊ตฌํ•˜๊ณ  key ๋ฐ”์ดํŠธ์™€ XOR ํ•œ ๋’ค ์ œ์ž๋ฆฌ์— ์ €์žฅ

์˜์‚ฌ์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ๋ฉด ์ด๋ ‡๋‹ค.

// str1 = buf(welcome base64),  str2 = key(discovery base64)
for (k = 0; k < strlen(str1); k++) {
    str1[k] = str1[k] ^ str2[k % strlen(str2)];   // 0x160: strb r2, [r3]
}

sdiv/mul/subs ์„ธ ๋ช…๋ น์ด k % strlen(key) ๋ฅผ ๋งŒ๋“ค๊ณ (0x142~0x14c), key[k % keylen](0x154)๋ฅผ str1[k](0x13c)์™€ XOR(0x15c)ํ•ด์„œ ์ œ์ž๋ฆฌ์— ๋‹ค์‹œ ์“ด๋‹ค(0x160). ๋‘ ๋ฌธ์ž์—ด ๊ธธ์ด๊ฐ€ 24๋กœ ๊ฐ™์œผ๋‹ˆ ๊ฒฐ๊ตญ ๋‘ base64 ๋ฌธ์ž์—ด์˜ ๋‹จ์ˆœ ๋ฐ”์ดํŠธ XOR ์ด๋‹ค.

์ฆ‰ ๋ณด๋“œ๊ฐ€ UART ๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๊ฐ’์€

CT = base64("welcometostm32!!!") โŠ• base64("stm32f4-discovery")

์ด๊ณ , ์ด CT ๋ฅผ ๋‹ค์‹œ base64("stm32f4-discovery") ๋กœ XOR ํ•˜๋ฉด base64("welcometostm32!!!") ๊ฐ€ ํŠ€์–ด๋‚˜์˜จ๋‹ค. "my Discovery key" ๋Š” ๋ฏธ๋ผ ํ‰๋ฌธ๋“ค์ด ์•„๋‹ˆ๋ผ, ๋ณด๋“œ ์ž์‹ ์˜ ์ •์ฒด์„ฑ์ธ stm32f4-discovery ๋ฅผ XOR ํ‚ค๋กœ ์“ด๋‹ค๋Š” ๋œป์ด์—ˆ๋‹ค.

ํ‚ค ๊ณ„์‚ฐ๊ณผ ๋ณตํ˜ธ ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” ๋‘ base64 ๋ฌธ์ž์—ด XOR ๋กœ CT ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ณตํ˜ธ๋Š” CT ๋ฅผ base64 ํ‚ค๋กœ XOR ํ•ด ์›๋ฌธ base64 ๋ฅผ ๋ณต์›ํ•œ ๋’ค ๋””์ฝ”๋“œ
ํ‚ค ๊ณ„์‚ฐ๊ณผ ๋ณตํ˜ธ ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” ๋‘ base64 ๋ฌธ์ž์—ด XOR ๋กœ CT ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ณตํ˜ธ๋Š” CT ๋ฅผ base64 ํ‚ค๋กœ XOR ํ•ด ์›๋ฌธ base64 ๋ฅผ ๋ณต์›ํ•œ ๋’ค ๋””์ฝ”๋“œ


๐Ÿงช ์ฆ๊ฑฐ โ€” ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ UART ์ถœ๋ ฅ ์‹ค์ธก

์ •์  ๋ถ„์„๋งŒ์œผ๋กœ "์ด ๋ฐ”์ดํŠธ๊ฐ€ ๋‚˜์˜จ๋‹ค"๊ณ  ์ฃผ์žฅํ•˜๊ธฐ๋ณด๋‹ค, ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค UART ๋กœ ๋ฌด์—‡์ด ๋‚˜๊ฐ€๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํŽธ์ด ํ™•์‹คํ•˜๋‹ค. ์‹ค๋ฌผ ๋ณด๋“œ๊ฐ€ ์—†์œผ๋‹ˆ Unicorn ์—”์ง„์œผ๋กœ ์ด Thumb ํŽŒ์›จ์–ด๋ฅผ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ–ˆ๋‹ค. flashยทSRAM ์„ ๋งคํ•‘ํ•˜๊ณ , USART1 ์˜ ์ƒํƒœ ๋ ˆ์ง€์Šคํ„ฐ(0x40011000) ์ฝ๊ธฐ๋Š” ํ•ญ์ƒ TXE ์ค€๋น„๋จ์œผ๋กœ ์‘๋‹ตํ•˜๊ฒŒ, ๋ฐ์ดํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ(0x40011004) write ๋Š” ํ›„ํ‚นํ•ด์„œ ๋‚˜๊ฐ€๋Š” ๋ฐ”์ดํŠธ๋ฅผ ๋ชจ์•˜๋‹ค.

def usart_read(uc, offset, size, user):
    if offset == 0x00:      # USART_SR: TXE|TC ํ•ญ์ƒ ์ค€๋น„๋จ
        return 0xC0
    return 0
 
def usart_write(uc, offset, size, value, user):
    if offset == 0x04:      # USART_DR: ์†ก์‹  ๋ฐ”์ดํŠธ
        captured.append(value & 0xFF)
 
uc.mmio_map(0x40011000, 0x1000, usart_read, None, usart_write, None)
uc.reg_write(UC_ARM_REG_SP, 0x20020000)
uc.emu_start(0x08000250 | 1, 0, count=0)   # ๋ฆฌ์…‹ ํ•ธ๋“ค๋Ÿฌ๋ถ€ํ„ฐ

Unicorn ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ USART1 DR write ๋ฅผ ํ›„ํ‚นํ•ด ๋ณด๋“œ๊ฐ€ ์‹ค์ œ ์†ก์‹ ํ•˜๋Š” CT ๋ฐ”์ดํŠธ๋ฅผ ์บก์ฒ˜
Unicorn ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ USART1 DR write ๋ฅผ ํ›„ํ‚นํ•ด ๋ณด๋“œ๊ฐ€ ์‹ค์ œ ์†ก์‹ ํ•˜๋Š” CT ๋ฐ”์ดํŠธ๋ฅผ ์บก์ฒ˜

๋ณด๋“œ๊ฐ€ ์‹ค์ œ๋กœ ํด๋Ÿญ์•„์›ƒํ•˜๋Š” ๋ฐ”์ดํŠธ๋Š” 07 01 04 07 14 48 73 19 14 1b โ€ฆ. ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์—†๋Š” ๊ฐ’์ด๋‹ค. ์—ฌ๊ธฐ์„œ "์ถœ๋ ฅ์ด ๊ณง flag" ๋ผ๊ณ  ์ฐฉ๊ฐํ•˜๋ฉด ๋ง‰ํžŒ๋‹ค โ€” ์ด๊ฑด ์•”ํ˜ธ๋ฌธ(CT)์ด๊ณ , ์ •์  ๋ถ„์„์—์„œ ์˜ˆ์ธกํ•œ XOR ๊ฒฐ๊ณผ์™€ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ •ํ™•ํžˆ ์ผ์น˜ํ•œ๋‹ค. ์ •์ ยท๋™์  ๋‘ ๊ฐˆ๋ž˜๊ฐ€ ๊ฐ™์€ ๋‹ต์„ ๊ฐ€๋ฆฌํ‚ค๋‹ˆ ์ด์ œ ๋˜๋Œ๋ฆฌ๋ฉด ๋œ๋‹ค.


๐Ÿ”“ ๋ณตํ˜ธ โ€” ์ž์ฒด ์™„๊ฒฐ solve

CT ๋ฅผ base64("stm32f4-discovery") ๋กœ XOR ํ•ด ์›๋ฌธ base64 ๋ฅผ ๋ณต์›ํ•˜๊ณ , ๊ทธ๊ฑธ ๋‹ค์‹œ base64 ๋””์ฝ”๋“œํ•˜๋ฉด ์ˆจ์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜จ๋‹ค.

import base64
 
# USART1_DR ๋กœ ๋‚˜์˜จ ๋ฐ”์ดํŠธ (Unicorn ์œผ๋กœ ์บก์ฒ˜)
CT = bytes.fromhex("0701040714487319141b631d026b1c1e2f4913042a3d2e00")
 
key_b64 = b"c3RtMzJmNC1kaXNjb3Zlcnk="            # base64("stm32f4-discovery")
 
recovered_b64 = bytes(CT[i] ^ key_b64[i % len(key_b64)] for i in range(len(key_b64)))
secret = base64.b64decode(recovered_b64).decode()
 
print("recovered base64 :", recovered_b64.decode())
print("b64 decode       :", secret)
print("flag             : acsc{%s}" % secret)

solve ์Šคํฌ๋ฆฝํŠธ โ€” CT ๋ฅผ base64 ํ‚ค๋กœ XOR ํ•ด ๋ณต์›ํ•œ base64 ๋ฅผ ๋””์ฝ”๋“œํ•˜๊ณ  flag ๋ฅผ ์ถœ๋ ฅ
solve ์Šคํฌ๋ฆฝํŠธ โ€” CT ๋ฅผ base64 ํ‚ค๋กœ XOR ํ•ด ๋ณต์›ํ•œ base64 ๋ฅผ ๋””์ฝ”๋“œํ•˜๊ณ  flag ๋ฅผ ์ถœ๋ ฅ

๋ณต์›๋œ base64 d2VsY29tZXRvc3RtMzIhISE= โ†’ ๋””์ฝ”๋“œ โ†’ welcometostm32!!!. ์ด๊ฑธ ์†Œ๋ฌธ์ž ํ˜•์‹์— ๋„ฃ์–ด acsc{welcometostm32!!!} ๋ฅผ ์ œ์ถœํ•˜๋‹ˆ ์ •๋‹ต(HTTP 201, ํ•ด๊ฒฐ ์ฒ˜๋ฆฌ)์ด๋‹ค.


๐Ÿ›ก๏ธ ๋ฐฉ์–ด ๊ด€์ ์—์„œ ๋ฐฐ์šธ ์ 

์žฅ๋‚œ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋ฌธ์ œ์ง€๋งŒ ์‹ค์ œ ์ž„๋ฒ ๋””๋“œ ๋ณด์•ˆ์— ๊ทธ๋Œ€๋กœ ๋‹ฟ์•„ ์žˆ๋‹ค.

  • ํŽŒ์›จ์–ด์— ํ•˜๋“œ์ฝ”๋”ฉํ•œ "ํ‚ค"๋Š” ํ‚ค๊ฐ€ ์•„๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ XOR ํ‚ค stm32f4-discovery ๋Š” ๊ทธ๋ƒฅ flash ์— base64 ๋กœ ๋ฐ•ํ˜€ ์žˆ์—ˆ๋‹ค. ๋ฌผ๋ฆฌ ์ ‘๊ทผ์ด๋‚˜ flash ๋คํ”„ ํ•œ ๋ฒˆ์ด๋ฉด ๋๋‚œ๋‹ค. ์ง„์งœ ๋น„๋ฐ€์€ secure elementยทOTPยทPUF ์ฒ˜๋Ÿผ ์ฝ์–ด๋‚ผ ์ˆ˜ ์—†๋Š” ๊ณณ์— ๋‘ฌ์•ผ ํ•œ๋‹ค.
  • XOR ์€ ์•”ํ˜ธํ™”๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ฐ˜๋ณตํ‚ค XOR ์€ ํ‚ค๋งŒ ์•Œ๋ฉด ์ฆ‰์‹œ ๋˜๋Œ์•„๊ฐ€๊ณ , ์—ฌ๊ธฐ์„  ํ‚ค๊นŒ์ง€ ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ์•ˆ์— ์žˆ์—ˆ๋‹ค. ๋‚œ๋…ํ™”(๋ฏธ๋ผ ๋ฌธ์ž์—ด, ์ฃฝ์€ ์ฝ”๋“œ)๋ฅผ ์•„๋ฌด๋ฆฌ ์–น์–ด๋„ "์‰ฝ๊ฒŒ ๋˜๋Œ์•„๊ฐ€๋Š” ๋ณ€ํ™˜"์ด๋ผ๋Š” ๋ณธ์งˆ์€ ์•ˆ ๋ฐ”๋€๋‹ค.
  • strip ์€ ๋ฐฉ์–ด๊ฐ€ ์•„๋‹ˆ๋ผ ์†๋„ ๋ฐฉ์ง€ํ„ฑ์ด๋‹ค. ์‹ฌ๋ณผ์„ ๋‹ค ์ง€์›Œ๋„ ๋ฒกํ„ฐ ํ…Œ์ด๋ธ”ยท์ฃผ๋ณ€์žฅ์น˜ ์ฃผ์†Œยท๋ฌธ์ž์—ด์€ ๋‚จ๊ณ , ๋””์Šค์–ด์…ˆ๋ธ”๋Ÿฌ์™€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ๋กœ์ง์€ ๊ทธ๋Œ€๋กœ ๋ณต์›๋œ๋‹ค. ๊ธฐ๋ฐ€์„ฑ์ด ํ•„์š”ํ•˜๋ฉด ์ฝ”๋“œ ๋‚œ๋…ํ™”๊ฐ€ ์•„๋‹ˆ๋ผ ์‹คํ–‰ ํ™˜๊ฒฝ(secure boot, ์ฝ๊ธฐ ๋ณดํ˜ธ RDP)์œผ๋กœ ์ง€์ผœ์•ผ ํ•œ๋‹ค.
  • ๋ถ„์„ ์ธก๋ฉด์—์„œ๋Š”, ๋ฏธ๋ผ์— ํ”๋“ค๋ฆฌ์ง€ ๋ง๊ณ  "์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ์ฝ๊ณ  ์“ฐ๋Š”๊ฐ€"๋งŒ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋œ๋‹ค. getKey ๊ฐ€ ๋ฐ˜ํ™˜๊ฐ’์„ ์•ˆ ์“ฐ๊ณ  ๋ฌธ์ž์—ด์„ ๋กœ๋“œ๋งŒ ํ•˜๋Š” ๊ฑธ ๋””์Šค์–ด์…ˆ๋ธ”๋กœ ํ™•์ธํ•˜๋Š” ์ˆœ๊ฐ„, ๋„ค ๊ฐœ์˜ ๋ฏธ๋ผ๋Š” ํ•œ๊บผ๋ฒˆ์— ๊ฑธ๋Ÿฌ์กŒ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

strings ํ•œ ๋ฐฉ์œผ๋กœ ๋๋‚  ๊ฒƒ ๊ฐ™๋˜ 769๋ฐ”์ดํŠธ๊ฐ€, ์‹ค์€ "์ถœ๋ ฅ์ด ๊ณง ๋‹ต์ด ์•„๋‹ˆ๋‹ค"๋ผ๋Š” ํ•œ ๊ฒน์„ ์ˆจ๊ฒจ๋‘” ๋ฌธ์ œ์˜€๋‹ค. Cortex-M ๋ฒกํ„ฐ ํ…Œ์ด๋ธ”์—์„œ ๋กœ๋“œ ์ฃผ์†Œ๋ฅผ ์ฝ๊ณ  โ†’ Thumb ์„ ๋””์Šค์–ด์…ˆ๋ธ”ํ•ด ๋ฏธ๋ผ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๊ณ  โ†’ ๋ฐ˜๋ณตํ‚ค XOR ์„ ์ฐพ์•„ โ†’ Unicorn ์œผ๋กœ ์‹ค์ธกํ•˜๊ณ  โ†’ ๋˜๋Œ๋ฆฐ๋‹ค. ๋งˆ์ง€๋ง‰์— ๋Œ€๋ฌธ์žยท์†Œ๋ฌธ์ž ํ•˜๋‚˜๋กœ ํ—ค๋งจ ๊ฑด ๋ค์ด์ง€๋งŒ, ๊ทธ ๋•์— "์ œ์ถœ ํ˜•์‹์€ ๋ฌธ์ œ ์„ค๋ช…์—์„œ ๋จผ์ € ํ™•์ธํ•˜์ž"๋Š” ๊ธฐ๋ณธ์„ ํ•œ ๋ฒˆ ๋” ๋˜์ƒˆ๊ฒผ๋‹ค.

FLAG: acsc{welcometostm32!!!}

์ด ๊ธ€์ด ๋„์›€์ด ๋๋‚˜์š”?

Comments

๋Œ“๊ธ€

0๊ฐœ

๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์š”. (๋„ค์ด๋ฒ„ ยท ๊ตฌ๊ธ€ ๊ณ„์ •)

๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 3] stripped Rust ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์Šคํƒ key ๋ฅผ ๋ฝ‘์•„ XOR ์—ญ์‚ฐ โ€” DreamHack Rusty Gyul ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 3] stripped Rust ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์Šคํƒ key ๋ฅผ ๋ฝ‘์•„ XOR ์—ญ์‚ฐ โ€” DreamHack Rusty Gyul ํ’€์ด

์‹ฌ๋ณผ์„ ๋ชจ๋‘ ๊ฑท์–ด๋‚ธ Rust ELF ํ•˜๋‚˜๊ฐ€ "ํ”Œ๋ž˜๊ทธ๋ฅผ ๋งž์ถฐ๋ด"๋ผ๊ณ  ํ•œ๋‹ค. ltrace ์—๋Š” strcmp ํ•˜๋‚˜ ์•ˆ ์žกํžˆ๊ณ  main ์€ ๊ป๋ฐ๊ธฐ๋ฟ์ด๋‹ค. ์ง„์งœ ๊ฒ€์‚ฌ ๋ฃจํ‹ด์„ ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ์ฐพ์•„ ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด, ์ž…๋ ฅ์„ trim ํ•œ ๋’ค ์Šคํƒ์— ์‹ค์–ด๋‘” 32๋ฐ”์ดํŠธ key ์™€ ํ•œ ๋ฐ”์ดํŠธ์”ฉ XOR ํ•ด์„œ ์ „๋ถ€ 0x55 ์ธ์ง€๋งŒ ๋ณธ๋‹ค. key ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฝ‘์•„ 0x55 ๋กœ ๋˜XOR ํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋‚˜์˜จ๋‹ค.
#dreamhack#ctf#reversing+5
2026-07-16#dreamhack +4
[๐Ÿฅ‰ ๋ธŒ๋ก ์ฆˆ 2] ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋Š” ์ •๋‹ต โ€” DreamHack My Favorite Fruit ํ’€์ด
blog

[๐Ÿฅ‰ ๋ธŒ๋ก ์ฆˆ 2] ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋Š” ์ •๋‹ต โ€” DreamHack My Favorite Fruit ํ’€์ด

๊ณผ์ผ ์ด๋ฆ„์„ ๋ฌผ์–ด๋ณด๋Š” ์ฑ—๋ด‡ ๋ฐ”์ด๋„ˆ๋ฆฌ๋‹ค. ๋‹ค์„ฏ ๊ณผ์ผ์„ ๋‹ค ๋งžํžˆ๋ฉด ์ „์—ญ ๋ฒ„ํผ๋ฅผ flag ๋กœ ๋ณต์›ํ•ด ์ถœ๋ ฅํ•˜๋Š”๋ฐ, scanf ํฌ๋งท์ด %9s ๋ผ ์—ด ๊ธ€์ž์งœ๋ฆฌ strawberry ๋Š” ์•„ํ™‰ ๊ธ€์ž๋กœ ์ž˜๋ ค ์ ˆ๋Œ€ ๋งค์นญ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๋Ÿฐํƒ€์ž„์œผ๋กœ๋Š” flag ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ๋ฒ„ํผ๋ฅผ ๋งŒ๋“œ๋Š” ์—ฐ์‚ฐ์ด XOR ๋ผ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๋ฏ€๋กœ, ๋‹ค์„ฏ ๊ณผ์ผ ํ‚ค๋ฅผ ์ •์ ์œผ๋กœ ํ•œ๊บผ๋ฒˆ์— XOR ํ•ด flag ๋ฅผ ๋ณต์›ํ–ˆ๋‹ค.
#dreamhack#ctf#reversing+4
2026-07-13#dreamhack +4
[๐Ÿฅ‰ Bronze 2] ์•”ํ˜ธ๋„ ํ”Œ๋ž˜๊ทธ๋„ .data ์— ๋ˆ„์›Œ ์žˆ๋‹ค โ€” DreamHack Gyul Brix Calculator ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] ์•”ํ˜ธ๋„ ํ”Œ๋ž˜๊ทธ๋„ .data ์— ๋ˆ„์›Œ ์žˆ๋‹ค โ€” DreamHack Gyul Brix Calculator ํ’€์ด

๋‹น๋„๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ์ฒ™ํ•˜๋Š” 32๋น„ํŠธ PE ์•ˆ์—, ๊ด€๋ฆฌ์ž ์•”ํ˜ธ์™€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ฐ๊ฐ ๋‹จ์ผ๋ฐ”์ดํŠธ XOR ํ•œ ๊ฒน๋งŒ ์“ด ์ฑ„ .data ์— ๋‚˜๋ž€ํžˆ ๋ˆ„์›Œ ์žˆ๋‹ค. ํ‚ค๊ฐ€ ์ฝ”๋“œ ์•ˆ ์ฆ‰์น˜๊ฐ’์ด๋ผ strings ๋กœ๋Š” ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์žกํžˆ๊ณ , ๋‘ ๋ธ”๋กญ์„ ํ‚คยท์•”ํ˜ธ๋ฌธ ์Œ์œผ๋กœ ๋„˜๊ฒจ์งš์œผ๋ฉด ๋” ํ—ค๋งจ๋‹ค. ๋””์Šค์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ 0x55 ์™€ 0x77 ์„ ์ฝ์–ด๋‚ด๋ฉด ๋๋‚œ๋‹ค.
#dreamhack#ctf#reversing+6
2026-08-17#dreamhack +4