프로그래밍

c언어 취약점에 대해서

gets를 이용한 코드에서

 

 

#include <stdio.h>

#include <ctype.h>

 

#define H2D(x) ((x)<='9'?(x)-'0':(toupper(x))-'A'+10) //16進数1桁の文字を数値に

                                              // 0-9,a-f,A-Fのみ正しく動作する

static char st1[] = "This is a pen.";

static char st2[] = "I have an apple.";

 

// 目標:入力だけでこの関数を実行する

void sub2(void) {

  printf("Bingo!\n");

}

 

// gets()を使った危険な関数

int sub1(int hint) {

  char *p = st1;

  char str[] = "Hello, World!!!";

  char buf[32]; // gets()で入力される文字列のバッファ(小さいのですぐ溢れる)

  char *s,*d;

 

  // ヒントとして各変数や関数のアドレスを出す

  if (hint) {

    printf("各変数が格納されているアドレス:\n");

    printf("st1  : %p\n", st1);

    printf("st2  : %p\n", st2);

    printf("d    : %p\n", &d);

    printf("s    : %p\n", &s);

    printf("buf  : %p\n", buf);

    printf("str  : %p\n", str);

    printf("p    : %p\n", &p);

    printf("各関数のアドレス:\n");

    printf("sub1 : %p\n", sub1);

    printf("sub2 : %p\n\n", sub2);

  }

 

  puts("文字列を入力:");

  gets(buf);

 

  // bufに入力された文字列に%xxという形式の部分があれば

  // xxを16進数とみなして1バイトの値に置き換える

  s = d = buf; // sは入力文字、dは変換後を指すポインタ

               // 変換後のデータはbufに上書きされていく

  do {

    if(*s == '%') { // %があれば

      *d = H2D(*(s+1))*16+H2D(*(s+2)); // 16進数2桁の文字を数値に

      s+=3; // %xx

      d++;

    } else {

      *d++ = *s++;

    }

  } while(*d);

 

  puts("\n出力文字列:");

  puts(buf);

  puts(str);

  if (hint) {

    printf("ヒント:pの値 %p\n", p);

  }

  puts(p);

  return 0; // 返却値はいつも0のはず

}

 

int main(int argc, char *argv[]) {

  int r;

  char buf[4096]; // バッファオーバーフローしやすいように空間を空けてある

  r = sub1(argc > 1); // 引数があればヒントを出すように

  printf("sub1() returns %d\n", r); // sub1()の返り値表示

  return 0;

}

 

 

 

 

 

이 코드를 실행했을때

스크린샷 2021-04-15 21.40.51.png

welcome 을 입력하면

welcome이 첫번째줄

hello, woreld가 두번째

This is a pen 이 세번째 줄로 나올때

 

32bit가 넘는 입력을 하였을때는 

스크린샷 2021-04-15 21.42.39.png

이렇게 두번째줄이 welcome으로 변합니다.

 

 

 

 

하지만 세번째 줄을 바꿀려고 한다면 어떤 입력을 해야되는지 감이 안잡힙니다... 어떤식으로 하여야 될까요?? 질문이 처음이라 내용에서 이해 안되시는 부분이 있으면 말해주세요 

4개의 댓글

2021.04.15

C에서 벗어나서 Golang을 쓰자이제 ㅎㅎㅎ

0
2021.04.15

출력문자열 세번째는 p인데 st1 배열 내용을 바꿔야되지 않을까

그리고 힌트로 변수들 주소 보고 변수들 배치를 봐야됨

버퍼 오버플로우로 얼마나 덮어써야 하는지 나올듯

0
2021.04.15

1. buf 덮으려고 32byte 넣고

2. str 덮으려고 17 ~ 24바이트정도 넣으면 될건데 스택에 몇바이트 잡혔는지는 gdb로 까보거나 1바이트씩 늘려가면서 세그먼테이션 폴트 뜨는 바이트 수 확인하면 됨

3. 그 뒤로 출력 원하는 문자열 주소 넣으면 될 듯

4. 추가로 4byte 더미 넣어서 SFP 대충 덮어씌우고 ret주소 4바이트를 sub2 주소 넣으면 bingo 까지 뜰거

 

0
2021.04.15
@티벳여우

정말정말 감사합니다. 안되서 답답했는데 ㅠㅠ

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180617 [잡담] 아이폰 듀얼 메신져 됨? 9 화사하게솔라 0 2 시간 전 109
180616 [모바일] 태블릿 한대 사려는데 24 도의지구 0 2 시간 전 129
180615 [잡담] 어머니 효도용으로 어떤 태블릿이 좋을까? 4 발푸르기스의밤 0 3 시간 전 75
180614 [모바일] 울트라 24 무선 충전기 추천 가능하신가여 7 마법부오러사무국장 0 3 시간 전 81
180613 [컴퓨터] 오 워크스테이션 5 Erino 0 8 시간 전 147
180612 [컴퓨터] 하 갑자기 컴퓨터 화면이 안들어오네... 10 밀실심사 0 12 시간 전 136
180611 [잡담] 5080이 4090은 이기겠지? 4 GNStout 0 12 시간 전 347
180610 [잡담] SSD 물리적인 베드섹터때문에 부팅이 안될수있음?(바이오스단... 3 내일까지 0 12 시간 전 125
180609 [컴퓨터] 노트북 쓰는데 갑자기 화면 뻑남... 11 TvT 0 14 시간 전 145
180608 [잡담] 다음 글카 후보군 어떰 13 Gargantua 0 15 시간 전 174
180607 [견적] 최대작업이 에펙정도면 견적 얼마나 나와요? 9 뚜루뚜뚜뚜 0 17 시간 전 117
180606 [잡담] 니들은 hcn쓰지마라 4 싼디스크 0 18 시간 전 212
180605 [컴퓨터] 혹시 컴잘알 개붕이들 있어?? 6 헤로인 0 18 시간 전 152
180604 [잡담] 제닉스 arena-x 모션 데스크 괜찮음? 10 하이웨이 0 18 시간 전 73
180603 [잡담] Y700 배송 2개월 걸린다지 않았음? 5 빠빠양 0 18 시간 전 197
180602 [모바일] S23U 쓰는개붕이들 6 kg다이어트 0 19 시간 전 194
180601 [잡담] [루머] RTX 5080이 먼저 출시되고, 곧이어 2024년 4분기에 RT... 6 플게이어 0 22 시간 전 437
180600 [잡담] 120 주사율 테블릿중 사이즈가 가장 작은제품이 머임? 13 뭘보냐고ㅡㅡ 0 22 시간 전 205
180599 [컴퓨터] 뭐 좀 물어볼게 10 오라틱스 0 22 시간 전 123
180598 [컴퓨터] 브라보텍 as좋네 8 joyka 0 1 일 전 133