[12์ 1์ฃผ์ฐจ] ํดํน ์๋ ค์ค๊ฒ 17ํ: Numeric Truncation Error ์๋
ํ์ธ์! ํดํน ์๋ ค์ค๊ฒ์
๋๋ค. ๐
์ค๋์ ์ซ์์์ ๋ฐ์ํ๋ Numeric Truncation Error๋ฅผ ๊ฐ์ ธ์์ด์. โ๏ธ
์ซ์๊ฐ ์๋ฆฐ๋ค๋! ๐ฒ ์ด๊ฒ ๋๋์ฒด ์ด๋ป๊ฒ ๋ ์ผ์ด์ฃ ? ์ซ์์์ ๋ฐ์๋๋ ๋ฌธ์ ์ ์ด์? Integer Overflow๊ฐ ์์์ฃ !
Integer Overflow ์ทจ์ฝ์ ์๋ ค๋๋ฆฐ ๊ฒ ๊ธฐ์ต๋์๋์? ๐ (๊ธฐ์ต๋์๋ ๋ถ์ ์ ํฌ ๋ด์ค๋ ํฐ๋ฅผ ์ด์ฐฝ๊ธฐ๋ถํฐ ๋ด์ฃผ์ 50์ฌ ๋ถ ์ค์ ํ ๋ถ์
๋๋ค...! ๐๐ป ) Integer Overflow ๋ค์ ๋ณด๋ฌ ๊ฐ๊ธฐ! ๐ ๐๐ป ๐๐ป ๊ทธ๋ผ ์ด์ Numeric Truncation Error๊ฐ ๋ญ์ง ์์๋ณด๋ฉด์, ๋์ ์ฐจ์ด์ ์ ํ์คํ ์์๋ณด์๊ตฌ์!
๐ 2์ง์๋ ์์ 0b๋ฅผ ๋ถ์ฌ ํ์ํฉ๋๋ค! ํ์ง๋ง ํด๋น ๊ธ์์๋ ๊ฐ๋
์ฑ์ ์ํด ํ๋์์ผ๋ก ํ์ํ์์ต๋๋ค. (5 = 0b0101 = 0101 )Numeric Truncation Error๊ฐ ๋ญ์์? ๐คจ
Numeric Truncation Error๋ ๊ธฐ๋ณธ ์์๊ฐ ๋ ์์ ๊ธฐ๋ณธ ์์๋ก ๋ณํ๋๋ ๊ณผ์ ์์ ๋ฐ์ดํฐ๊ฐ ์์ค๋์ด ์๋ ๊ฐ๊ณผ๋ ๋ฌ๋ฆฌ ์์ํ์ง ๋ชปํ ๊ฐ์ผ๋ก ์ ์ฅ๋ ๋ ๋ฐ์ํฉ๋๋ค.
์ญ์ ๋ง๋ง ๋ค์ด์๋ ์กฐ๊ธ ํท๊ฐ๋ฆฌ์ฃ ? ๐ค
16bit๋ก ์ซ์ 256์ 00000001 00000000 ์
๋๋ค. ํ์ง๋ง 8bit๋ก ๋ณํํ๊ฒ ๋๋ฉด ์์ 8๋นํธ๊ฐ ์์ค๋์ด์ 00000000 ๋ง ๋จ๊ฒ ๋๋ ๊ฑฐ์์!int์ ๋ฒ์๋ 32bit๋ก -2,147,483,648 ~ 2,147,483,647๊น์ง ํํ ๊ฐ๋ฅํ๊ณ short๋ 16bit๋ก -32,768 ~ 32,767๊น์ง ํํ ๊ฐ๋ฅํฉ๋๋ค.
์ ์ฝ๋์ ๋ท์งธ ์ค์ธ
short_number = int_numer; ์์ int๊ฐ short๋ก ๋ณํ๋์ด ์ ์ฅ์ด ๋๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.2,147,483,647์ธ
01111111 11111111 11111111 11111111 ๊ฐ 16bit๋ก ๋ณํ๋๋ฉด ์์ 16bit๊ฐ ์์ค๋์ด 11111111 11111111 ์ด ๋จ์ต๋๋ค. ๋ฐ๋ผ์ shortPrimitive์ ์์ํ ๊ฐ์ด ์๋ -1 ์ด ์ ์ฅ๋ฉ๋๋ค.์
11111111 11111111 ๊ฐ -1 ์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์๋์ ์๋ ํดํคํผ๋์๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!์ Numeric Truncation Error๊ฐ ์ค์ํ๊ฐ์? ๐
Numberic Truncation Error๋ Integer Overflow์ ๋น์ทํด์. ํ๋ก๊ทธ๋จ์ ์คํ ํ๋ฆ์ ๋ฐ๊พธ๋ ๋ฑ์ ์ง์ ์ ์ธ Exploit์๋ ์ฌ์ฉ๋์ง ์์ง๋ง, ์ค์ํ ๋ณ์์์ ์์ํ์ง ๋ชปํ ๊ฐ์ผ๋ก Buffer / Heap Overflow, out-of-bounds, ๊ถํ ์์น ๋ฑ์ ๋ ๋ค๋ฅธ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํฉ๋๋ค!!
์ด๋ป๊ฒ ๋ค๋ฅธ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง๋์ง ๋ณด์ฌ๋๋ฆฌ๊ธฐ ์ํด ์์๋ฅผ ๋ค์ด๋๋ฆด๊ฒ์. ๐ ์ฐ์ ์ต์ข
๋ชฉํ๋ get_shell() ํจ์๋ฅผ ์คํ์์ผ์ system("/bin/sh"); ๊น์ง ์คํ์์ผ์ผ ๊ฒ ๋ค์. buf์ ์ฌ์ด์ฆ๋ 32์ด๊ณ , buf์ ์ฌ์ด์ฆ์ธ len์ ์
๋ ฅ๋ฐ์ ํด๋น len๋งํผ buf์ ์
๋ ฅ๋ฐ์ ์ ์์ด์.
์ฌ๊ธฐ๊น์ง ์๊ฐํ๋ฉด buf์ ์ฌ์ด์ฆ๋ฅผ ๋ฌด์ง๋ง์งํ๊ฒ ์
๋ ฅ๋ฐ์์ Stack Buffer Overflow๋ฅผ ์ผ์ผํค์! ๐ค ์๊ฐ์ด ๋ค์ฃ ? ํ์ง๋ง ์
๋ ฅ๋ฐ์ len์ด 32๋ฅผ ๋์ด๊ฐ๋ฉด Buffer Overflow๋ฅผ ํ์งํ๊ณ ์ข
๋ฃ์์ผ๋ฒ๋ฆฌ๋ค์. ๐ ํ์ง๋ง ์ค์ํ ๊ฒ์! len์ด 32์ด์์ผ ๋๋ง ์ข
๋ฃ์ํค์ง 0๋ณด๋ค ํฌ๋ผ๋ ๋ฒ์ ์์์์? ๐ -65281(
11111111 11111111 00000000 11111111 )์ ์
๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.if(len > 32) ์์๋ len์ ๊ฐ์ด -65281์ด๋ฏ๋ก ์ข
๋ฃ๋์ง ์๊ณ ์คํ์ ์ด์ด๊ฐ๊ฒ ๋๊ณ , short_len = len; ์์ ๋ฐ๋ก Numeric Truncation Error๊ฐ ๋ฐ์ํด ์์ 16bit๊ฐ ์์ค๋์ด 00000000 11111111 ๋ง ๋จ์ 255๊ฐ ๋ฉ๋๋ค! ๐คญbuf์ ํฌ๊ธฐ๊ฐ 32์ด์ธ๋ฐ 255๋งํผ ์
๋ ฅํ ์ ์๊ฒ ๋์๊ตฐ์. Stack Buffer Overflow๊ฐ ๋ฐ์ํ์ฌ get_shell() ํจ์์ ์ฃผ์๋ฅผ return address์ ๋ฃ์ ์ ์๊ฒ ๋์์ต๋๋ค! ์ค์ ๋ก ๋ฐ์ํ ์ทจ์ฝ์ ์ด ๊ถ๊ธํ์ ๋ถ๋ค์ ํ๋ฃจํ์ค๋ ๋ด์ฃผ์๋ฉด ๊ฐ์ฌํด์. ๐ฅบ ๋ชจ๋ 64๋นํธ๋ฅผ 32๋นํธ๋ก ๋ณํํ๋ ๊ณผ์ ์์ ํด๋น ์ทจ์ฝ์ ์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค!
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์๋์?
์ ์ผ ์ข์ ๋ฐฉ๋ฒ์ ์ญ์ ์์ ๋ ํฐ ํฌ๊ธฐ์ ์๋ฃํ์์ ๋ ์์ ํฌ๊ธฐ์ ์๋ฃํ์ผ๋ก์ ๋ช
์์ ํ๋ณํ์ด ๋ฐ์ํ์ง ์๋๋ก ๊ตฌํํ๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ํญ์ ๊ทธ๋ด ์๋ ์๋ ์ผ์ด์ฃ . ๐ ์ฑ๊ฑฐ์ด ํด๊ฒฐ๋ฐฉ์์ด์ง๋ง ํ๋ณํ ์ด์ ์ Numeric Truncation Error๊ฐ ๋ฐ์ํ์ง ์๋๋ก ์ต๋ํ ๊ฒ์ฌํด์ฃผ๋ ๊ฒ์ด ์ข๊ฒ ์ด์. ๐
์ค๋์ ํดํน ์๋ ค์ค๊ฒ๋ ์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๐ โ๏ธ ํดํน์งน์งน ๋ด์ค๋ ํฐ์์ ๋ค๋ฃจ๋ ๊ธฐ์ ๋ค์ ์ค๋ก์ง ๊ต์ก์ ์ธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ด๋ฅผ ์
์ฉํ์ฌ ๋ฐ์ํ๋ ๋ชจ๋ ์ฑ
์์ ๋ณธ์ธ์๊ฒ ์์ต๋๋ค. ์ง์ํด์ ๋ ์ข์ ๋ด์ค๋ ํฐ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๊ฒ์ผ๋ก ๊ธ์ ์ ์ผ๋ก ์๊ฐํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค! ์นด์นด์ค๋ฑ
ํฌ 3333-21-5085994 ใ
ใ
ใ
์ค๋ ์ ํด๋๋ฆฐ ๋ด์ฉ์ด ๋ง์์ ๋์
จ๋์? ์ฃผ์ ์น๊ตฌ๋ค์๊ฒ ๋ด์ค๋ ํฐ๋ฅผ ์ถ์ฒํด์ฃผ์ธ์! ๋ค์์ฃผ์๋ ์์ฐฌ ๋ด์ฉ์ผ๋ก ๋์์ค๊ฒ ์ต๋๋ค. ๐ ํน์ ๋ง์์ ์๋๋ ๋ถ๋ถ์ด ์์๋์? ์ฌ๊ธฐ์์ ํผ๋๋ฐฑ์ ์ ๋ฌํด์ฃผ์ธ์! ์ฌ๋ฌ๋ถ์ ์๊ฒฌ๋ค์ ์ ๊ทน ๋ฐ์ํด์ ๋์ฑ ์ ์ตํ ๋ด์ค๋ ํฐ๋ฅผ ๋ง๋ค์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ ํดํค๋ณด์ด์ฆ |