Sprintf tidak aman Dari C

  • Whatsapp
Sprintf tidak aman Dari C
Sprintf tidak aman Dari C

News.nextcloud.asia


Subjek: Sprintf C . yang tidak aman
Penulis: x90 , Nama Asli: KyongJu, Jung
Tanggal: 2021.12.17
Komentar: Saya mengubah alias saya dari x90c ke x90

[TOC]

————————————————– ——
1. Kode Tidak Aman
1.1 strcpy, sprintf, snprintf Contoh Kode Tidak Aman
1.2 membalikkan rutinitas penyalinan string
2. Panggilan fungsi sprintf yang aman
2.1 metode pemeriksaan terikat
2.2 metode pemeriksaan format
2.3 metode pemeriksaan panjang
2.4 penggunaan fungsi snprintf
3. Kode
4. Penelitian Masa Depan
5. Kesimpulan
————————————————– ——

Halo~ Saya alias x90, seorang peneliti keamanan dari korea selatan.

Saya memutuskan untuk menjadi peneliti keamanan yang berspesialisasi dalam
audit kode sumber, jadi, saya memulai penelitian saya mulai hari ini.
Pada 17 Desember ~ 2022, saya akan mencoba mengatasi rintangan untuk
penelitian sky high road untuk menunjukkan bug keamanan.
Setidaknya, lebih merusak atau memahami bug pron dan
bug keamanan. Terima kasih banyak untuk semua pembaca :-).

1. Kode Tidak Aman

1.1 strcpy, sprintf, snprintf Contoh Kode Tidak Aman

strcpy() dan get() mudah rentan untuk berbasis stack
buffer meluap. Peretas dan pemrogram menggunakan sprintf dan
fungsi snprintf untuk pemrograman C. Tapi terkadang sprintf bisa
rentan terhadap salinan string, dan itu terjadi sebagai variasi strcpy
memengaruhi. Seperti yang Anda ketahui, panggilan fungsi di bawah ini sama.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// strcpy() buffer overflow.
int main(int argc, char **argv)
{
char buf[32];

strcpy(buf, argv[1]);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// sprintf() buffer overflow.

// buffer overflow oleh fungsi sprintf tanpa rutin pemeriksaan batas.
sprintf(buf, “buffer panjang rentan.%s%s”, argv[1], argv[2]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

|fungsi snprintf|

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
unsigned int buflen = atoi(argv[1]);
char buf yang tidak ditandatangani[buflen];
int j = 0;

j = snprintf(buf, buflen, “%sn”, argv[2]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

argumen kedua kode di atas adalah panjang salinan … tetapi seperti yang Anda lihat,
itu dikendalikan pengguna. dan ./program 150 “AAA….” maka itu buffer
meluap. juga panjang kode yang salah akan rentan terhadap kode yang rentan.

1.2 membalikkan rutinitas penyalinan string
Jika Anda ingin menemukan buffer overflow dalam format ‘%s’ di sprintf
(1) temukan panggilan sprintf (2) periksa cek tanpa batas atau rentan
(3) jika remaja dapat menemukan bug maka tulis PoC.

2. Panggilan fungsi sprintf yang aman

2.1 metode pemeriksaan terikat
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

char buf[128];
int cle = 26 + strlen(argv[1]) + strlen(argv[2]);

memset(buf, 0x0, 128);

/*
Cara pertama untuk mengamankan kode adalah dengan menambahkan pemeriksaan batas sebelum sprintf.
jika clen adalah tipe size_t(unsigned int) maka tidak perlu memeriksa ‘clen <0'.
*/
if((clen >= sizeof(buf) || clen < 0)
{
fprintf(stderr, “terjadi kesalahan!n”);
kembali (-1);
}

sprintf(buf, “buffer panjang rentan.%s%s”, argv[1], argv[2]);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.2 metode pemeriksaan format

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

char buf[128];

memset(buf, 0x0, 128);

/*
itu ditulis 26+50+50(-2)=124 byte menjadi 128 variabel buffer stack.
pengkodean yang aman. cara pengkodean kedua!
*/
sprintf(buf, “buffer panjang rentan.%50s%50s”, argv[1], argv[2]);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.3 metode pemeriksaan panjang

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
size_t buflen = snprintf(0, 0, “%s”, pesan);
char *buf = malloc(buflen) + 1;

memset(buf, 0x0, sizeof(buflen) + 1);

jika (buf)
{
sprintf(buf, “%s”, pesan);

buf[buflen] = ‘x00’;
//kode disini…
}
~~~~~~~~~~~~~~~~~~~~~~~~

2.4 penggunaan fungsi snprintf

fungsi snprintf memberi kita panjang check-copy string ke dest char *.
banyak peneliti menggunakan snprintf dan sprintf… efeknya sama apa bagusnya
salah satu.

~~~~~~~~~~~~~~~~~~~~~~~~
char buf[32];

// hanya buf sizeof length char * copy! (kode yang sangat sederhana)
snprintf(buf, ukuran(buf), “%s”, argv[1]);
~~~~~~~~~~~~~~~~~~~~~~~~

3. Kode

Saya membuat kode check-sc.c untuk program pencarian kode snprintf yang rentan.

~~~~~~~~~~~~~~~~~~~~~~~~~~

Kode Semu #1:
/*
* (1) abuf = readlinea()
* (2) temukan “sprintf(“
* (3) if((strstr(abuf, “, “) + 2) != ‘[0~9]’) ||
* ((strstr(abuf, “,”) + 1) != ‘ ‘) &&
*strstr(abuf, “,” + 1) == ‘[0~9]’)) kemudian
*/ (4) cetak kode lemah ditemukan.

~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~
// cek-sc.c

C #2:

#sertakan

/*

[[email protected]]-[~/check-sc]
>>> ./check-sc testcase.c.txt 15
1:
2: // argv1 == panjang vuln
3: // argv2 == muatan melimpah
4: int main(int argc, char *argv[]])
5: {
6:
7: char buf[32];
8: int lena yang tidak ditandatangani = 0;
9:
10: snprintf(buf, 32, “%sn”, argv[2]);
11: snprintf(buf,lena, “%sn”, argv[1]])
kode lemah ditemukan!
12: snprintf(buf, sizeof(buf)-1, “%sn”, argv[2]);
13: snprintf(buf, atoi(argv[1]), “%sn”, argv[2]);
kode lemah ditemukan!
14:
15: }
[[email protected]]-[~/check-sc]
>>>

*/
int klen;
int stop_pr;

char *readlinea(char *asal)
{
int saya = 0;
char *buf;

buf = malloc(128);

memset(buf, 0x0, ukuran(buf));

untuk(i = 0; i < 128; i++)
{
jika (asal[i] == ‘n’)
merusak;

buf[i] = asal[i];
}

klen = strlen(buf);

jika (buf[i] == ‘n’)
stop_pr = 1;

kembali (buf);
}

int lookup_codesnip(char *asal)
{
if(strstr(asal, “snprintf(“) != NULL){
// printf(“snprintf ditemukan!!n”);
kembali(1);
}

kembali (0);
}

char *token_test(char *asal)
{
char * ptr = strstr (asal, “,”);
char *ptr1 = strstr(asal, “,”);
char *ascii = “0123456789”;
int saya = 0;

ptr + = 2;
ptr1 += 1;

untuk(i = 0; i < ukuran(ascii); i++)
{
jika (ptr[0] == ascii[i] || ptr1[0] == ascii[i])
kembali(1);
}

kembali 0;
}

int token_test2(char *asal)
{
jika(strstr(asal, “ukuran(“) != NULL)
{
kembali(1);
}

kembali (0);
}

int main(int argc, char *argv[])
{
FILE *fp;
karakter * hal;
char *asal_pp;
karakter * ptr;
int saya = 0;
int lena = 0;
char *ptr1 = NULL;
int tret = 0, tret2 = 0;
unsigned int want_lc = atoi(argv[2]);

// x90:: jika Anda ingin mengetahui jumlah baris, maka perintah di bawah ini …
// $lc -c [source code filename]

if(wanted_lc <= 0 || want_lc >= 10000)
{
fprintf(stderr, “kesalahan malloc’d() menjadi gagaln”);
kembali (-1);
}

pp = malloc(128*wanted_lc);

asal_pp = hal;

fp = fopen(argv[1], “R”);

ketakutan(hal, 128, 10000, fp);

ptr = readlinea (hal);
printf(“1: %sn”, ptr);

untuk(i = 1; i < want_lc; i++)
{
pp = pp + klen + 1;
ptr = readlinea (hal);
jika(stop_pr != 1)
{
printf(“%d: %sn”, i+1, ptr);
}

if(lookup_codesnip(ptr) == 1)
{
tret = token_test (ptr);
tret2 = token_test2 (ptr);

jika(tret == 0 && tret2 == 0)
{
printf(“Kode lemah ditemukan!n”);
}
}
}

}

~~~~~~~~~~~~~~~~~~~~~~~~~~

4. Penelitian Masa Depan

Banyak fungsi C dan php lainnya rentan terhadap audit kode sumber
di Otomatis. Dan jika Kami membuat auditor yang baik maka mungkin kami bisa
menemukan beberapa bug keamanan zeroday. Otomatisasi itu penting dalam
penelitian masa depan. Jika Anda punya ide bagus, kirimkan saya email.
Selamat datang! ide-ide Anda.

5. Kesimpulan

Secure Coding sangat penting bagi peneliti untuk mempelajari banyak hal yang rentan
contoh kode. Saya menambahkan kode sumber program check-sc.c untuk tujuan tersebut
yang mencari buffer overflow fungsi snprintf.

Saya menunjukkan kepada pemuda tentang dua sprintf dan snprintf yang rentan
contoh dalam artikel ini. Terima kasih.

Retas planet ini!

Salam peneliti semua.

Pos terkait

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.