Ghost in the Shell CTF 2014 (Ad Subtract)

Решения

http://tasteless.se/2014/01/gits-2014-ad-substract-pwn-adventure-75/ (ccmndhd и nsr) Назад к списку заданий

Задание (Pwn Adventure 2)

Question 22 - Ad Subtract
Points: 75
Challenge available from within PwnAdventure2.

Подробное описание

Задание выдает персонаж Old McDonald на карте Town of Adventure.
1.png

Нам надо избавиться от рекламы отображаемой внизу меню игры (выделено красным). Меню игры отображается всякий раз, когда игрок, находясь в игре, нажимает Esc.

2.png

Поискав внутри клиента игры "\pwnadventure2_Data\Managed\GameLogic.dll" (для просмотра .NET-файлов я использовал Simple Assembly Explorer), обнаружим класс AdDownload. Самая интересная функция в нем - MoveNext.

public bool MoveNext()
{
   uint num = (uint)this.$PC;
   this.$PC = -1;
   switch (num)
   {
       case 0u:
       {
           this.<ad>__0 = Random.Range(0, this.$this.adCount);
           this.<url>__1 = this.$this.baseUrl + this.<ad>__0.ToString() + ".png";
           this.<www>__2 = new WWW(this.<url>__1);
           this.$current = this.<www>__2;
           if (!this.$disposing)
           {
               this.$PC = 1;
           }
           return true;
       }
       case 1u:
       {
           this.$this.texture = this.<www>__2.texture;
           this.$PC = -1;
           break;
       }
   }
   return false;
}

Что делает функция? Видимо, она вызывается два раза.
Первый проход (переменная this.$PC = 0):

  1. Функция создает строку-адрес формата this.$this.baseUrl + случайное число (this.<ad>__0) + ".png". Строка задает адрес, откуда клиент должен скачать png-картинку.
  2. Строка-адрес инициализирует переменную класса WWW (находится в библиотеке UnityEngine.dll)
  3. Обновляем значение переменной this.$PC = 1

Второй проход (переменная this.$PC = 1):

  1. Добавляем некую текстуру. Т.е. на уже скачанную картинку накладывается какая-то текстура (скорее всего, это и есть наш ключ)

Выяснить адрес сайта, куда обращается клиент игры за картинкой-рекламой просто. Запускаем перехватчик пакетов Wireshark (ставим фильтр на HTTP-протокол), заходим в игру, попадаем в меню. И в этот момент Wireshark ловит нужный нам GET-пакет.

3.png

Итак, адрес узнали. Это dontpanicsoftware.com. Очевидный алгоритм складывается такой:
подсунуть клиенту игры "пустую" картинку, тогда мы увидим, что за текстура используется в итоге.

Подготовительные шаги:

  • Через файл etc/hosts (под Windows лежит здесь \System32\drivers\etc) замыкаем все обращения к dontpanicsoftware.com на себя: "127.0.0.1 dontpanicsoftware.com"
  • Создаем "пустую" картинку. Идем на сайт http://www.1x1px.me и скачиваем однопиксельный 1х1 transparent PNG-файл (я сделал на основе черного цвета) black.png.
  • Пишем простой web-сервер http.py на Питоне. Его задача проще некуда – на любые запросы возвращать файл black.png.
#!/usr/bin/env python
import SimpleHTTPServer
import SocketServer
 
PORT = 80
 
class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        key = open("black.png", "rb").read()
        self.request.send(key)
 
httpd = SocketServer.TCPServer(("", PORT), Handler)
 
print "serving at port", PORT
httpd.serve_forever()
  • Запускаем наш web-сервер: python http.py

Результат:

  • Запускаем игру, логинимся, жмем Esc, чтобы попасть в меню игры
  • Смотрим на ключ
4.png

Флаг:
AdBlockedHaveASillyMooseAnyway

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License