프로그래밍

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
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180569 [모바일] a15를 살까... 울그락푸르락 0 5 분 전 5
180568 [정보] ai 더빙 질문 ggaonn 0 33 분 전 13
180567 [컴퓨터] 뭘로 살까.. 게이밍 노트북 VS 데스크탑 7 사람존 0 1 시간 전 95
180566 [잡담] PC랑 TV연결 문제 질문 4 fjekxnw 0 2 시간 전 35
180565 [잡담] 입주예정 개붕이 티비랑 스피커 고민 13 배프고다배파고 0 2 시간 전 64
180564 [컴퓨터] 공유기 익스텐더 설정 이거 층에사는중 0 2 시간 전 26
180563 [모바일] 지금 a34를 사는게 맞나.. 9 울그락푸르락 0 2 시간 전 69
180562 [컴퓨터] PC 고수님들 컴퓨터 좀 봐주십시요 꾸벅 4 방앗간 0 3 시간 전 40
180561 [컴퓨터] 서브 모니터 추천좀 1 년째재수강 0 3 시간 전 26
180560 [잡담] 태블릿 직구했는데 배송조회에 '사고'래.... 2 ✔_✔ 0 5 시간 전 194
180559 [모바일] ㅠㅠ a90 아직 현역인가? 4 슈퍼커브 0 6 시간 전 96
180558 [정보] 개드립 mp4 재생 안되는 사람 보시오 3 쪼렙고양이 1 11 시간 전 87
180557 [컴퓨터] 메인보드 어떤거 써야되죠? 4 함박눈 0 13 시간 전 124
180556 [프로그래밍] 안드로이드 책 추천좀 집에가게해줘 0 13 시간 전 92
180555 [잡담] 갤럭시 앱 아이콘 숫자? 안뜸ㅠ 5 1q2w3es 0 15 시간 전 104
180554 [컴퓨터] 이런 도킹스테이션 어떰? 6 쿠엥쿠엥 0 15 시간 전 216
180553 [잡담] 허먼밀러 뉴 에어론B 하루체감 5 창원토박이 0 15 시간 전 216
180552 [컴퓨터] 노트북 가지고다니기 vs 미니컴퓨터 가지고다니기 15 황제건 0 16 시간 전 193
180551 [잡담] 아이패드 프로 얼마에 나올거 같음? 5 노보케인 0 17 시간 전 166
180550 [정보] 알리 ssd 2테라 9.6만 7 년차html개발자 0 19 시간 전 371