์ธํ”„๋ผ

[๋ณด์•ˆ] ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์ทจ์•ฝ์  ๋ถ„์„๊ณผ GDB๋ฅผ ํ™œ์šฉํ•œ ๋””๋ฒ„๊น… ์‹ค์Šต

HHRR 2024. 10. 16. 13:53
์‹œ์Šคํ…œ ๋ณด์•ˆ ์ˆ˜์—… ์ค‘ ์ง„ํ–‰ํ•œ ๊ณผ์ œ์ž…๋‹ˆ๋‹ค.
์‹ค์Šต

 

 overflow.c ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ , ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ Segmentation Fault(์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ํดํŠธ) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ตœ์†Œ ์ž…๋ ฅ ๊ธธ์ด๋ฅผ ์ฐพ๊ณ , ์ด๋ฅผ GDB ๋””๋ฒ„๊ฑฐ๋กœ ๋ถ„์„ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ ์ „ํ›„์˜ ์Šคํƒ ์ƒํƒœ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋น„์ •์ƒ์ ์ธ ์‹คํ–‰ ํ๋ฆ„์˜ ์›์ธ์„ ํŒŒ์•…ํ•ด๋ณด์ž.

 overflow.c
#include <stdio.h>
 
int main(int argc, char *argv[]) {
    char buf[16];
    gets(buf);
    printf(“%s\n”, buf);
}

 

 

๋ถ„์„ ๊ณผ์ •

 

์ดˆ๊ธฐ ์„ธํŒ…

1.     overflow.c ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๋ช…๋ น์–ด๋กœ ์ปดํŒŒ์ผ์„ ํ•ด์ฃผ๊ธฐ.

2.     Gdb๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ๋“œํ•˜๊ณ , list main์œผ๋กœ ์†Œ์Šค์ฝ”๋“œ์˜ ๋ผ์ธ์„ ํ™•์ธํ•˜๊ธฐ.

1) 19๊ฐœ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ

  1. Breakpoint ์„ค์ •
    • ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ์  ์ง์ „์€ gets() ํ•จ์ˆ˜๊ฐ€ ์œ„์น˜ํ•œ ๋‹ค์Œ ๋ผ์ธ ๋ฒˆํ˜ธ์ธ 6์œผ๋กœ breakpoint๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  2. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
    • run์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ณ , 19๊ฐœ์˜ A๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
    • breakpoint์—์„œ ์ค‘๋‹จ์ด ๋˜๋ฉด, info registers ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธ.
      • ์ž…๋ ฅ ๊ธธ์ด 19 (`AAAAAAAAAAAAAAAAAAA`)์ผ ๋•Œ, ebp๋Š” `0xffffd1f8`๋กœ ์„ค์ •๋˜๊ณ , esp๋Š” `0xffffd1e8`๋กœ ์„ค์ •๋จ.
    • ๋‹ค์Œ x/16xw $esp ๋ช…๋ น์–ด๋กœ ์Šคํƒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค.
      • buf๋Š” 16๋ฐ”์ดํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ, buf[16], buf[17], buf[18]์ด ๋ฎ์–ด์จ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ebp์˜ ๊ฐ’์€ ์—ฌ์ „ํžˆ `0xffffd1f8`๋กœ ์ €์žฅ๋œ๋‹ค.
      • ์ด ๊ฒฝ์šฐ, ๋ฎ์–ด์“ฐ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฆฌํ„ด ์ฃผ์†Œ์™€ ์ €์žฅ๋œ ebp ๊ฐ’์— ๋„๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Segmentation Fault๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋˜ํ•œ ๋ฆฌํ„ด ์ฃผ์†Œ (์Šคํƒ ํ”„๋ ˆ์ž„ ์ƒ์˜ ์ €์žฅ๋œ ebp ์œ„์— ์œ„์น˜ํ•œ ๊ฐ’)๋Š” `0xf7de5ed5`๋กœ ์ •์ƒ์ ์ธ ์ฃผ์†Œ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • continue๋ฅผ ํ–ˆ์„ ๋•Œ ๋ฌธ์ œ ์—†์ด ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์•„ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” ๋ฐœ์ƒํ–ˆ์ง€๋งŒ, ๋ฎ์–ด์“ฐ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฆฌํ„ด ์ฃผ์†Œ์™€ ์ €์žฅ๋œ ebp ๊ฐ’์— ๋„๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Segmentation Fault๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

2) 20๊ฐœ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ

  1. breakpoint ์„ค์ •
    • ๋ผ์ธ ๋ฒˆํ˜ธ์ธ 6์œผ๋กœ breakpoint๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.
  2. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
    • run์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ณ , 20๊ฐœ์˜ A๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
    • breakpoint์—์„œ ์ค‘๋‹จ์ด ๋˜๋ฉด, info registers ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค
      • ์ž…๋ ฅ ๊ธธ์ด 20 (`AAAAAAAAAAAAAAAAAAAA`)์ผ ๋•Œ, ebp๋Š” `0xffffd1f8`๋กœ ์„ค์ •๋˜๊ณ , esp๋Š” `0xffffd1e8`๋กœ ์„ค์ •๋œ๋‹ค.
    • ๋‹ค์Œ x/16xw $esp ๋ช…๋ น์–ด๋กœ ์Šคํƒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•œ๋‹ค.
      • buf[16], buf[17], buf[18], buf[19]์ด ๋ฎ์–ด์“ด๋‹ค.
      • ์ด ๊ฒฝ์šฐ ebp๊ฐ€ ๋ฎ์–ด์“ฐ์—ฌ์ ธ `0x41414141`๊ฐ€ ๋œ๋‹ค. (ASCII๋กœ 'AAAA').
      • ๋ฆฌํ„ด ์ฃผ์†Œ๋Š” ์ •์ƒ์ ์ธ ์ฃผ์†Œ `0xf7de5ed5`๊ฐ€ ์•„๋‹Œ `0x41414141`์™€ ๊ด€๋ จ๋œ ์ž˜๋ชป๋œ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๋”ฐ๋ผ์„œ ebp๊ฐ€ ๋ฎ์–ด์“ฐ์—ฌ์ง€๊ณ , continue๋ฅผ ํ–ˆ์„ ๋•Œ ํ•จ์ˆ˜๊ฐ€ ์ž˜๋ชป๋œ ์ฃผ์†Œ์ธ `0x41414141` ๋กœ ๋ฆฌํ„ดํ•˜๋ ค ํ•˜๋ฉด์„œ Segmentation Fault๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๊ฒฐ๋ก 

 

getsํ•จ์ˆ˜๊ฐ€ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์ž…๋ ฅ์„ ๋ฐ›์•˜์„ ๋•Œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฎ์–ด์”Œ์šฐ๊ฒŒ ๋œ๋‹ค. printfํ•จ์ˆ˜ ํ˜ธ์ถœ ์ง์ „์— break point๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค!!!!  ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฆฌํ„ด ์ฃผ์†Œ๊ฐ€ ๋ฎ์–ด์”Œ์›Œ์งˆ ๊ฒฝ์šฐ Segmentation Fault๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์œ„์™€ ๊ฐ™์ด19๋ฐ”์ดํŠธ์˜ ์ž…๋ ฅ์˜ ๊ฒฝ์šฐ, ๋ฒ„ํผ ํฌ๊ธฐ์ธ 16๋ฐ”์ดํŠธ๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” ๋ฐœ์ƒํ•˜์ง€๋งŒ, ebp์™€ ๋ฆฌํ„ด ์ฃผ์†Œ๊ฐ€ ๋ฎ์–ด์“ฐ์—ฌ์ง€์ง€ ์•Š์•„ Segmentation Fault๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ตœ์†Œ 20๋ฐ”์ดํŠธ์˜ ์ž…๋ ฅ์ด ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์ผ์œผ์ผœ ๋น„์ •์ƒ์ ์ธ ์‹คํ–‰ ํ๋ฆ„์„ ์œ ๋ฐœํ•˜๊ฒŒ ๋œ๋‹ค๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.