<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://tecatech.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://tecatech.github.io/" rel="alternate" type="text/html" /><updated>2025-07-23T20:00:41+00:00</updated><id>https://tecatech.github.io/feed.xml</id><title type="html">Tecatech</title><subtitle>MEPhI IS &apos;42</subtitle><entry><title type="html">Разбор про ret2libc и ASLR</title><link href="https://tecatech.github.io/pwn-ret2libc-aslr/" rel="alternate" type="text/html" title="Разбор про ret2libc и ASLR" /><published>2022-03-04T00:00:00+00:00</published><updated>2022-03-04T00:00:00+00:00</updated><id>https://tecatech.github.io/pwn-ret2libc-aslr</id><content type="html" xml:base="https://tecatech.github.io/pwn-ret2libc-aslr/"><![CDATA[<p>В этой статье мы разберем пример эксплуатации переполнения буфера на стеке посредством составления ROP-цепочки. Данная задача была опубликована в сообществе <a href="https://pwn.spbctf.ru/tasks">SPbCTF</a> — в рамках разбора, посвященного атакам типа ret2libc и методам обхода ASLR.</p>

<p><img src="/images/pwn-ret2libc-aslr/1.png" alt="_config.yml" /></p>

<p>Вначале отключим рандомизацию адресного пространства в текущей операционной системе:</p>

<p><img src="/images/pwn-ret2libc-aslr/2.png" alt="_config.yml" /></p>

<p>Загрузим исполняемый файл в IDA Pro и изучим листинг функции <code class="language-plaintext highlighter-rouge">main</code>:</p>

<p><img src="/images/pwn-ret2libc-aslr/3.png" alt="_config.yml" /></p>

<p>Таким образом, исходный код программы содержит ряд уязвимостей:</p>

<ul>
  <li>функция форматированного вывода <code class="language-plaintext highlighter-rouge">printf</code> используется без спецификаторов формата, то есть имеется уязвимость форматной строки;</li>
  <li>для считывания данных из стандартного ввода применяется функция <code class="language-plaintext highlighter-rouge">gets</code>, которая не позволяет установить ограничение на размер считываемой строки, то есть имеется уязвимость переполнения буфера на стеке.</li>
</ul>

<p>Отобразим кадр стека функции <code class="language-plaintext highlighter-rouge">main</code> в IDA Pro:</p>

<p><img src="/images/pwn-ret2libc-aslr/4.png" alt="_config.yml" /></p>

<p>Теперь запустим исполняемый файл и прочитаем значение из стека с помощью функции <code class="language-plaintext highlighter-rouge">printf</code>:</p>

<p><img src="/images/pwn-ret2libc-aslr/5.png" alt="_config.yml" /></p>

<p>Для проведения атаки ret2libc необходимо получить адрес какой-либо функции из библиотеки libc:</p>

<p><img src="/images/pwn-ret2libc-aslr/6.png" alt="_config.yml" /></p>

<p>Откроем ассемблерный листинг функции <code class="language-plaintext highlighter-rouge">main</code> в отладчике gdb:</p>

<p><img src="/images/pwn-ret2libc-aslr/7.png" alt="_config.yml" /></p>

<p>Запустим программу в отладчике для нахождения требуемого адреса:</p>

<p><img src="/images/pwn-ret2libc-aslr/8.png" alt="_config.yml" /></p>

<p>В качестве седьмого параметра на стеке используется адрес, указывающий на инструкцию <code class="language-plaintext highlighter-rouge">xor r8d, r8d</code> функции <code class="language-plaintext highlighter-rouge">__GI__IO_setvbuf</code>:</p>

<p><img src="/images/pwn-ret2libc-aslr/9.png" alt="_config.yml" /></p>

<p>Загрузим файл динамической библиотеки в IDA Pro и убедимся в корректности этого адреса памяти:</p>

<p><img src="/images/pwn-ret2libc-aslr/10.png" alt="_config.yml" /></p>

<p>Создадим первую версию эксплойта и вычислим базовый адрес libc через уязвимость форматной строки:</p>

<p><img src="/images/pwn-ret2libc-aslr/11.png" alt="_config.yml" /></p>

<p><img src="/images/pwn-ret2libc-aslr/12.png" alt="_config.yml" /></p>

<p>Таким образом, полезная нагрузка имеет следующую структуру:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">128</code> байтов «‎мусора» (заполнение буфера <code class="language-plaintext highlighter-rouge">format</code>)</li>
  <li><code class="language-plaintext highlighter-rouge">8</code> байтов «‎мусора» (перезапись значения регистра <code class="language-plaintext highlighter-rouge">rbp</code>)</li>
  <li>адрес инструкции <code class="language-plaintext highlighter-rouge">ret</code> (выравнивание стека)</li>
  <li>адрес гаджета <code class="language-plaintext highlighter-rouge">pop rdi; ret</code> (вызов функции <code class="language-plaintext highlighter-rouge">system</code> в cdecl)</li>
  <li>адрес строки <code class="language-plaintext highlighter-rouge">/bin/sh</code> (передача аргумента в функцию <code class="language-plaintext highlighter-rouge">system</code>)</li>
  <li>адрес функции <code class="language-plaintext highlighter-rouge">system</code> (запуск оболочки)</li>
</ul>

<p>С помощью консольных утилит получим адреса гаджетов и строки <code class="language-plaintext highlighter-rouge">/bin/sh</code>:</p>

<p><img src="/images/pwn-ret2libc-aslr/13.png" alt="_config.yml" /></p>

<p>Имеем аналогичный результат при использовании IDA Pro:</p>

<p><img src="/images/pwn-ret2libc-aslr/14.png" alt="_config.yml" /></p>

<p><img src="/images/pwn-ret2libc-aslr/15.png" alt="_config.yml" /></p>

<p><img src="/images/pwn-ret2libc-aslr/16.png" alt="_config.yml" /></p>

<p>Затем найдем адрес функции <code class="language-plaintext highlighter-rouge">system</code> в файле динамической библиотеки:</p>

<p><img src="/images/pwn-ret2libc-aslr/17.png" alt="_config.yml" /></p>

<p>Итак, соберем вместе все этапы эксплуатации уязвимости:</p>

<p><img src="/images/pwn-ret2libc-aslr/18.png" alt="_config.yml" /></p>

<p>Запустим эксплойт и получим shell на удаленной машине:</p>

<p><img src="/images/pwn-ret2libc-aslr/19.png" alt="_config.yml" /></p>

<p>Полный код эксплойта доступен на <a href="https://github.com/Tecatech/cyber-security-training/blob/main/Binary%20Exploitation/SPbCTF/cleaker/cleaker_exploit.py">GitHub</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[В этой статье мы разберем пример эксплуатации переполнения буфера на стеке посредством составления ROP-цепочки. Данная задача была опубликована в сообществе SPbCTF — в рамках разбора, посвященного атакам типа ret2libc и методам обхода ASLR.]]></summary></entry></feed>