λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

μ—¬λŸ¬κ°€μ§€/μ •λ³΄λ³΄μ•ˆ 정리

[μ •λ³΄λ³΄μ•ˆ 정리] μ‹œμŠ€ν…œ - μ‹œμŠ€ν…œ ν•΄ν‚Ή

728x90

*버퍼 μ˜€λ²„ν”Œλ‘œμš° 곡격(Buffer Overflow Attack)

: μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ—μ„œ ν• λ‹Ήλœ λ©”λͺ¨λ¦¬ λ²”μœ„λ₯Ό λ„˜μ–΄μ„  μœ„μΉ˜μ— 자료λ₯Ό μ½κ±°λ‚˜ μ“°λ €κ³  ν•  λ•Œ λ°œμƒν•˜λŠ”λ°,

이λ₯Ό μ΄μš©ν•΄ μ•…μ˜μ μΈ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚€κ±°λ‚˜ ν”„λ‘œκ·Έλž¨ μ˜€μž‘λ™μ„ μœ λ°œμ‹œμΌœ 곡격자 ν”„λ‘œκ·Έλž¨μ„ ν†΅μ œν•  κΆŒν•œμ„ νšλ“

 

-μŠ€νƒ 버퍼 μ˜€λ²„ν”Œλ‘œμš°

: μŠ€νƒμ— ν• λ‹Ήλœ 버퍼듀이 λ¬Έμžμ—΄ 계산 등에 μ˜ν•΄ μ •μ˜λœ 버퍼 ν•œκ³„μΉ˜ λ„˜λŠ” 경우 버퍼 μ˜€λ²„ν”Œλ‘œμš° λ°œμƒν•˜μ—¬

볡귀 μ£Όμ†Œ λ³€κ²½ 및 κ³΅κ²©μžκ°€ μ›ν•˜λŠ” μž„μ˜ μ½”λ“œ μ‹€ν–‰

(1) μŠ€νƒ : ν•¨μˆ˜ 처리λ₯Ό μœ„ν•΄ μ§€μ—­ λ³€μˆ˜ 및 λ§€κ°œλ³€μˆ˜κ°€ μœ„μΉ˜ν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­

 

-νž™ 버퍼 μ˜€λ²„ν”Œλ‘œμš°

: νž™μ— ν• λ‹Ήλœ 버퍼듀에 λ¬Έμžμ—΄ 등이 μ €μž₯될 λ•Œ, 졜초 μ •μ˜λœ νž™ λ©”λͺ¨λ¦¬ μ‚¬μ΄μ¦ˆ μ΄ˆκ³Όν•˜μ—¬

λ¬Έμžμ—΄ 등이 μ €μž₯되면 μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•˜μ—¬ 데이터와 ν•¨μˆ˜ μ£Όμ†Œ 등을 λ³€κ²½ν•˜μ—¬ κ³΅κ²©μžκ°€ μ›ν•˜λŠ” μž„μ˜ μ½”λ“œ μ‹€ν–‰

(1) νž™ : μ‚¬μš©μžκ°€ λ™μ μœΌλ‘œ ν• λ‹Ήν•˜λŠ” λ©”λͺ¨λ¦¬ μ˜μ—­

 


 

*argv[] 

:argv[0]은 ν”„λ‘œκ·Έλž¨ λͺ…, argv[1]λΆ€ν„° main λ§€κ°œλ³€μˆ˜

ex)./test a

 


 

#include <string.h>

void foo (char *bar)
{
   char  c[12];

   strcpy(c, bar);  // no bounds checking
}

int main (int argc, char **argv)
{
   foo(argv[1]);
}

https://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D_%EB%B2%84%ED%8D%BC_%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C

 

μŠ€νƒ 버퍼 μ˜€λ²„ν”Œλ‘œ - μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전

μœ„ν‚€λ°±κ³Ό, 우리 λͺ¨λ‘μ˜ 백과사전. μŠ€νƒ 버퍼 μ˜€λ²„ν”Œλ‘œ(stack buffer overflow)λŠ” ν”„λ‘œκ·Έλž¨μ΄ ν”„λ‘œκ·Έλž¨μ΄ μ˜λ„ν•œ 데이터 ꡬ쑰체의 λ©”λͺ¨λ¦¬ μ£Όμ†Œ(일반적으둜 κ³ μ •λœ 버퍼 길이λ₯Ό κ°–λŠ”) μ™ΈλΆ€μ˜ 콜 μŠ€νƒμ—

ko.wikipedia.org

μœ„ν‚€λ°±κ³Όμ—μ„œ κ°€μ Έμ˜¨ μŠ€νƒ 버퍼 μ˜€λ²„ν”Œλ‘œμš° μ½”λ“œμ΄λ‹€. 

 

foo()λŠ” μΈμžκ°€ 11 λ°”μ΄νŠΈλ³΄λ‹€ 클 λ•Œ, λ°˜ν™˜ μ£Όμ†Œλ₯Ό κ²Ήμ³μ“°κ²Œ λœλ‹€.

즉 foo()κ°€ λ°˜ν™˜ μ‹œ κ·Έ μ£Όμ†Œλ‘œ μ ν”„ν•˜λŠ”λ°, ν•΄λ‹Ή μ£Όμ†Œμ— κ³΅κ²©μžκ°€ μ›ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ ν•΄λ‹Ή μ‰˜μ½”λ“œλ‘œ λŒ€μ²΄λœλ‹€.

 

*μŠ€νƒ 버퍼 μ˜€λ²„ν”Œλ‘œμš° λŒ€μ‘ μ•ˆμ „ν•œ μ½”λ“œ

- strcpy ν•¨μˆ˜ λŒ€μ‹  strncpy ν•¨μˆ˜ μ‚¬μš©

(1) strncpy(char *dst, const char *src, size_t len)의 eln을 sizeof(buffer)-1둜 μ„€μ •ν•œλ‹€.

- μž…λ ₯κ°’ 사전 검증

(1) if(strlen(argv[1] >= sizeof(buffer)) λ₯Ό 이용

(2) null문자 포함을 μœ„ν•΄ λ™μΌν•œ 값도 포함

 

*μŠ€νƒ 버퍼 μ˜€λ²„ν”Œλ‘œμš° λŒ€μ‘κΈ°μˆ 

-μŠ€νƒ κ°€λ“œ(Stack Guard) : λ©”λͺ¨λ¦¬μƒμ—μ„œ ν”„λ‘œκ·Έλž¨μ˜ 볡귀 μ£Όμ†Œμ™€ λ³€μˆ˜ 사이에 νŠΉμ • κ°’(μΉ΄λ‚˜λ¦¬ 단어) 을 μ €μž₯ν•΄λ‘μ—ˆλ‹€κ°€ κ·Έ κ°’

λ³€κ²½ μ‹œ μ˜€λ²„ν”Œλ‘œμš°λ‘œ κ°€μ •ν•˜μ—¬ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑단

-μŠ€νƒ μ‰΄λ“œ(Stack Shield) : ν•¨μˆ˜ μ‹œμž‘ μ‹œ 볡귀 μ£Όμ†Œλ₯Ό Global RET 특수 μŠ€νƒμ— μ €μž₯ ν›„

ν•¨μˆ˜ μ’…λ£Œ μ‹œ μ €μž₯된 κ°’κ³Ό μŠ€νƒμ˜ RETλ₯Ό 비ꡐ해 λ‹€λ₯΄λ©΄ μ˜€λ²„ν”Œλ‘œμš°λ‘œ κ°€μ •

-ASLR(Address Space Layout Randomization) : λ©”λͺ¨λ¦¬ 곡격을 λ°©μ–΄ν•˜κΈ° μœ„ν•΄ μ£Όμ†Œ 곡간 배치λ₯Ό λ‚œμˆ˜ν™”

μ‹€ν–‰ μ‹œλ§ˆλ‹€ λ©”λͺ¨λ¦¬ μ£Όμ†Œ λ³€κ²½

 


 

https://jdh5202.tistory.com/87

 

*레이슀 μ»¨λ””μ…˜ 곡격(Race Condition Attack)

: μ‹€ν–‰λ˜λŠ” ν”„λ‘œμ„ΈμŠ€κ°€ μž„μ‹œνŒŒμΌμ„ λ§Œλ“œλŠ” 경우, μ•…μ˜μ μΈ ν”„λ‘œκ·Έλž¨μ„ 톡해 κ·Έ ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ 쀑에

끼어듀어 μž„μ‹œνŒŒμΌμ„ λͺ©μ νŒŒμΌλ‘œ μ—°κ²° (심볼릭 링크)ν•˜μ—¬ μ•…μ˜μ μΈ ν–‰μœ„λ₯Ό ν•˜λŠ” 것

-레이슀 μ»¨λ””μ…˜ : λ‘˜ μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€λ‚˜ μŠ€λ ˆλ“œκ°€ κ³΅μœ μžμ›μ— λ™μ‹œμ— μ ‘κ·Όμ‹œ μ ‘κ·Ό μˆœμ„œμ— 따라 비정상적인 κ²°κ³Όκ°€ λ°œμƒν•˜λŠ” 쑰건

-ν”„λ‘œμ„ΈμŠ€κ°€ setuid μ„€μ •μœΌλ‘œ root κΆŒν•œμœΌλ‘œ μ‹€ν–‰ μ‹œ κΆŒν•œ μƒμŠΉμ„ ν†΅ν•œ μ€‘μš” μžμ›μ— μ ‘κ·Ό κ°€λŠ₯

 


 

*포맷 슀트링 곡격(Format String Attack)

: ν•¨μˆ˜μ—μ„œ μ‚¬μš©λ˜λŠ” λ¬Έμžμ—΄μ˜ μž…/좜λ ₯ ν˜•νƒœλ₯Ό μ •μ˜ν•˜λŠ” λ¬Έμžμ—΄λ‘œ,

μ™ΈλΆ€λ‘œ μž…λ ₯된 값을 κ²€μ¦ν•˜μ§€ μ•Šκ³  μž…μΆœλ ₯ ν•¨μˆ˜μ˜ 포맷 μŠ€νŠΈλ§μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λŠ” 경우 λ°œμƒ

-포맷 μŠ€νŠΈλ§μ„ ν•¨μˆ˜μ˜ μž…λ ₯ νŒŒλΌλ―Έν„°λ‘œ 직접 μ‚¬μš©ν•˜μ§€ μ•Šκ³  ν•¨μˆ˜ μ‚¬μš©μ‹œ 포맷 μŠ€νŠΈλ§μ„ 직접 μ§€μ •

ex)printf(argv[1]); -> printf("%s",argv[1]);