๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • Welcome.
:: Cyber Security ๐Ÿšฉ

[ARM ์ปดํ“จํ„ฐ ๊ตฌ์กฐ] delay_loop ๊ตฌํ˜„ ๋ฐ ๊ฐ€์ƒ ๋จธ์‹  ํ…Œ์ŠคํŠธ ๊ตฌํ˜„ ๊ณผ์ œ - ๋ฌธ์ œ

by EunBird 2023. 6. 12.

Problem 1:

๊ธฐ์—…์ฒด์—์„œ ์„ค๊ณ„ํ•œ Arm ํ”„๋กœ์„ธ์„œ ๊ธฐ๋ฐ˜์˜ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์— ์•ˆ๋“œ๋กœ์ด๋“œ ์˜คํผ๋ ˆ์ดํŒ… ์‹œ์Šคํ…œ ํฌํŒ…ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์€ ์‚ผ์„ฑ์ „์ž์—์„œ ์„ค๊ณ„ํ•œ Arm ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด ๊ธฐ๋ฐ˜์˜ Exynos ํ”„๋กœ์„ธ์„œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์˜ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ฐ˜์˜ ์•ˆ๋“œ๋กœ์ด๋“œ ์ปค๋„์„ ๋กœ๋”ฉํ•˜๋Š” ๋ถ€ํŠธ๋กœ๋”๋Š” u-boot๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ถ€ํŒ… ๊ณผ์ •์—์„œ ์‹œ์Šคํ…œ์ด ์ž์ฃผ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ์˜ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ  ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›์ธ ๋ถ„์„

์‹œ์Šคํ…œ์ด ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์„ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด, ์˜ค์‹ค๋กœ์Šค์ฝ”๋“œ๋ฅผ ์ด์šฉํ•œ ์ œ์–ด ์‹ ํ˜ธ(Reset, Address bus, Data bus, etc.)์˜ ํŒŒํ˜• ๋ถ„์„๊ณผ ICE (In-Circuit Emulator) ์žฅ๋น„๋ฅผ ์‹œ์Šคํ…œ์— ์—ฐ๊ฒฐํ•œ ๋‹ค์Œ ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์—์„œ ์ฝ”๋“œ ์‹คํ–‰ ๋“ฑ์„ ํ†ตํ•˜์—ฌ ์‹œ์Šคํ…œ์ด ๋ฉˆ์ถ”๋Š” ์œ„์น˜๋ฅผ ํŠน์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

u-boot ์ฝ”๋“œ์˜ lowlevel_init() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ํ›„, ROM ์˜์—ญ์˜ u-boot ์ฝ”๋“œ๋ฅผ DRAM ์˜์—ญ์œผ๋กœ ๋ณต ์‚ฌํ•˜๋Š” ์ฝ”๋“œ ์‹คํ–‰ ์‹œ์— ์ž์ฃผ ์‹œ์Šคํ…œ์ด ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

**lowlevel_init()** ํ•จ์ˆ˜๋Š” ์‹œ์Šคํ…œ ํ•˜๋“œ์›จ์–ด์˜ ์ดˆ๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , ์บ์‹œ ์‚ฌ์šฉ์„ ๋น„ํ™œ์„ฑํ™” ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€ ํ•˜๋“œ์›จ์–ด์˜ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ํ•˜๋“œ์›จ์–ด ์„ค์ • ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ณ , ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜์˜๋˜๊ธฐ ๊นŒ์ง€ ์–ผ๋งˆ๊ฐ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์—…์ฒด์—์„œ ์„ค๊ณ„ํ•œ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ, PCB์— ์žฅ์ฐฉ๋œ ํ”„๋กœ์„ธ์„œ์™€ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฌผ๋ฆฌ์  ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์–ด์„œ ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ๋‚ด์— ์„ค์ • ๊ฐ’์ด ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

lowlevel_init() 
copy_codeblock2dram()

 

๐Ÿ’ก lowlevel_init()์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ คํ–ˆ๋Š”๋ฐ PCB์— ๋ฌผ๋ฆฌ์  ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€์–ด์„œ ์ดˆ๊ธฐํ™”๊ฐ€ ์•ˆ๋œ ์ƒํƒœ๋กœcopy_codeblock2dram() ์‹คํ–‰๋˜์„œ dram ์ดˆ๊ธฐํ™” ์ „์— ๋ณต์‚ฌํ•ด์„œ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋‹ˆ๊นŒ ๋ป‘?๋‚˜๊ฐ€์„œ ๋ฉˆ์ถ˜ ๊ทธ๋Ÿฐ ์ƒํƒœ.

 

๋ฌธ์ œ ํ•ด๊ฒฐ

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด lowlevel_init() ํ•จ์ˆ˜์™€ ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ ๋ธ”๋ก์„ DRAM ์˜์—ญ์œผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ํ•จ ์ˆ˜ ์‚ฌ์ด์— 40ms์˜ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ•˜๋“œ์›จ์–ด ์‹œ์Šคํ…œ์— ์ ์šฉํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์œผ๋กœ MDK-ARM ํˆด์—์„œ ์ œ๊ณตํ•˜๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” Arm 7 ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์„œ ์ฝ”์–ด์˜ ๋™์ž‘ ์†๋„๋Š” 60 Mhz ์ด๋ฉฐ, 3 stages pipeline์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ branch ๋ช…๋ น ๋“ฑ์œผ๋กœ ์ธํ•œ pipeline refill ์— ์†Œ๋น„๋˜๋Š” ์‚ฌ์ดํด์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.
  2. ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด instruction set์„ ์ด์šฉํ•˜์—ฌ ์ง€์—ฐ ์‹œ๊ฐ„์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฐธ๊ณ ๋กœ, Keil MDK uVision์„ ์ด์šฉํ•  ๊ฒฝ์šฐ, ๋””๋ฒ„๊ทธ ์„ธ์…˜์—์„œ "registers - internal - states" ํ•ญ๋ชฉ์„ ๋ณด๋ฉด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ƒ์—์„œ ์‹คํ–‰ํ•œ ์‚ฌ์ดํด ์ˆ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Problem2:

ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ROM ์˜์—ญ์˜ ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ RAM ์˜์—ญ์œผ๋กœ ๋ณต์‚ฌํ•œ ๋‹ค์Œ, ์ œ์–ด๊ถŒ์„ ๋ณต์‚ฌํ•œ ์˜์—ญ์˜ ์ฝ”๋“œ๋กœ ๋„˜๊ฒจ ์‹คํ–‰์„ ๊ณ„์†ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Š” ๋งŽ์€ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์—์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ทจํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์ค‘์ธ ์‹œ์Šคํ…œ์—๋„ ์ด ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ

์‹ค์ œ ํ•˜๋“œ์›จ์–ด ์‹œ์Šคํ…œ์„ ๋Œ€์‹ ํ•˜์—ฌ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์ƒ์—์„œ ๋จผ์ € ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  1. ํ”„๋กœ๊ทธ๋žจ์€ ROM ์˜์—ญ์˜ 0x0 ๋ฒˆ์ง€๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋™์ž‘์„ ์ œ๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌํ•  ์ฝ”๋“œ ํฌ๊ธฐ๋ฅผ 0x1000 ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ u-boot์˜ ์ฝ”๋“œ ํฌ๊ธฐ๋Š” bss ์‹œ์ž‘ ์ฃผ์†Œ์—์„œ ์ฝ”๋“œ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๋นผ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  2. ์ฝ”๋“œ ๋ธ”๋ก์„ ๋ณต์‚ฌํ•  ์ฃผ์†Œ๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ RAM ์‹œ์ž‘ ์ฃผ์†Œ์ธ 0x4000_0000 ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒ€์ฆ์ด ์™„๋ฃŒ๋œ ํ›„, ์‹ค์ œ ํ•˜๋“œ์›จ์–ด์— ์ ์šฉํ•  ๋•Œ๋Š” ํ•˜๋“œ์›จ์–ด์— ์ ์žฌ๋œ ์ฝ”๋“œ ํฌ๊ธฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฝ”๋“œ ๋ธ”๋ก์„ ๋ณต์‚ฌํ•œ ํ›„์—๋Š” ๋ณต์‚ฌํ•œ RAM ์˜์—ญ์œผ๋กœ ์‹คํ–‰ ์œ„์น˜๋ฅผ ์˜ฎ๊ฒจ์„œ ์ฝ”๋“œ ๋ธ”๋ก์„ ๋ณต์‚ฌํ•˜๋Š” ๋ช…๋ น์— ์ด์–ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.(self-modifying code)
  4. ์ฝ”๋“œ ๋ธ”๋ก์„ ๋ณต์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ LDM/STM instructions๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  1:

์ฝ”๋“œ ๋ธ”๋ก์„ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณต์‚ฌํ•œ ๊ฒƒ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด uVision์˜ ๋””๋ฒ„๊ทธ ๋ช…๋ น ์ฐฝ์—์„œ memset ๋ช…๋ น์œผ๋กœ ์ฝ”๋“œ ์‹œ์ž‘ ์ „์— ๋ฏธ๋ฆฌ SRAM ์˜์—ญ์„ ํŠน์ • ๊ฐ’์œผ๋กœ ์ฑ„์›๋‹ˆ๋‹ค. ๋˜๋Š” ์ข€ ๋” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ debug ๋ฉ”๋‰ด์—์„œ ini ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

options for target... - debug ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•œ ๋‹ค์Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ini ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋“ฑ๋กํ•ด ๋‘ก ๋‹ˆ๋‹ค.

memset (0x40000000, 0x40001000, 'a') ; 0x4000_0000 - 0x4000_1000 ๋ฒ”์œ„๋ฅผ 'a'
๊ฐ’์œผ๋กœ ์ฑ„์šด๋‹ค.
LOAD ex4.axf ; ์ปดํŒŒ์ผ ํ›„ ๋งŒ๋“ค์–ด์ง„ ์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„์ด ex4.axf ์ธ ๊ฒฝ์šฐ

์ฐธ๊ณ  2:

์ฝ”๋“œ ๋ธ”๋ก์„ ๋ณต์‚ฌํ•œ ํ›„์— 0x4000_0000 ๋ฒˆ์ง€ ์˜์—ญ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜๋Š” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋Š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์˜ SRAM์ด read/write ์†์„ฑ์„ ๊ฐ–์ง€๋งŒ execute ์†์„ฑ์„ ๊ฐ–์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ์˜ ์ œ์–ด๊ถŒ์ด ์ •ํ™•ํ•œ ์œ„์น˜๋กœ ์ด๋™ํ•ด์„œ ์‹คํ–‰ ๋Œ€๊ธฐ ์ƒํƒœ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋””๋ฒ„๊ทธ ์„ธ์…˜์˜ registers ์ฐฝ๊ณผ disassembly ์ฐฝ์—์„œ PC ๊ฐ’์ด ์ฒ˜์Œ ์˜๋„ํ•œ ์ฃผ์†Œ์˜ ๋ช…๋ น์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง€, ๋ช…๋ น์–ด์˜ ๋ฉ” ๋ชจ๋ฆฌ ์ฃผ์†Œ๋Š” ์ •ํ™•ํ•œ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (ํ™”๋ฉด ์บก์ฒ˜)

๋””๋ฒ„๊ทธ ๋ช…๋ น์„ ์ด์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์†์„ฑ์„ ์‹คํ–‰ ๊ฐ€๋Šฅ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„, ini ํŒŒ์ผ์— ๋‹ค์Œ ๋ผ์ธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

map 0x40000000, 0x40001000 read write exec

 

728x90

๋Œ“๊ธ€