<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>만두만두</title>
    <link>https://chp747.tistory.com/</link>
    <description>만두 포스팅용 블로그입니다</description>
    <language>ko</language>
    <pubDate>Sat, 23 May 2026 11:17:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ch4rli3kop</managingEditor>
    <image>
      <title>만두만두</title>
      <url>https://tistory1.daumcdn.net/tistory/2808969/attach/a81231e2d4df43e7babffb3ce1606bf8</url>
      <link>https://chp747.tistory.com</link>
    </image>
    <item>
      <title>zsh plugin 오류</title>
      <link>https://chp747.tistory.com/426</link>
      <description>&lt;h1 style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot;&gt;&lt;span&gt;zsh plugin 오류&lt;/span&gt;&lt;/h1&gt;
&lt;p style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;zsh 설치하다가 다음과 같은 오류가 발생했는데, 해결방법에 대한 한국어 자료가 없는 것 같아서 정리한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f7f6f3; color: #37352f; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;ch4rli3kop&amp;nbsp;in&amp;nbsp;[~]&amp;nbsp;14:20:45 &amp;rsaquo;&amp;nbsp;zsh
[oh-my-zsh] plugin&amp;nbsp;'git,'&amp;nbsp;not found
[oh-my-zsh] plugin&amp;nbsp;'zsh-autosuggestions,'&amp;nbsp;not found
[oh-my-zsh] plugin&amp;nbsp;'zsh-syntax-highlighting,'&amp;nbsp;not found&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음과 같이 &lt;/span&gt;&lt;span&gt;.zshrc&lt;/span&gt;&lt;span&gt; 파일에서 plugins이 &lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;를 사용해서 구분되면 위와 같은 오류가 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot; style=&quot;background-color: #f7f6f3; color: #37352f; text-align: left;&quot;&gt;&lt;code&gt;# ~/.zshrc
plugins=(git, zsh-autosuggestions, autojump)&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #37352f; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;밑에처럼 수정하면 해결&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #f7f6f3; color: #37352f; text-align: left;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# ~/.zshrc
plugins=(
	git
	zsh-autosuggestions
	autojump
)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Information*/Troubleshoot</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/426</guid>
      <comments>https://chp747.tistory.com/426#entry426comment</comments>
      <pubDate>Wed, 26 Apr 2023 14:49:41 +0900</pubDate>
    </item>
    <item>
      <title>[python] membership 관련</title>
      <link>https://chp747.tistory.com/425</link>
      <description>&lt;h1&gt;&lt;span&gt;[python] membership 관련&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;특정 타입들의 객체들만 처리할 일이 있었는데, 다른 사람들의 코드를 볼 때 내 경험 상 &lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;를 사용해서 tuple로 처리하거나, &lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span&gt;를 사용하여 집합으로 처리하는 두 가지 방법들을 사용했었다. &lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span&gt; 리스트도 가끔 있기는 했는데, 잘 사용하지 않았던 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;각각 어떤 장점이 있는지 궁금해서 찾아보았다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://towardsdatascience.com/python-tricks-check-multiple-variables-against-single-value-18a4d98d79f4&quot;&gt;https://towardsdatascience.com/python-tricks-check-multiple-variables-against-single-value-18a4d98d79f4&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1. Tuple을 사용하는 경우&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;if&amp;nbsp;a_type&amp;nbsp;in&amp;nbsp;(a_type,&amp;nbsp;b_type,&amp;nbsp;c_type):
&amp;nbsp;# do something&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;메모리 사용량이 셋 중에 가장 적다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2. Set을 사용하는 경우&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;if&amp;nbsp;a_type&amp;nbsp;in&amp;nbsp;{a_type,&amp;nbsp;b_type,&amp;nbsp;c_type}:
&amp;nbsp;# do something&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;상수 값들로 이루어진 집합이라면, 계산 복잡성이 가장 작다고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3. List를 사용하는 경우&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;리스트가 가장 비효율적이다. 쓰지 맙시다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming$</category>
      <category>python</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/425</guid>
      <comments>https://chp747.tistory.com/425#entry425comment</comments>
      <pubDate>Wed, 2 Nov 2022 22:09:23 +0900</pubDate>
    </item>
    <item>
      <title>python exception 처리</title>
      <link>https://chp747.tistory.com/424</link>
      <description>&lt;h1&gt;&lt;span&gt;python exception 처리&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제까지 python 코드를 근본없이 작성하다가, 요즘 프로젝트를 하면서 파이썬 개발 디자인 모델이나 pythonic 하게 코드를 작성하는 팁을 찾아보고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;요 글은 python의 exception을 어떻게 하면 좋게 처리할 수 있을까에 대해 나름 개인적으로 고민도 하고 서칭하면서 찾아본 내용을 간단하게 정리한 글이다. (반박시 그대의 말이 다 맞음)&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;case 1 : exception inheritance&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;exceptions.py&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class&amp;nbsp;dummyclass(Exception):&amp;nbsp;
&amp;nbsp;pass
​
class&amp;nbsp;testException(dummyclass):
&amp;nbsp;def&amp;nbsp;__str__(self)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp; &amp;nbsp;return&amp;nbsp;f'testException'
​
class&amp;nbsp;testException2(testException):
&amp;nbsp;def&amp;nbsp;__str__(self)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp; &amp;nbsp;return&amp;nbsp;f'testException2'
​
&amp;nbsp;def&amp;nbsp;__repr__(self)&amp;nbsp;-&amp;gt;&amp;nbsp;str:
&amp;nbsp; &amp;nbsp;return&amp;nbsp;f'zzz'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;main.py&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from&amp;nbsp;.exceptions&amp;nbsp;import&amp;nbsp;testException,&amp;nbsp;testException2
​
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;'__main__':
&amp;nbsp;try:
&amp;nbsp; &amp;nbsp;raise&amp;nbsp;testException2
&amp;nbsp;except&amp;nbsp;testException:
&amp;nbsp; &amp;nbsp;print('zzz')
# zzz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;상속관계에 있을 때, 하위 exception을 상위 exception으로 catch 할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;case 2 : exception 클래스 비교&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from&amp;nbsp;.exceptions&amp;nbsp;import&amp;nbsp;testException,&amp;nbsp;testException2
​
if&amp;nbsp;__name__&amp;nbsp;==&amp;nbsp;'__main__':
&amp;nbsp;try:
&amp;nbsp; &amp;nbsp;raise&amp;nbsp;testException2
&amp;nbsp;except&amp;nbsp;testException&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp; &amp;nbsp;if&amp;nbsp;e.__class__&amp;nbsp;is&amp;nbsp;testException2:
&amp;nbsp; &amp;nbsp; &amp;nbsp;print('zzz')
# zzz&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;__class__&lt;/span&gt;&lt;span&gt; property를 사용하여 클래스 타입 비교를 할 수 있음. 상위 exception으로 catch 한 뒤에 하위 exception으로 비교.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;case 3 : exception decorator&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;함수에 대해 exception 처리를 위해서 decorator를 사용하여 코드를 간결하게 할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;python의 decorator는 함수의 실행 전, 실행 후 작업을 반복적으로 처리할 때 유용하게 사용할 수 있는 기능임. 아래 경우는 try-exception을 직접적으로 모든 함수에 적용하지 않고 decorator를 통해 간결하게 처리함.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;단순 raise&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;exception이 발생했을 때, 단순히 raise 시키기 위한 decorator 함수&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;#!/usr/bin/python3
​
def&amp;nbsp;testdecorate(function):
def&amp;nbsp;wrapper(self,&amp;nbsp;*args,&amp;nbsp;**kwargs):
&amp;nbsp; &amp;nbsp;try:
&amp;nbsp; &amp;nbsp; &amp;nbsp;return&amp;nbsp;function(self,&amp;nbsp;*args,&amp;nbsp;**kwargs)
&amp;nbsp; &amp;nbsp;except&amp;nbsp;exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp; &amp;nbsp; &amp;nbsp;raise&amp;nbsp;e
&amp;nbsp;return&amp;nbsp;wrapper
​
class&amp;nbsp;TestClass:
&amp;nbsp;
&amp;nbsp;@testdecorate
&amp;nbsp;def&amp;nbsp;testFunction(self):
&amp;nbsp; &amp;nbsp;# do something&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;혹은 해당 클래스에 대한 사용자 정의 exception을 사용할 수도 있음.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from&amp;nbsp;.exceptions&amp;nbsp;import&amp;nbsp;testException
​
def&amp;nbsp;testdecorate(function):
def&amp;nbsp;wrapper(self,&amp;nbsp;*args,&amp;nbsp;**kwargs):
&amp;nbsp; &amp;nbsp;try:
&amp;nbsp; &amp;nbsp; &amp;nbsp;return&amp;nbsp;function(self,&amp;nbsp;*args,&amp;nbsp;**kwargs)
&amp;nbsp; &amp;nbsp;except&amp;nbsp;exception&amp;nbsp;as&amp;nbsp;e:
&amp;nbsp; &amp;nbsp; &amp;nbsp;raise&amp;nbsp;testException
&amp;nbsp;return&amp;nbsp;wrapper
​
class&amp;nbsp;TestClass:
&amp;nbsp;
&amp;nbsp;@testdecorate
&amp;nbsp;def&amp;nbsp;testFunction(self):
&amp;nbsp; &amp;nbsp;# do something&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;사용자 정의 exception raise&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;각 함수에 대해서 사용자 정의 exception을 인자로 줘서 raise 하고 싶을 때도 있을 수 있음. 이 경우 decorator에 exception을 인자로 넘겨줘야 해서 위와 조금 다르게 decorator를 작성해야 함.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from&amp;nbsp;.exceptions&amp;nbsp;import&amp;nbsp;testException
​
def&amp;nbsp;raiseExceptionDecorator(exception):
&amp;nbsp; &amp;nbsp;def&amp;nbsp;decorator(function):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;def&amp;nbsp;wrapper(self,&amp;nbsp;*args,&amp;nbsp;**kwargs):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return&amp;nbsp;function(self,&amp;nbsp;*args,&amp;nbsp;**kwargs)
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;except&amp;nbsp;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;raise&amp;nbsp;exception
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return&amp;nbsp;wrapper
&amp;nbsp; &amp;nbsp;return&amp;nbsp;decorator
&amp;nbsp;
​
class&amp;nbsp;TestClass:
&amp;nbsp;
&amp;nbsp;@raiseExceptionDecorator(testException)
&amp;nbsp;def&amp;nbsp;testFunction(self):
&amp;nbsp; &amp;nbsp;# do something&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;인자로 사용자 정의 exception을 전달하면 해당 exception을 발생시킴.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;exception handler 전달&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;exception에 대해서 따로 handler를 등록해서 처리하고 싶다면, 다음과 같이 사용할 수 있음. class 마다 method에서 발생한 exception을 처리하고자 하는 경우도 있을 수 있기 때문에, 다음과 같이 exception과 handler를 decorator의 인자로 전달하여 사용하면 됨.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;from&amp;nbsp;.exceptions&amp;nbsp;import&amp;nbsp;testException
​
def&amp;nbsp;raiseExceptionDecorator(exception,&amp;nbsp;handler):
&amp;nbsp; &amp;nbsp;def&amp;nbsp;decorator(function):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;def&amp;nbsp;wrapper(self,&amp;nbsp;*args,&amp;nbsp;**kwargs):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return&amp;nbsp;function(self,&amp;nbsp;*args,&amp;nbsp;**kwargs)
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;except&amp;nbsp;:
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler(exception)
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return&amp;nbsp;wrapper
&amp;nbsp; &amp;nbsp;return&amp;nbsp;decorator
&amp;nbsp;
class&amp;nbsp;TestClass:
&amp;nbsp;
&amp;nbsp;def&amp;nbsp;exception_handler(self,&amp;nbsp;e):
&amp;nbsp; &amp;nbsp;print('eeee')
&amp;nbsp;
&amp;nbsp;@raiseExceptionDecorator(testException,&amp;nbsp;exception_handler)
&amp;nbsp;def&amp;nbsp;testFunction(self):
&amp;nbsp; &amp;nbsp;# do something&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Conclusion&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #37352f;&quot;&gt;exception handler와 exception 코드는 한 곳에 몰아넣는 것이 좋고 (ex. exceptions.py), 프로젝트 내의 모듈마다 작성하는게 좋을 듯하다. 데코레이터의 경우 위에서 단순히 raise를 하는 패턴, 인자를 전달하는 패턴 등 몇 가지를 나열했는데, 저 중 한가지 방법으로 통일해서 exception 처리를 하는게 깔끔할 것이다. 또한, exception을 어떻게 하느냐뿐만 아니라 어디서 하느냐도 중요한데, 이 부분은 추후에 파이썬 디자인 모델을 정리하면서 정리해야겠다. &lt;/span&gt;&lt;/p&gt;</description>
      <category>Programming$</category>
      <category>Design Pattern</category>
      <category>design structure</category>
      <category>exception</category>
      <category>python</category>
      <category>익셉션</category>
      <category>파이썬</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/424</guid>
      <comments>https://chp747.tistory.com/424#entry424comment</comments>
      <pubDate>Fri, 21 Oct 2022 16:52:04 +0900</pubDate>
    </item>
    <item>
      <title>Trouble shoot with installing gef</title>
      <link>https://chp747.tistory.com/423</link>
      <description>&lt;h1&gt;&lt;span&gt;Trouble shoot with installing gef&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;I installed &lt;/span&gt;&lt;span&gt;gef&lt;/span&gt;&lt;span&gt; in my docker container, and I found this error.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;➜ ~ gdb
GNU gdb (Ubuntu&amp;nbsp;12.0.90-0ubuntu1)&amp;nbsp;12.0.90
Copyright (C)&amp;nbsp;2022&amp;nbsp;Free Software Foundation, Inc.
License GPLv3+: GNU GPL version&amp;nbsp;3&amp;nbsp;or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type&amp;nbsp;&quot;show copying&quot;&amp;nbsp;and&amp;nbsp;&quot;show warranty&quot;&amp;nbsp;for&amp;nbsp;details.
This GDB was configured as&amp;nbsp;&quot;x86_64-linux-gnu&quot;.
Type&amp;nbsp;&quot;show configuration&quot;&amp;nbsp;for&amp;nbsp;configuration details.
For bug reporting instructions, please see:
&amp;lt;https://www.gnu.org/software/gdb/bugs/&amp;gt;.
Find the GDB manual and other documentation resources online at:
&amp;nbsp; &amp;lt;http://www.gnu.org/software/gdb/documentation/&amp;gt;.
​
For help, type&amp;nbsp;&quot;help&quot;.
Type&amp;nbsp;&quot;apropos word&quot;&amp;nbsp;to search&amp;nbsp;for&amp;nbsp;commands related to&amp;nbsp;&quot;word&quot;.
Traceback (most recent call last):
File&amp;nbsp;&quot;/home/ch4rli3kop/.gdbinit-gef.py&quot;, line&amp;nbsp;10878,&amp;nbsp;in&amp;nbsp;&amp;lt;module&amp;gt;
&amp;nbsp; reset()
File&amp;nbsp;&quot;/home/ch4rli3kop/.gdbinit-gef.py&quot;, line&amp;nbsp;190,&amp;nbsp;in&amp;nbsp;reset
&amp;nbsp; gef.setup()
File&amp;nbsp;&quot;/home/ch4rli3kop/.gdbinit-gef.py&quot;, line&amp;nbsp;10809,&amp;nbsp;in&amp;nbsp;setup
&amp;nbsp; self.reinitialize_managers()
File&amp;nbsp;&quot;/home/ch4rli3kop/.gdbinit-gef.py&quot;, line&amp;nbsp;10804,&amp;nbsp;in&amp;nbsp;reinitialize_managers
&amp;nbsp; self.session&amp;nbsp;=&amp;nbsp;GefSessionManager()
File&amp;nbsp;&quot;/home/ch4rli3kop/.gdbinit-gef.py&quot;, line&amp;nbsp;10454,&amp;nbsp;in&amp;nbsp;__init__
&amp;nbsp; self.constants[constant]&amp;nbsp;=&amp;nbsp;which(constant)
File&amp;nbsp;&quot;/home/ch4rli3kop/.gdbinit-gef.py&quot;, line&amp;nbsp;1810,&amp;nbsp;in&amp;nbsp;which
&amp;nbsp; raise FileNotFoundError(f&quot;Missing file `{program}`&quot;)
FileNotFoundError: Missing file&amp;nbsp;`file`&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;I saw &lt;/span&gt;&lt;span&gt;gef/gef.py&lt;/span&gt;&lt;span&gt;, and I found the cause of the error.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class GefSessionManager(GefManager):
&amp;nbsp; &amp;nbsp;&quot;&quot;&quot;Class managing the runtime properties of GEF. &quot;&quot;&quot;
&amp;nbsp; def __init__(self)&amp;nbsp;-&amp;gt; None:
&amp;nbsp; &amp;nbsp; &amp;nbsp; ...
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for&amp;nbsp;constant&amp;nbsp;in&amp;nbsp;(&quot;python3&quot;,&amp;nbsp;&quot;readelf&quot;,&amp;nbsp;&quot;file&quot;,&amp;nbsp;&quot;ps&quot;):
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; self.constants[constant]&amp;nbsp;=&amp;nbsp;which(constant)
&amp;nbsp; &amp;nbsp; &amp;nbsp; return&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;The error occurred because there is no &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; command in my container.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Solutions&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;In my case, the &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt; command didn't exist. We can resolve this error by installing that commands (&lt;/span&gt;&lt;span&gt;python3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;readelf&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ps&lt;/span&gt;&lt;span&gt;). &lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;$ sudo&amp;nbsp;apt install file&amp;nbsp;-y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Information*/Troubleshoot</category>
      <category>get error</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/423</guid>
      <comments>https://chp747.tistory.com/423#entry423comment</comments>
      <pubDate>Mon, 29 Aug 2022 18:35:17 +0900</pubDate>
    </item>
    <item>
      <title>How to install binary ninja python API (in mac m1)</title>
      <link>https://chp747.tistory.com/422</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;How to install binary ninja python API (in mac m1)&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Trouble&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I have the payment of the binary ninja personal edition a month ago. But, when I use the python API of the binary ninja, there is some problem like the below.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ch4rli3kop in [~/code_snippets/BinaryNinja/binaryninja-api] 15:29:09 &amp;rsaquo; python3
Python 3.8.9 (default, Oct 26 2021, 07:25:53)
[Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt; from binaryninja import *
Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
ModuleNotFoundError: No module named 'binaryninja'&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Solution&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;By running script &lt;code&gt;/Applications/Binary Ninja.app/Contents/Resources/scripts/install_api.py&lt;/code&gt;, we can install python API easily.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;ch4rli3kop in [/Applications/Binary Ninja.app/Contents/Resources/scripts] 18:01:18 &amp;rsaquo; ls
install_api.py
ch4rli3kop in [/Applications/Binary Ninja.app/Contents/Resources/scripts] 17:58:12 &amp;rsaquo; python3 install_api.py
Binary Ninja API already in the path&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If the python path of the binary ninja is successfully added to the system python package path, we can import the binary ninja API on our python console.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ch4rli3kop in [/Applications/Binary Ninja.app/Contents/Resources/scripts] 17:58:16 &amp;rsaquo; python3
Python 3.8.9 (default, Oct 26 2021, 07:25:53)
[Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt; from binaryninja import *
&amp;gt;&amp;gt;&amp;gt; exit()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[+]&lt;br /&gt;But... I found personal user doesn't use headless mode..!&lt;br /&gt;personal license user can use python-api only in the python console of binary ninja... :(&lt;/p&gt;</description>
      <category>Information*/Troubleshoot</category>
      <category>binary ninja</category>
      <category>binary ninja python api</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/422</guid>
      <comments>https://chp747.tistory.com/422#entry422comment</comments>
      <pubDate>Thu, 25 Aug 2022 18:35:12 +0900</pubDate>
    </item>
    <item>
      <title>WTF(WHAT THE FUZZ) TUTORIAL</title>
      <link>https://chp747.tistory.com/419</link>
      <description>&lt;h1&gt;&lt;span&gt;WTF(WHAT THE FUZZ) TUTORIAL&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;wtf(What The Fuzz) fuzzer가 실제로 취약점을 잘 찾을 수 있는지 궁금해서 테스트 프로그램으로 퍼징을 돌려보려고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Target Program&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;퍼징할 대상은 대충 다음과 같이 만들었다. &lt;/span&gt;&lt;span&gt;fgets&lt;/span&gt;&lt;span&gt;로 파일 데이터를 &lt;/span&gt;&lt;span&gt;buf&lt;/span&gt;&lt;span&gt;에 저장한 상태에서 snapshot을 찍고, 퍼저에서 해당 &lt;/span&gt;&lt;span&gt;buf&lt;/span&gt;&lt;span&gt; 메모리에 mutation 된 데이터를 직접 memory write 함으로써, 퍼징을 수행할 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;컴파일해서 vm 내에 넣어주면 되는데, 중요한 점은 Debug가 아니라 Release로 빌드해야 한다는 점이다. 분석을 쉽게하기 위해서 코드 최적화도 꺼놨다. (Debug 모드로 빌드할 시, vcruntime140.dll 에서 크래시를 탐지해서 crash_detection 코드를 추가해야 함) 위 프로그램을 컴파일해서 vm 내에 넣어준다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;#define _CRT_SECURE_NO_WARNINGS
#include &amp;lt;stdio.h&amp;gt;
​
char buf[0x1000];
​
void fuzzme ( char* buf ) {
  char localbuf[0x200] = {0, };
  if (buf[0] == 'A')
    memcpy(localbuf, buf, strlen(buf)); // &amp;lt;- here is vuln
  else
    memcpy(localbuf, buf, 0x10);
 &amp;nbsp;
  printf(&quot;%s\n&quot;, localbuf);
}
​
int main(int argc, char* argv[]) {
​
  if (argc &amp;lt; 2) {
    fprintf(stderr, &quot;no input file\n&quot;);
    exit(-1);
  }
​
  FILE* f = fopen(argv[1], &quot;rb&quot;);
  fgets(buf, 0x1000, f);
  fuzzme(buf);
  return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Kernel Debugging &amp;amp; Snapshot&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 host에서는 kernel live debugging을 하면서 다음과 같이 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;kd&amp;gt; !gflag +ksl
Current NtGlobalFlag contents: 0x00040000
 &amp;nbsp;  ksl - Enable loading of kernel debugger symbols
kd&amp;gt; sxe ld test_wtf_harness.exe
kd&amp;gt; g&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;vm 내에서 다음과 같이 프로세스를 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;Microsoft Windows [Version 10.0.19044.1706]
(c) Microsoft Corporation. All rights reserved.
​
C:\Users\pch21\Desktop\Fuzz\test_wtf&amp;gt;.\test_wtf_harness.exe .\input.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;host 에서는 대충 심볼 추가하고 main 시점에서 브포를 건다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;kd&amp;gt; .sympath+ C:\Users\Charlie\Desktop\fuzzing\test_wtf_harness\x64\Release
Symbol search path is: srv*;C:\Users\Charlie\Desktop\fuzzing\test_wtf_harness\x64\Release
Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols;c:\users\charlie\desktop\fuzzing\test_wtf_harness\x64\Release
​
************* Path validation summary **************
Response &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time (ms) &amp;nbsp; &amp;nbsp; Location
Deferred &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; srv*
OK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\Users\Charlie\Desktop\fuzzing\test_wtf_harness\x64\Release
kd&amp;gt; bu test_wtf_harness!main
*** WARNING: Unable to verify checksum for test_wtf_harness.exe
kd&amp;gt; g
Breakpoint 0 hit
test_wtf_harness!main:
0033:00007ff6`f3271180 4889542410 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov &amp;nbsp; &amp;nbsp; qword ptr [rsp+10h], rdx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;main 코드를 살펴보면 다음과 같은데, 우선 wtf 를 사용하는데 중요한 점은 snapshot을 뜨는 것과 wtf backend breakpoint 지점을 결정해야 한다는 점이다. 이 예제의 경우 fuzzme 함수를 대상으로 퍼징을 수행할 것이기 때문에, 해당 함수 진입시점에서 snapshot을 뜰 것이며, 함수 종료 후 실행하는 명령어 주소를 breakpoint로 지정하여, 성공적으로 fuzzme 함수가 실행되었을 때 빠르게 종료하도록 퍼저를 작성할 것이다. fuzzme 함수와 main 함수의 주소는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;test_wtf_harness!fuzzme:
0033:00007ff6`f32710d0 48894c2408 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov &amp;nbsp; &amp;nbsp; qword ptr [rsp+8], rcx
0033:00007ff6`f32710d5 57 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; push &amp;nbsp;  rdi
0033:00007ff6`f32710d6 4881ec30020000 &amp;nbsp; &amp;nbsp; &amp;nbsp; sub &amp;nbsp; &amp;nbsp; rsp, 230h
​
...
​
​
test_wtf_harness!main:
0033:00007ff6`f3271180 4889542410 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov &amp;nbsp; &amp;nbsp; qword ptr [rsp+10h], rdx
0033:00007ff6`f3271185 894c2408 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mov &amp;nbsp; &amp;nbsp; dword ptr [rsp+8], ecx
0033:00007ff6`f3271189 4883ec38 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sub &amp;nbsp; &amp;nbsp; rsp, 38h
0033:00007ff6`f327118d 488d0d703e0000 &amp;nbsp; &amp;nbsp; lea &amp;nbsp; &amp;nbsp; rcx, 
...
0033:00007ff6`f32711fe 488d0d7b440000 &amp;nbsp; &amp;nbsp; lea &amp;nbsp; &amp;nbsp; rcx, [test_wtf_harness!buf{[0]} (7ff6f3275680)]
0033:00007ff6`f3271205 ff15851f0000 &amp;nbsp; &amp;nbsp; &amp;nbsp; call &amp;nbsp;  qword ptr [test_wtf_harness!__imp_fgets (7ff6f3273190)]
0033:00007ff6`f327120b 488d0d6e440000 &amp;nbsp; &amp;nbsp; lea &amp;nbsp; &amp;nbsp; rcx, [test_wtf_harness!buf{[0]} (7ff6f3275680)]
0033:00007ff6`f3271212 e8b9feffff &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; call &amp;nbsp;  test_wtf_harness!fuzzme (7ff6f32710d0)
0033:00007ff6`f3271217 33c0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xor &amp;nbsp; &amp;nbsp; eax, eax
0033:00007ff6`f3271219 4883c438 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; add &amp;nbsp; &amp;nbsp; rsp, 38h
0033:00007ff6`f327121d c3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret &amp;nbsp; &amp;nbsp; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;test_wtf_harness!fuzzme&lt;/span&gt;&lt;span&gt; 에 bp를 걸어 해당 지점에서 break를 한다. 레지스터 정보를 살펴보면 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;kd&amp;gt; bu test_wtf_harness!fuzzme
kd&amp;gt; g
​
...
​
kd&amp;gt; r
rax=00007ff6f3275680 rbx=0000025f3cbc30c0 rcx=00007ff6f3275680
rdx=0000000000000000 rsi=0000000000000000 rdi=0000025f3cbc6de0
rip=00007ff6f32710d0 rsp=000000da4e8ffd08 rbp=0000000000000000
 r8=000000da4e8ffb18 &amp;nbsp;r9=0000000000001000 r10=0000000000000000
r11=0000000000000246 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nv up ei pl nz na pe nc
cs=0033 &amp;nbsp;ss=002b &amp;nbsp;ds=002b &amp;nbsp;es=002b &amp;nbsp;fs=0053 &amp;nbsp;gs=002b
test_wtf_harness!fuzzme:
0033:00007ff6`f32710d0 48894c2408 &amp;nbsp; &amp;nbsp;  mov &amp;nbsp; &amp;nbsp; qword ptr [rsp+8],rcx ss:002b:000000da`4e8ffd10=0000025fffffffff&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 시점에서 bdump script를 이용하여 메모리 덤프를 수행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;kd&amp;gt; .scriptload D:\Tools\bdump-master\bdump.js
[bdump] Usage: !bdump &quot;C:\\path\\to\\dump&quot;
[bdump] Usage: !bdump_full &quot;C:\\path\\to\\dump&quot;
[bdump] Usage: !bdump_active_kernel &quot;C:\\path\\to\\dump&quot;
[bdump] This will create a dump directory and fill it with a memory and register files
[bdump] NOTE: you must include the quotes and escape the backslashes!
JavaScript script successfully loaded from 'D:\Tools\bdump-master\bdump.js'
​
​
kd&amp;gt; !bdump_full &quot;D:\\Tools\\bdump-master\\state_full&quot;
[bdump] creating dir...
[bdump] saving regs...
[bdump] register fixups...
[bdump] don't know how to get mxcsr_mask or fpop, setting to zero...
[bdump]
[bdump] don't know how to get avx registers, skipping...
[bdump]
[bdump] tr.base is not cannonical...
[bdump] old tr.base: 0x79f76000
[bdump] new tr.base: 0xfffff80579f76000
[bdump]
[bdump] rip and gs don't match kernel/user, swapping...
[bdump] rip: 0x7ff6f32710d0
[bdump] new gs.base: 0xda4e6a5000
[bdump] new kernel_gs_base: 0xfffff8057265f000
[bdump]
[bdump] non-zero IRQL in usermode, resetting to zero...
[bdump] saving mem, get a coffee or have a smoke, this will probably take around 10-15 minutes...
[bdump] Creating D:\Tools\bdump-master\state_full1\mem.dmp - Full kernel dump
[bdump] 0% written.
[bdump] 5% written. 42 sec remaining.
[bdump] 10% written. 41 sec remaining.
[bdump] 15% written. 37 sec remaining.
[bdump] 20% written. 37 sec remaining.
[bdump] 25% written. 34 sec remaining.
[bdump] 30% written. 31 sec remaining.
[bdump] 35% written. 28 sec remaining.
[bdump] 40% written. 27 sec remaining.
[bdump] 45% written. 24 sec remaining.
[bdump] 50% written. 21 sec remaining.
[bdump] 55% written. 20 sec remaining.
[bdump] 60% written. 16 sec remaining.
[bdump] 65% written. 9 sec remaining.
[bdump] 70% written. 7 sec remaining.
[bdump] 75% written. 6 sec remaining.
[bdump] 80% written. 10 sec remaining.
[bdump] 85% written. 6 sec remaining.
[bdump] 90% written. 4 sec remaining.
[bdump] 95% written. 2 sec remaining.
[bdump] Wrote 4.0 GB in 42 sec.
[bdump] The average transfer rate was 97.5 MB/s.
[bdump] Dump successfully written
[bdump] done!
@$bdump_full(&quot;D:\\Tools\\bdump-master\\state_full&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Write fuzzer code&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 fuzzer를 작성해야 하는데, &lt;/span&gt;&lt;span&gt;\src\wtf&lt;/span&gt;&lt;span&gt; 디렉토리에 &lt;/span&gt;&lt;span&gt;fuzzer_test_wtf.cpp&lt;/span&gt;&lt;span&gt; 이름으로 파일을 하나 생성한 뒤, 다음과 같이 코드를 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;#include &quot;backend.h&quot;
#include &quot;targets.h&quot;
#include &amp;lt;fmt/format.h&amp;gt;
#include &quot;crash_detection_umode.h&quot;
​
namespace fs = std::filesystem;
​
namespace Test_wtf {
​
constexpr bool LoggingOn = false;
​
template &amp;lt;typename... Args_t&amp;gt;
void DebugPrint(const char *Format, const Args_t &amp;amp;...args) {
 &amp;nbsp;if constexpr (LoggingOn) {
 &amp;nbsp; &amp;nbsp;fmt::print(&quot;Test WTF : &quot;);
 &amp;nbsp; &amp;nbsp;fmt::print(fmt::runtime(Format), args...);
  }
}
​
bool InsertTestcase(const uint8_t *Buffer, const size_t BufferSize) {
 &amp;nbsp;
 &amp;nbsp;const Gva_t buf = Gva_t(g_Backend-&amp;gt;Rcx());
 &amp;nbsp;if (!g_Backend-&amp;gt;VirtWriteDirty(buf, Buffer, BufferSize)){
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DebugPrint(&quot;VirtWriteDirty failed\n&quot;);
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
  }
 &amp;nbsp;
​
 &amp;nbsp;return true;
}
​
bool Init(const Options_t &amp;amp;Opts, const CpuState_t &amp;amp;) {
 &amp;nbsp;
 &amp;nbsp;if (!g_Backend-&amp;gt;SetBreakpoint(Gva_t(0x007ff6f327121d), [](Backend_t *Backend) {
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DebugPrint(&quot;fuzzme finish\n&quot;);
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Backend-&amp;gt;Stop(Ok_t());
 &amp;nbsp; &amp;nbsp;  })) {
 &amp;nbsp; &amp;nbsp;DebugPrint(&quot;Failed to SetBreakpoint main+0x9d\n&quot;);
 &amp;nbsp; &amp;nbsp;return false;
  }
​
 &amp;nbsp;SetupUsermodeCrashDetectionHooks();
​
 &amp;nbsp;return true;
}
​
//
// Register the target.
//
​
Target_t Test_wtf(&quot;test_wtf&quot;, Init, InsertTestcase);
​
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;하나 하나 자세히 살펴보면 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;Init&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;먼저 Init 함수의 경우, 빠른 프로세스 종료나 crash detection 동작을 수행하기 위해 backend의 breakpoint를 설정하는 부분이다. 그냥 적당히 fuzzme 호출 후, main 함수의 에필로그 주소를 대상으로 bp를 등록했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;0033:00007ff6`f3271212 e8b9feffff &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; call &amp;nbsp;  test_wtf_harness!fuzzme (7ff6f32710d0)
0033:00007ff6`f3271217 33c0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xor &amp;nbsp; &amp;nbsp; eax, eax
0033:00007ff6`f3271219 4883c438 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; add &amp;nbsp; &amp;nbsp; rsp, 38h
0033:00007ff6`f327121d c3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ret &amp;nbsp; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;main의 에필로그 opcode의 주소인 0x0007ff6f327121d에 bp를 걸어 해당 주소의 명령어가 호출될 때, backend를 종료하도록 다음과 같이 작성했다. Ok_t()를 인자로 전달하여 코드가 정상적으로 수행되었음을 나타낼 수 있다. 또한, &lt;/span&gt;&lt;span&gt;crash_detection_umode.h&lt;/span&gt;&lt;span&gt;에 존재하는 &lt;/span&gt;&lt;span&gt;SetupUsermodeCrashDetectionHooks&lt;/span&gt;&lt;span&gt;를 호출하여 crash detection을 등록했다. 코드를 살펴보면, stack overflow 등으로 메모리 exception이 발생하면 dispatcher 함수가 호출되는데, 해당 함수들에 bp를 걸어 crash 처리를 하도록 했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;bool Init(const Options_t &amp;amp;Opts, const CpuState_t &amp;amp;) {
 &amp;nbsp;
 &amp;nbsp;if (!g_Backend-&amp;gt;SetBreakpoint(Gva_t(0x007ff6f327121d), [](Backend_t *Backend) {
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DebugPrint(&quot;fuzzme finish\n&quot;);
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Backend-&amp;gt;Stop(Ok_t());
 &amp;nbsp; &amp;nbsp;  })) {
 &amp;nbsp; &amp;nbsp;DebugPrint(&quot;Failed to SetBreakpoint main+0x9d\n&quot;);
 &amp;nbsp; &amp;nbsp;return false;
  }
​
 &amp;nbsp;SetupUsermodeCrashDetectionHooks();
​
 &amp;nbsp;return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;InsertTestcase&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;앞서 설명했다시피, 이미 파일 데이터가 쓰인 buf 메모리에 mutation된 데이터를 덮어쓸 계획이다. fuzzme 함수의 첫 번째 인자를 살펴보면 다음과 같이 buf의 주소이며, ZXCV라는 파일 데이터가 들어있는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;kd&amp;gt; db @rcx
00007ff6`f3275680  5a 58 43 56 00 00 00 00-00 00 00 00 00 00 00 00  ZXCV............
00007ff6`f3275690  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`f32756a0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`f32756b0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`f32756c0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`f32756d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`f32756e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
00007ff6`f32756f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Windows x64 calling convention을 기준으로 함수의 첫 번째 인자는 rcx이기 때문에, rcx 값을 가져와서 buf의 주소를 얻고 해당 주소에 &lt;/span&gt;&lt;span&gt;VirtWriteDirty&lt;/span&gt;&lt;span&gt; 함수를 이용하여 mutation 된 데이터를 덮어쓴다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;bool InsertTestcase(const uint8_t *Buffer, const size_t BufferSize) {
 &amp;nbsp;
 &amp;nbsp;const Gva_t buf = Gva_t(g_Backend-&amp;gt;Rcx());
 &amp;nbsp;if (!g_Backend-&amp;gt;VirtWriteDirty(buf, Buffer, BufferSize)){
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DebugPrint(&quot;VirtWriteDirty failed\n&quot;);
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
  }
 &amp;nbsp;
​
 &amp;nbsp;return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;Register&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;작성한 fuzzer를 wtf에 등록한다. 이 때 등록한 이름을 사용하여 wtf.exe를 실행할 때 퍼저를 특정하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;Target_t Test_wtf(&quot;test_wtf&quot;, Init, InsertTestcase);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아무튼 잘 빌드하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Build fuzzer&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Readme에 있는 것처럼 잘 빌드하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;tex&quot;&gt;&lt;code&gt;D:\Tools\wtf\src\build_msvc&amp;gt;..\build\build-release-msvc.bat
​
D:\Tools\wtf\src\build_msvc&amp;gt;cmake ..
-- Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.19043.
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Tools/wtf/src/build_msvc
​
D:\Tools\wtf\src\build_msvc&amp;gt;cmake --build . --config RelWithDebInfo
.NET Framework용 Microsoft (R) Build Engine 버전 16.11.2+f32259642
Copyright (C) Microsoft Corporation. All rights reserved.
​
  hevd_client.vcxproj -&amp;gt; D:\Tools\wtf\src\build_msvc\RelWithDebInfo\hevd_client.exe
  tlv_server.vcxproj -&amp;gt; D:\Tools\wtf\src\build_msvc\RelWithDebInfo\tlv_server.exe
  fuzzer_test_wtf.cc
  코드를 생성하고 있습니다.
 &amp;nbsp;0 of 12308 functions ( 0.0%) were compiled, the rest were copied from previous compilation.
 &amp;nbsp; &amp;nbsp;0 functions were new in current compilation
 &amp;nbsp; &amp;nbsp;0 functions had inline decision re-evaluated but remain unchanged
  코드를 생성했습니다.
  wtf.vcxproj -&amp;gt; D:\Tools\wtf\src\build_msvc\RelWithDebInfo\wtf.exe
​&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Run Fuzzer&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;wtf는 data mutation을 하는 server와 input를 전달하여 backend에서 실행하는 client로 이루어져 있다. 아래와 같이 실행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;Server&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;D:\Tools\wtf\targets\test_wtf&amp;gt;..\..\src\build_msvc\RelWithDebInfo\wtf.exe master --max_len=2048 --runs=1000000 --target . --name test_wtf
Seeded with 5247091273893732672
Iterating through the corpus..
Sorting through the 1 entries..
Running server on tcp://localhost:31337..
#0 cov: 0 (+0) corp: 0 (0.0b) exec/s: 0.0 (0 nodes) lastcov: 14.0s crash: 0 timeout: 0 cr3: 0 uptime: 14.0s
#0 cov: 0 (+0) corp: 0 (0.0b) exec/s: -nan (1 nodes) lastcov: 14.0s crash: 0 timeout: 0 cr3: 0 uptime: 14.0s
Saving output in .\outputs\cr3-5934aa3139a87e36f522ee7f2ec452f4
Saving output in .\outputs\cr3-c743ac7cf4b00b1bc44786c765e874d0
Saving output in .\outputs\crash-39990eed0c80b9a4b266fd2cf2162606
Saving output in .\outputs\cr3-75711a754a442814ea3e048714639929
#7290 cov: 12194 (+12194) corp: 29 (3.7kb) exec/s: 729.0 (1 nodes) lastcov: 7.0s crash: 189 timeout: 0 cr3: 7101 uptime: 24.0s
#14127 cov: 12194 (+0) corp: 29 (3.7kb) exec/s: 706.4 (1 nodes) lastcov: 17.0s crash: 377 timeout: 0 cr3: 13750 uptime: 34.0s&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;Client&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;D:\Tools\wtf\targets\test_wtf&amp;gt;..\..\src\build_msvc\RelWithDebInfo\wtf.exe fuzz --backend=bochscpu --limit 100000 --target D:\Tools\wtf\targets\test_wtf --name test_wtf
Initializing the debugger instance.. (this takes a bit of time)
D:\Tools\wtf\targets\test_wtf\state\mem.dmpSetting debug register status to zero.
Setting debug register status to zero.
Could not set a breakpoint at hal!HalpPerfInterrupt.
Failed to set breakpoint on HalpPerfInterrupt, but ignoring..
Dialing to tcp://localhost:31337/..
#4710 cov: 12194 exec/s: 471.0 lastcov: 6.0s crash: 150 timeout: 0 cr3: 4560 uptime: 10.0s&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Conclusion&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실제 실행하면 타겟 프로그램 대상으로 금방 크래시를 찾는다. 다음 편은 이제 이걸로 실제 프로그램 퍼징하는 내용을 써야쥐.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;Trouble Shoot&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;1. Error: Unable to create file [at bdump (line 296 col 5)]&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;inform7&quot;&gt;&lt;code&gt;kd&amp;gt; !bdump &quot;D:\\Tools\\bdump-master\\state_normal&quot;
[bdump] creating dir...
[bdump] saving regs...
[bdump] register fixups...
[bdump] don't know how to get mxcsr_mask or fpop, setting to zero...
[bdump]
[bdump] don't know how to get avx registers, skipping...
[bdump]
[bdump] tr.base is not cannonical...
[bdump] old tr.base: 0x79f76000
[bdump] new tr.base: 0xfffff80579f76000
[bdump]
[bdump] rip and gs don't match kernel/user, swapping...
[bdump] rip: 0x7ff6f32710d0
[bdump] new gs.base: 0xda4e6a5000
[bdump] new kernel_gs_base: 0xfffff8057265f000
[bdump]
[bdump] non-zero IRQL in usermode, resetting to zero...
Error: Unable to create file [at bdump (line 296 col 5)]
DBGHELP: test_wtf_harness is not source indexed&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기존에 메모리 파일이 존재하는데, 덮어쓰기가 안돼서 발생하는 문제로, 새로운 디렉토리로 이름을 변경하거나 기존 dmp 파일을 삭제하면 해결할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;2. OpenDumpFile(D:\Tools\wtf\targets\test_wtf\state\mem.dmp) failed with hr=-0x7ff8ffa9&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;# when running wtf.exe with fuzz mode
OpenDumpFile(D:\Tools\wtf\targets\test_wtf\state\mem.dmp) failed with hr=-0x7ff8ffa9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;유저모드 프로세스를 대상으로 덤프할 때, 그냥 &lt;/span&gt;&lt;span&gt;!bdump&lt;/span&gt;&lt;span&gt; 로 덤프할 경우 가끔 발생하는 문제같음. 그냥 &lt;/span&gt;&lt;span&gt;!bdump_full&lt;/span&gt;&lt;span&gt; 명령어로 full 메모리 덤프하면 해결할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;3. [bdump] could not recover fs!&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;kd&amp;gt; !bdump_active_kernel &quot;D:\\Tools\\bdump-master\\state_kernel&quot;
[bdump] creating dir...
[bdump] saving regs...
[bdump] could not recover fs!
Error: Unable to set property 'base' of undefined or null reference [at bdump (line 73 col 5)]
DBGHELP: test_wtf_harness is not source indexed
kd&amp;gt; dg cs
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  P Si Gr Pr Lo
Sel &amp;nbsp; &amp;nbsp; &amp;nbsp;  Base &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  Limit &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  Type &amp;nbsp;  l ze an es ng Flags
---- ----------------- ----------------- ---------- - -- -- -- -- --------
0033 00000000`00000000 00000000`00000000 Code RE Ac 3 Nb By P  Lo 000002fb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;유저모드 프로세스 덤프할 때, 커널 메모리 덤프할 때 발생하는 문제같음. 유저모드 프로세스 대상으로 덤프할 때는 &lt;/span&gt;&lt;span&gt;!bdump&lt;/span&gt;&lt;span&gt; 나 &lt;/span&gt;&lt;span&gt;!bdump_full&lt;/span&gt;&lt;span&gt;을 사용해야 함.&lt;/span&gt;&lt;/p&gt;</description>
      <category>좀 열심히 쓴 글</category>
      <category>what the fuzz</category>
      <category>wtf fuzzer</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/419</guid>
      <comments>https://chp747.tistory.com/419#entry419comment</comments>
      <pubDate>Fri, 3 Jun 2022 19:57:27 +0900</pubDate>
    </item>
    <item>
      <title>커널 디버깅 중 USER-MODE 프로세스에 디버거 붙이기</title>
      <link>https://chp747.tistory.com/418</link>
      <description>&lt;h1&gt;&lt;span&gt;커널 디버깅 중 USER-MODE 프로세스에 디버거 붙이기&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Windbg로 윈도우 커널 디버깅 중에 유저모드 프로세스를 디버깅하는 방법이 몇 가지 있는데, 일단 이 글에서는 다음과 같은 네 가지의 방법을 정리해볼까 한다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;실행 중인 프로세스에 붙기 (EPROCESS)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;프로세스 실행하면서 붙기 (ntsd.exe)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;프로세스 로드하면서 붙기 (sxe ld)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;프로세스 생성할 때 붙기 (nt!PspInsertProcess)&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;0. Windbg kernel debugging Setting&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://docs.microsoft.com/ko-kr/windows-hardware/drivers/debugger/setting-up-a-network-debugging-connection-automatically&quot;&gt;https://docs.microsoft.com/ko-kr/windows-hardware/drivers/debugger/setting-up-a-network-debugging-connection-automatically&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;가장 먼저, 위의 msdn을 참고해서 커널 디버깅 환경 세팅한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;내 경우에는 hyper-V 로 Windows 10 Version 10.0.19043.1706에 해당하는 wdk sdk 등을 설치했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;hevd 드라이버에 간단한 ioctl을 보내는 프로그램을 예제로 사용할 타겟 프로그램으로 설정했다. 내 경우 host 환경에 예제 프로그램 빌드 환경을 구축해놓았다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1. 실행 중인 프로세스에 붙기 (EPROCESS)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;첫 번째 방법은 &lt;/span&gt;&lt;span&gt;!process&lt;/span&gt;&lt;span&gt; 명령어로 EPROCESS 주소를 확인하고 switch 하는 방법이다. 이미 실행 중인 프로세스에 붙는 방법이기 때문에, 다음의 예제 코드에 &lt;/span&gt;&lt;span&gt;system(&quot;pause&quot;)&lt;/span&gt;&lt;span&gt; 를 추가하여 프로세스가 유지되도록 진행했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;...
 &amp;nbsp;
int main() {
 &amp;nbsp;printf(&quot;process start\n&quot;);
 &amp;nbsp;system(&quot;pause&quot;); &amp;nbsp; //
 &amp;nbsp;
 &amp;nbsp;HANDLE H =
 &amp;nbsp; &amp;nbsp; &amp;nbsp;CreateFileA(&quot;\\\\.\\HackSysExtremeVulnerableDriver&quot;,
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
 &amp;nbsp;if (H == INVALID_HANDLE_VALUE) {
 &amp;nbsp; &amp;nbsp;printf(&quot;CreateFileA failed.\n&quot;);
 &amp;nbsp; &amp;nbsp;return EXIT_FAILURE;
  }
​
  ...
 &amp;nbsp; &amp;nbsp;
 &amp;nbsp;return EXIT_SUCCESS;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;프로그램을 빌드하고, 해당 exe 파일을 vm 에 집어넣고 실행한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;C:\Users\pch21\Desktop\Fuzz\hevd&amp;gt;.\hevd_client.exe
process start
계속하려면 아무 키나 누르십시오 . . .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 vm 내에서 위와 같이 타겟 프로세스가 실행되면, 다음과 같이 host의 windbg에서 타겟 프로세스의 주소를 확인할 수 있다. &lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;kd&amp;gt; !process 0 0 hevd_client.exe
PROCESS ffffcc899f14e080
 &amp;nbsp;  SessionId: 2  Cid: 1bc4 &amp;nbsp;  Peb: 1a47ad2000  ParentCid: 10a0
 &amp;nbsp;  DirBase: 11049000  ObjectTable: ffffb80469015a00  HandleCount: &amp;nbsp;45.
 &amp;nbsp;  Image: hevd_client.exe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 해당 Process로 switch 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;kd&amp;gt; .process /i /r /p ffffcc899f14e080
You need to continue execution (press 'g' &amp;lt;enter&amp;gt;) for the context
to be switched. When the debugger breaks in again, you will be in
the new process context.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;타겟 프로세스의 pdb 심볼 파일이 존재하는 경우, &lt;/span&gt;&lt;span&gt;sympath&lt;/span&gt;&lt;span&gt; 명령어로 경로를 추가해준다. 내 경우에는 host 환경 내의 pdb 파일이 존재하는 디렉토리 경로를 추가했다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;kd&amp;gt; .sympath+ D:\Tools\wtf\src\build_msvc\RelWithDebInfo
DBGHELP: Symbol Search Path: cache*;SRV*https://msdl.microsoft.com/download/symbols;d:\tools\wtf\src\build_msvc\relwithdebinfo
SYMSRV:  BYINDEX: 0x2
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\ProgramData\Dbg\sym
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ntkrnlmp.pdb
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 84A84F4D2218BC053913B1204942618D1
SYMSRV:  PATH: C:\ProgramData\Dbg\sym\ntkrnlmp.pdb\84A84F4D2218BC053913B1204942618D1\ntkrnlmp.pdb
SYMSRV:  RESULT: 0x00000000
DBGHELP: nt - public symbols &amp;nbsp;
 &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\ntkrnlmp.pdb\84A84F4D2218BC053913B1204942618D1\ntkrnlmp.pdb
Symbol search path is: srv*;D:\Tools\wtf\src\build_msvc\RelWithDebInfo
Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols;d:\tools\wtf\src\build_msvc\relwithdebinfo
​
************* Path validation summary **************
Response &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time (ms) &amp;nbsp; &amp;nbsp; Location
Deferred &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; srv*
OK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; D:\Tools\wtf\src\build_msvc\RelWithDebInfo&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;경로를 추가한 뒤 &lt;/span&gt;&lt;span&gt;reload&lt;/span&gt;&lt;span&gt; 명령어로 symbol 파일을 다시 로딩해준다. /f 옵션은 lazy 하지 않게 바로 로딩하는 옵션인데, 해당 옵션과 /user 옵션을 추가해주면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;kd&amp;gt; .reload /f /user
Loading User Symbols
.SYMSRV:  BYINDEX: 0x4
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\ProgramData\Dbg\sym
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hevd_client.pdb
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ABF75D5451C74049864E0307D295930F6
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pdb - path not found
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pd_ - path not found
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\file.ptr - path not found
SYMSRV:  RESULT: 0x80070003
SYMSRV:  BYINDEX: 0x5
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\ProgramData\Dbg\sym*https://msdl.microsoft.com/download/symbols
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hevd_client.pdb
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ABF75D5451C74049864E0307D295930F6
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pdb - path not found
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pd_ - path not found
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\file.ptr - path not found
SYMSRV:  HTTPGET: /download/symbols/index2.txt
SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
SYMSRV:  HTTPGET: /download/symbols/hevd_client.pdb/ABF75D5451C74049864E0307D295930F6/hevd_client.pdb
SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
SYMSRV:  HTTPGET: /download/symbols/hevd_client.pdb/ABF75D5451C74049864E0307D295930F6/hevd_client.pd_
SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
SYMSRV:  HTTPGET: /download/symbols/hevd_client.pdb/ABF75D5451C74049864E0307D295930F6/file.ptr
SYMSRV:  HttpQueryInfo: 80190194 - HTTP_STATUS_NOT_FOUND
SYMSRV:  RESULT: 0x80190194
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pdb - path not found
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pd_ - path not found
SYMSRV:  UNC: C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\file.ptr - path not found
DBGHELP: d:\tools\wtf\src\build_msvc\relwithdebinfo\hevd_client.pdb cached to C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pdb
*** WARNING: Unable to verify checksum for hevd_client.exe
DBGHELP: hevd_client - private symbols &amp;amp; lines 
 &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pdb
.SYMSRV:  BYINDEX: 0x6
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\ProgramData\Dbg\sym&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 &lt;/span&gt;&lt;span&gt;lm&lt;/span&gt;&lt;span&gt; 명령어로 확인해보면 hevd_client.exe 에 대한 심볼이 로드된 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;kd&amp;gt; lm
start &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; end &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; module name
00007ff7`47b00000 00007ff7`47b09000 &amp;nbsp; hevd_client C (private pdb symbols)  C:\ProgramData\Dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pdb
00007ffa`24380000 00007ffa`2439b000 &amp;nbsp; VCRUNTIME140 &amp;nbsp; (private pdb symbols)  C:\ProgramData\Dbg\sym\vcruntime140.amd64.pdb\1FE44F1573B246029EAFFD19C4B144671\vcruntime140.amd64.pdb
00007ffa`2b0f0000 00007ffa`2b0fc000 &amp;nbsp; VCRUNTIME140_1 &amp;nbsp; (private pdb symbols)  C:\ProgramData\Dbg\sym\vcruntime140_1.amd64.pdb\02D66622C7D04ADBB93F52B802FD3E001\vcruntime140_1.amd64.pdb
00007ffa`36b20000 00007ffa`36c20000 &amp;nbsp; ucrtbase # (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\ucrtbase.pdb\152B3C4F5E1CE0FE6BC36E9F0F2B10E61\ucrtbase.pdb
00007ffa`37000000 00007ffa`372cd000 &amp;nbsp; KERNELBASE &amp;nbsp; (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\kernelbase.pdb\BFA648CE3D974430D6F69BCCC300FC391\kernelbase.pdb
00007ffa`37400000 00007ffa`374bd000 &amp;nbsp; KERNEL32 # (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\kernel32.pdb\BF9567320871B7B8741ED4FF2369DC5C1\kernel32.pdb
00007ffa`37660000 00007ffa`37785000 &amp;nbsp; RPCRT4 &amp;nbsp; # (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\rpcrt4.pdb\A381203AEB2EE18A33EC95033DA488A81\rpcrt4.pdb
00007ffa`38e70000 00007ffa`38f0c000 &amp;nbsp; sechost &amp;nbsp;# (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\sechost.pdb\F0CCAF8276CE8711A7E0E92AD742F0701\sechost.pdb
00007ffa`39390000 00007ffa`39585000 &amp;nbsp; ntdll &amp;nbsp; &amp;nbsp;  (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\ntdll.pdb\094B224BC5297445CF29F9C9BB588DC91\ntdll.pdb
fffff804`1aa00000 fffff804`1ba46000 &amp;nbsp; nt &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\ntkrnlmp.pdb\84A84F4D2218BC053913B1204942618D1\ntkrnlmp.pdb
​
Unloaded modules:
fffff804`21130000 fffff804`21143000 &amp;nbsp; IndirectKmd.sys&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 bp를 걸고 실행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;kd&amp;gt; bp hevd_client!main+0xaf
kd&amp;gt; g&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2. 프로세스 실행하면서 붙기 (ntsd.exe)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;실행하면서 붙기위해 ntsd.exe를 이용한다. 커널 디버깅 중에 vm 내에서 다음과 같이 ntsd를 실행시키면 새로운 window 에서 타겟 프로세스가 새로 spawn 되면서 host의 windbg에 붙게된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;C:\Program Files (x86)\Windows Kits\10\Debuggers\x64&amp;gt;ntsd.exe -s -d  C:\Users\pch21\Desktop\Fuzz\hevd\hevd_client.exe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;host의 windbg를 보면 다음과 같은 상태가 되는데, 앞서 시도했던 방법과 다르게 windbg에 kd&amp;gt; 가 아니라 Input&amp;gt; 이 되게 된다. 커널모드가 아니라 유저모드 상태로 붙기 때문이다. 다시 커널모드로 넘어가려면 &lt;/span&gt;&lt;span&gt;.breakin&lt;/span&gt;&lt;span&gt; 명령어를 사용하면 되는데, privilege 때문에 안된다면 break 버튼을 누르고 &lt;/span&gt;&lt;span&gt;Input&amp;gt; .sleep 1000&lt;/span&gt;&lt;span&gt; 명령어로 커널모드로 넘어가는 방법이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;Microsoft (R) Windows Debugger Version 10.0.19041.685 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
​
CommandLine: C:\Users\pch21\Desktop\Fuzz\hevd\hevd_client.exe
​
************* Path validation summary **************
Response &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time (ms) &amp;nbsp; &amp;nbsp; Location
Deferred &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; srv*
Symbol search path is: srv*
Executable search path is: 
*** WARNING: Unable to verify checksum for hevd_client.exe
*** ERROR: Module load completed but symbols could not be loaded for hevd_client.exe
ModLoad: 00007ff6`a6d70000 00007ff6`a6d79000 &amp;nbsp; hevd_client.exe
ModLoad: 00007ffa`39390000 00007ffa`39585000 &amp;nbsp; ntdll.dll
ModLoad: 00007ffa`37400000 00007ffa`374bd000 &amp;nbsp; C:\Windows\System32\KERNEL32.DLL
ModLoad: 00007ffa`37000000 00007ffa`372cd000 &amp;nbsp; C:\Windows\System32\KERNELBASE.dll
ModLoad: 00007ffa`36b20000 00007ffa`36c20000 &amp;nbsp; C:\Windows\System32\ucrtbase.dll
ModLoad: 00007ffa`2b0f0000 00007ffa`2b0fc000 &amp;nbsp; C:\Windows\SYSTEM32\VCRUNTIME140_1.dll
ModLoad: 00007ffa`2aad0000 00007ffa`2aaeb000 &amp;nbsp; C:\Windows\SYSTEM32\VCRUNTIME140.dll
(64.2228): Break instruction exception - code 80000003 (first chance)
ntdll!LdrpDoDebuggerBreak+0x30:
00007ffa`394606b0 cc &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  int &amp;nbsp; &amp;nbsp; 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;어쨋든 이 상태에서 심볼을 추가한다. 주의할 점은 이 경우 심볼 파일의 경로가 host 기준이 아니라, ntsd를 실행시킨 vm 기준으로 입력해야 한다는 점이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;0:000&amp;gt; .sympath
NOTE: The symbol path for this ntsd is relative to where
ntsd.exe is running, not where kd.exe is running.
Symbol search path is: srv*
Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols
​
************* Path validation summary **************
Response &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time (ms) &amp;nbsp; &amp;nbsp; Location
Deferred &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; srv*
0:000&amp;gt; .sympath+ C:\Users\pch21\Desktop\Fuzz\hevd\
NOTE: The symbol path for this ntsd is relative to where
ntsd.exe is running, not where kd.exe is running.
*** WARNING: Unable to verify checksum for hevd_client.exe
*** ERROR: Module load completed but symbols could not be loaded for C:\Windows\System32\ucrtbase.dll
*** ERROR: Module load completed but symbols could not be loaded for C:\Windows\System32\KERNEL32.DLL
*** ERROR: Module load completed but symbols could not be loaded for ntdll.dll
Symbol search path is: srv*;C:\Users\pch21\Desktop\Fuzz\hevd\
Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols;c:\users\pch21\desktop\fuzz\hevd\
​
************* Path validation summary **************
Response &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time (ms) &amp;nbsp; &amp;nbsp; Location
Deferred &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; srv*
OK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\Users\pch21\Desktop\Fuzz\hevd\&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;.reload&lt;/span&gt;&lt;span&gt; 후 &lt;/span&gt;&lt;span&gt;lm&lt;/span&gt;&lt;span&gt;으로 다시 살펴보면 심볼이 정상적으로 로드된 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;​
0:000&amp;gt; .reload
Reloading current modules
.*** WARNING: Unable to verify checksum for hevd_client.exe
...*** ERROR: Module load completed but symbols could not be loaded for C:\Windows\System32\ucrtbase.dll
.*** ERROR: Module load completed but symbols could not be loaded for C:\Windows\System32\KERNELBASE.dll
.*** ERROR: Module load completed but symbols could not be loaded for C:\Windows\System32\KERNEL32.DLL
.*** ERROR: Module load completed but symbols could not be loaded for ntdll.dll
​
​
************* Symbol Loading Error Summary **************
Module name &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  Error
SharedUserData &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; No error - symbol load deferred
​
You can troubleshoot most symbol related issues by turning on symbol loading diagnostics (!sym noisy) and repeating the command that caused symbols to be loaded.
You should also verify that your symbol search path (.sympath) is correct.
​
0:000&amp;gt; lm
start &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; end &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; module name
00007ff6`a6d70000 00007ff6`a6d79000 &amp;nbsp; hevd_client M (private pdb symbols)  C:\ProgramData\dbg\sym\hevd_client.pdb\ABF75D5451C74049864E0307D295930F6\hevd_client.pdb
00007ffa`2d0c0000 00007ffa`2d0db000 &amp;nbsp; VCRUNTIME140 M (private pdb symbols)  C:\ProgramData\dbg\sym\vcruntime140.amd64.pdb\1FE44F1573B246029EAFFD19C4B144671\vcruntime140.amd64.pdb
00007ffa`2f6e0000 00007ffa`2f6ec000 &amp;nbsp; VCRUNTIME140_1 M (private pdb symbols)  C:\ProgramData\dbg\sym\vcruntime140_1.amd64.pdb\02D66622C7D04ADBB93F52B802FD3E001\vcruntime140_1.amd64.pdb
00007ffa`36b20000 00007ffa`36c20000 &amp;nbsp; ucrtbase M (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\dbg\sym\ucrtbase.pdb\152B3C4F5E1CE0FE6BC36E9F0F2B10E61\ucrtbase.pdb
00007ffa`37000000 00007ffa`372cd000 &amp;nbsp; KERNELBASE M (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\dbg\sym\kernelbase.pdb\BFA648CE3D974430D6F69BCCC300FC391\kernelbase.pdb
00007ffa`37400000 00007ffa`374bd000 &amp;nbsp; KERNEL32 M (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\dbg\sym\kernel32.pdb\BF9567320871B7B8741ED4FF2369DC5C1\kernel32.pdb
00007ffa`39390000 00007ffa`39585000 &amp;nbsp; ntdll &amp;nbsp;  M (pdb symbols) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\dbg\sym\ntdll.pdb\094B224BC5297445CF29F9C9BB588DC91\ntdll.pdb
0:000&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 브포를 걸고 실행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;0:000&amp;gt; bp hevd_client!main
0:000&amp;gt; g
Breakpoint 0 hit
hevd_client!main:
00007ff6`a6d710c0 48895c2408 &amp;nbsp; &amp;nbsp;  mov &amp;nbsp; &amp;nbsp; qword ptr [rsp+8],rbx ss:0000002f`1b4ffde0=0000000000000000
0:000&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3. 실행파일 로드하면서 붙기 (sxe ld)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;sxe ld&lt;/span&gt;&lt;span&gt; 명령어를 이용해서 프로그램이 로드될 때, breakpoint를 걸 수 있다. 다만 sxe 자체가 첫 번째 로드시에만 적용이 되기 때문에, 로드 시 브포가 걸렸을 때 반드시 &lt;/span&gt;&lt;span&gt;bu hevd_client!main&lt;/span&gt;&lt;span&gt; 형태로 따로 브포를 걸어야 한다. &lt;s&gt;따로 또 브포를 걸지않으면 다시 브포를 걸기위해 OS를 껏다 켜야한다.&lt;/s&gt; [+추가] &lt;span style=&quot;color: #222222; text-align: left;&quot;&gt;프로그램 del 했다가 ctrl^z 로 다시 복구해주면 다시 sxe ld 부분에 걸린다고 함.&lt;/span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;그리고 &lt;/span&gt;&lt;span&gt;sxe ld&lt;/span&gt;&lt;span&gt; 전에 꼭 &lt;/span&gt;&lt;span&gt;gflag&lt;/span&gt;&lt;span&gt;로 커널 디버깅 심볼 로딩을 활성화시키자!&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Microsoft (R) Windows Debugger Version 10.0.25111.1000 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
​
Using NET for debugging
Opened WinSock 2.0
Waiting to reconnect...
Connected to target 172.27.180.66 on port 50001 on local IP 172.27.176.1.
You can get the target MAC address by running .kdtargetmac command.
Connected to Windows 10 19041 x64 target at (Fri May 27 00:58:07.236 2022 (UTC + 9:00)), ptr64 TRUE
Kernel Debugger connection established.
​
************* Path validation summary **************
Response &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time (ms) &amp;nbsp; &amp;nbsp; Location
Deferred &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; srv*
OK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; D:\Tools\wtf\src\build_msvc\RelWithDebInfo
Symbol search path is: srv*;D:\Tools\wtf\src\build_msvc\RelWithDebInfo
Executable search path is: 
Windows 10 Kernel Version 19041 MP (1 procs) Free x64
Product: WinNt, suite: TerminalServer SingleUserTS
Edition build lab: 19041.1.amd64fre.vb_release.191206-1406
Machine Name:
Kernel base = 0xfffff805`4b600000 PsLoadedModuleList = 0xfffff805`4c22a2b0
Debug session time: Fri May 27 00:58:04.486 2022 (UTC + 9:00)
System Uptime: 0 days 0:00:01.993
KDTARGET: Refreshing KD connection
Break instruction exception - code 80000003 (first chance)
*******************************************************************************
* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *
* &amp;nbsp; You are seeing this message because you pressed either &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  *
* &amp;nbsp; &amp;nbsp; &amp;nbsp; CTRL+C (if you run console kernel debugger) or, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *
* &amp;nbsp; &amp;nbsp; &amp;nbsp; CTRL+BREAK (if you run GUI kernel debugger), &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  *
* &amp;nbsp; on your debugger machine's keyboard. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  *
* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *
* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; THIS IS NOT A BUG OR A SYSTEM CRASH &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *
* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *
* If you did not intend to break into the debugger, press the &quot;g&quot; key, then &amp;nbsp; *
* press the &quot;Enter&quot; key now.  This message might immediately reappear.  If it *
* does, press &quot;g&quot; and &quot;Enter&quot; again. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  *
* &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *
*******************************************************************************
nt!DbgBreakPointWithStatus:
fffff805`4b9ffc00 cc &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  int &amp;nbsp; &amp;nbsp; 3
​
kd&amp;gt; !gflag +ksl
New NtGlobalFlag contents: 0x00040000
 &amp;nbsp;  ksl - Enable loading of kernel debugger symbols
kd&amp;gt; sxe ld hevd_client.exe
kd&amp;gt; g&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 vm에서 타겟 프로그램을 실행시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;C:\Users\pch21\Desktop\Fuzz\hevd&amp;gt;.\hevd_client.exe
process start
계속하려면 아무 키나 누르십시오 . . .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 브포가 걸린다. 미리 sympath에 pdb 경로를 추가해놨기 때문에, bu 명령어 시 pdb 심볼 파일이 로드된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;kd&amp;gt; 
nt!DebugService2+0x5:
fffff805`4b9ffc55 cc &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  int &amp;nbsp; &amp;nbsp; 3
kd&amp;gt; bu hevd_client!main
*** WARNING: Unable to verify checksum for hevd_client.exe
kd&amp;gt; .sympath 
Symbol search path is: srv*;D:\Tools\wtf\src\build_msvc\RelWithDebInfo
Expanded Symbol search path is: cache*;SRV*https://msdl.microsoft.com/download/symbols;d:\tools\wtf\src\build_msvc\relwithdebinfo
​
************* Path validation summary **************
Response &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time (ms) &amp;nbsp; &amp;nbsp; Location
Deferred &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; srv*
OK &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; D:\Tools\wtf\src\build_msvc\RelWithDebInfo
kd&amp;gt; g
Breakpoint 0 hit
hevd_client!main:
0033:00007ff6`d12110c0 48895c2408 &amp;nbsp; &amp;nbsp;  mov &amp;nbsp; &amp;nbsp; qword ptr [rsp+8],rbx&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이제 매 프로세스 시작마다 브포가 걸린다!&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;[+추가]&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4. 프로세스 생성할 때 붙기 (nt!PspInsertProcess)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Reference : &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://vimalshekar.github.io/walkthroughs/Activating-Windbg-on-process-launch&quot;&gt;https://vimalshekar.github.io/walkthroughs/Activating-Windbg-on-process-launch&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;커널 라이브 디버깅 중이기 때문에, 프로세스 생성하는 함수에서부터 디버깅이 가능하다. 위 사이트를 참고했는데, 현재 windows 10 과는 offset이 조금 다르다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;우선, Windows 에서 프로세스 시작 시 동작을 간단히 설명하자면, 먼저 커널에서 프로세스의 정보가 담긴 _EPROCESS커널 오브젝트를 생성하고 이를 프로세스 연결리스트에 추가하여 관리한다. 유저모드에서는 프로세스 정보를 PEB 형태로 관리하다가 필요시 syscall을 통해 이 커널 오브젝트에 접근하여 추가 정보를 가져온다는 정도로 알면 될 것 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아무튼, 생성한 커널 오브젝트를 프로세스 연결리스트에 추가할 때 &lt;/span&gt;&lt;span&gt;nt!PspInsertProcess&lt;/span&gt;&lt;span&gt; 함수를 호출한다. 이 함수의 첫 번째 매개변수가 &lt;/span&gt;&lt;span&gt;_EPROCESS&lt;/span&gt;&lt;span&gt;주소이며, 따라서 이 시점에서 첫 번째 매개변수를 살펴봄으로써 해당 커널 오브젝트의 실행 이미지 파일 이름, ImageBase 주소 등을 알 수 있다. 실제로 해당 함수 진입점에서 브포를 걸고 첫 번째 인자인 rcx 레지스터를 살펴보면 다음과 같다. 이번 경우의 타겟 프로세스는 &quot;test_wtf_harness.exe&quot;이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;kd&amp;gt; dt nt!_EPROCESS @rcx
 &amp;nbsp; +0x000 Pcb &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : _KPROCESS
 &amp;nbsp; +0x438 ProcessLock &amp;nbsp; &amp;nbsp;  : _EX_PUSH_LOCK
 &amp;nbsp; +0x440 UniqueProcessId  : 0x00000000`00002060 Void
 &amp;nbsp; +0x448 ActiveProcessLinks : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]
 &amp;nbsp; +0x458 RundownProtect &amp;nbsp; : _EX_RUNDOWN_REF
 &amp;nbsp; +0x460 Flags2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0x5000
 &amp;nbsp; +0x460 JobNotReallyActive : 0y0
 &amp;nbsp; +0x460 AccountingFolded : 0y0
 &amp;nbsp; +0x460 NewProcessReported : 0y0
 &amp;nbsp; +0x460 ExitProcessReported : 0y0
 &amp;nbsp; +0x460 ReportCommitChanges : 0y0
 &amp;nbsp; +0x460 LastReportMemory : 0y0
 &amp;nbsp; +0x460 ForceWakeCharge  : 0y0
 &amp;nbsp; +0x460 CrossSessionCreate : 0y0
 &amp;nbsp; +0x460 NeedsHandleRundown : 0y0
 &amp;nbsp; +0x460 RefTraceEnabled  : 0y0
 &amp;nbsp; +0x460 PicoCreated &amp;nbsp; &amp;nbsp;  : 0y0
 &amp;nbsp; +0x460 EmptyJobEvaluated : 0y0
 &amp;nbsp; +0x460 DefaultPagePriority : 0y101
 &amp;nbsp; +0x460 PrimaryTokenFrozen : 0y0
 &amp;nbsp; +0x460 ProcessVerifierTarget : 0y0
 &amp;nbsp; +0x460 RestrictSetThreadContext : 0y0
 &amp;nbsp; +0x460 AffinityPermanent : 0y0
 &amp;nbsp; +0x460 AffinityUpdateEnable : 0y0
 &amp;nbsp; +0x460 PropagateNode &amp;nbsp;  : 0y0
 &amp;nbsp; +0x460 ExplicitAffinity : 0y0
 &amp;nbsp; +0x460 ProcessExecutionState : 0y00
 &amp;nbsp; +0x460 EnableReadVmLogging : 0y0
 &amp;nbsp; +0x460 EnableWriteVmLogging : 0y0
 &amp;nbsp; +0x460 FatalAccessTerminationRequested : 0y0
 &amp;nbsp; +0x460 DisableSystemAllowedCpuSet : 0y0
 &amp;nbsp; +0x460 ProcessStateChangeRequest : 0y00
 &amp;nbsp; +0x460 ProcessStateChangeInProgress : 0y0
 &amp;nbsp; +0x460 InPrivate &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0y0
 &amp;nbsp; +0x464 Flags &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0x10050c00
 &amp;nbsp; +0x464 CreateReported &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 NoDebugInherit &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 ProcessExiting &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 ProcessDelete &amp;nbsp;  : 0y0
 &amp;nbsp; +0x464 ManageExecutableMemoryWrites : 0y0
 &amp;nbsp; +0x464 VmDeleted &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0y0
 &amp;nbsp; +0x464 OutswapEnabled &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 Outswapped &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 FailFastOnCommitFail : 0y0
 &amp;nbsp; +0x464 Wow64VaSpace4Gb  : 0y0
 &amp;nbsp; +0x464 AddressSpaceInitialized : 0y11
 &amp;nbsp; +0x464 SetTimerResolution : 0y0
 &amp;nbsp; +0x464 BreakOnTermination : 0y0
 &amp;nbsp; +0x464 DeprioritizeViews : 0y0
 &amp;nbsp; +0x464 WriteWatch &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 ProcessInSession : 0y1
 &amp;nbsp; +0x464 OverrideAddressSpace : 0y0
 &amp;nbsp; +0x464 HasAddressSpace  : 0y1
 &amp;nbsp; +0x464 LaunchPrefetched : 0y0
 &amp;nbsp; +0x464 Background &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 VmTopDown &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0y0
 &amp;nbsp; +0x464 ImageNotifyDone  : 0y0
 &amp;nbsp; +0x464 PdeUpdateNeeded  : 0y0
 &amp;nbsp; +0x464 VdmAllowed &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 ProcessRundown &amp;nbsp; : 0y0
 &amp;nbsp; +0x464 ProcessInserted  : 0y0
 &amp;nbsp; +0x464 DefaultIoPriority : 0y010
 &amp;nbsp; +0x464 ProcessSelfDelete : 0y0
 &amp;nbsp; +0x464 SetTimerResolutionLink : 0y0
 &amp;nbsp; +0x468 CreateTime &amp;nbsp; &amp;nbsp; &amp;nbsp; : _LARGE_INTEGER 0x01d87401`40966b6a
 &amp;nbsp; +0x470 ProcessQuotaUsage : [2] 0x5d8
 &amp;nbsp; +0x480 ProcessQuotaPeak : [2] 0x5d8
 &amp;nbsp; +0x490 PeakVirtualSize  : 0x58f000
 &amp;nbsp; +0x498 VirtualSize &amp;nbsp; &amp;nbsp;  : 0x58f000
 &amp;nbsp; +0x4a0 SessionProcessLinks : _LIST_ENTRY [ 0xffff9081`87afe010 - 0xffffdc07`a39ae520 ]
 &amp;nbsp; +0x4b0 ExceptionPortData : (null) 
 &amp;nbsp; +0x4b0 ExceptionPortValue : 0
 &amp;nbsp; +0x4b0 ExceptionPortState : 0y000
 &amp;nbsp; +0x4b8 Token &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : _EX_FAST_REF
 &amp;nbsp; +0x4c0 MmReserved &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0
 &amp;nbsp; +0x4c8 AddressCreationLock : _EX_PUSH_LOCK
 &amp;nbsp; +0x4d0 PageTableCommitmentLock : _EX_PUSH_LOCK
 &amp;nbsp; +0x4d8 RotateInProgress : (null) 
 &amp;nbsp; +0x4e0 ForkInProgress &amp;nbsp; : (null) 
 &amp;nbsp; +0x4e8 CommitChargeJob  : (null) 
 &amp;nbsp; +0x4f0 CloneRoot &amp;nbsp; &amp;nbsp; &amp;nbsp;  : _RTL_AVL_TREE
 &amp;nbsp; +0x4f8 NumberOfPrivatePages : 0x22
 &amp;nbsp; +0x500 NumberOfLockedPages : 0
 &amp;nbsp; +0x508 Win32Process &amp;nbsp; &amp;nbsp; : (null) 
 &amp;nbsp; +0x510 Job &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : (null) 
 &amp;nbsp; +0x518 SectionObject &amp;nbsp;  : 0xffffa505`c91025d0 Void
 &amp;nbsp; +0x520 SectionBaseAddress : 0x00007ff7`1fd20000 Void
 &amp;nbsp; +0x528 Cookie &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0
 &amp;nbsp; +0x530 WorkingSetWatch  : (null) 
 &amp;nbsp; +0x538 Win32WindowStation : (null) 
 &amp;nbsp; +0x540 InheritedFromUniqueProcessId : 0x00000000`00001fcc Void
 &amp;nbsp; +0x548 OwnerProcessId &amp;nbsp; : 0x1fcc
 &amp;nbsp; +0x550 Peb &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0x00000004`161ec000 _PEB
 &amp;nbsp; +0x558 Session &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0xffff9081`87afe000 _MM_SESSION_SPACE
 &amp;nbsp; +0x560 Spare1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null) 
 &amp;nbsp; +0x568 QuotaBlock &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0xffffdc07`9ce09cc0 _EPROCESS_QUOTA_BLOCK
 &amp;nbsp; +0x570 ObjectTable &amp;nbsp; &amp;nbsp;  : 0xffffa505`c9d05c80 _HANDLE_TABLE
 &amp;nbsp; +0x578 DebugPort &amp;nbsp; &amp;nbsp; &amp;nbsp;  : (null) 
 &amp;nbsp; +0x580 WoW64Process &amp;nbsp; &amp;nbsp; : (null) 
 &amp;nbsp; +0x588 DeviceMap &amp;nbsp; &amp;nbsp; &amp;nbsp;  : (null) 
 &amp;nbsp; +0x590 EtwDataSource &amp;nbsp;  : (null) 
 &amp;nbsp; +0x598 PageDirectoryPte : 0
 &amp;nbsp; +0x5a0 ImageFilePointer : 0xffffdc07`a4543500 _FILE_OBJECT
 &amp;nbsp; +0x5a8 ImageFileName &amp;nbsp;  : [15] &amp;nbsp;&quot;test_wtf_harne&quot;
 &amp;nbsp; +0x5b7 PriorityClass &amp;nbsp;  : 0x2 ''
 &amp;nbsp; +0x5b8 SecurityPort &amp;nbsp; &amp;nbsp; : (null) 
 &amp;nbsp; +0x5c0 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO
 &amp;nbsp; +0x5c8 JobLinks &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]
 &amp;nbsp; +0x5d8 HighestUserAddress : 0x00007fff`ffff0000 Void
 &amp;nbsp; +0x5e0 ThreadListHead &amp;nbsp; : _LIST_ENTRY [ 0xffffdc07`a3ab66a0 - 0xffffdc07`a3ab66a0 ]
 &amp;nbsp; +0x5f0 ActiveThreads &amp;nbsp;  : 0
 &amp;nbsp; +0x5f4 ImagePathHash &amp;nbsp;  : 0
 &amp;nbsp; +0x5f8 DefaultHardErrorProcessing : 1
 &amp;nbsp; +0x5fc LastThreadExitStatus : 0n0
 &amp;nbsp; +0x600 PrefetchTrace &amp;nbsp;  : _EX_FAST_REF
 &amp;nbsp; +0x608 LockedPagesList  : (null) 
 &amp;nbsp; +0x610 ReadOperationCount : _LARGE_INTEGER 0x0
 &amp;nbsp; +0x618 WriteOperationCount : _LARGE_INTEGER 0x0
 &amp;nbsp; +0x620 OtherOperationCount : _LARGE_INTEGER 0x0
 &amp;nbsp; +0x628 ReadTransferCount : _LARGE_INTEGER 0x0
 &amp;nbsp; +0x630 WriteTransferCount : _LARGE_INTEGER 0x0
 &amp;nbsp; +0x638 OtherTransferCount : _LARGE_INTEGER 0x0
 &amp;nbsp; +0x640 CommitChargeLimit : 0
 &amp;nbsp; +0x648 CommitCharge &amp;nbsp; &amp;nbsp; : 0x6f
 &amp;nbsp; +0x650 CommitChargePeak : 0x6f
 &amp;nbsp; +0x680 Vm &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : _MMSUPPORT_FULL
 &amp;nbsp; +0x7c0 MmProcessLinks &amp;nbsp; : _LIST_ENTRY [ 0xfffff802`3704dc68 - 0xffffdc07`a39ae840 ]
 &amp;nbsp; +0x7d0 ModifiedPageCount : 0
 &amp;nbsp; +0x7d4 ExitStatus &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0n259
 &amp;nbsp; +0x7d8 VadRoot &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : _RTL_AVL_TREE
 &amp;nbsp; +0x7e0 VadHint &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0xffffdc07`9e9cb890 Void
 &amp;nbsp; +0x7e8 VadCount &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0xa
 &amp;nbsp; +0x7f0 VadPhysicalPages : 0
 &amp;nbsp; +0x7f8 VadPhysicalPagesLimit : 0
 &amp;nbsp; +0x800 AlpcContext &amp;nbsp; &amp;nbsp;  : _ALPC_PROCESS_CONTEXT
 &amp;nbsp; +0x820 TimerResolutionLink : _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]
 &amp;nbsp; +0x830 TimerResolutionStackRecord : (null) 
 &amp;nbsp; +0x838 RequestedTimerResolution : 0
 &amp;nbsp; +0x83c SmallestTimerResolution : 0
 &amp;nbsp; +0x840 ExitTime &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : _LARGE_INTEGER 0x0
 &amp;nbsp; +0x848 InvertedFunctionTable : (null) 
 &amp;nbsp; +0x850 InvertedFunctionTableLock : _EX_PUSH_LOCK
 &amp;nbsp; +0x858 ActiveThreadsHighWatermark : 0
 &amp;nbsp; +0x85c LargePrivateVadCount : 0
 &amp;nbsp; +0x860 ThreadListLock &amp;nbsp; : _EX_PUSH_LOCK
 &amp;nbsp; +0x868 WnfContext &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null) 
 &amp;nbsp; +0x870 ServerSilo &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null) 
 &amp;nbsp; +0x878 SignatureLevel &amp;nbsp; : 0 ''
 &amp;nbsp; +0x879 SectionSignatureLevel : 0 ''
 &amp;nbsp; +0x87a Protection &amp;nbsp; &amp;nbsp; &amp;nbsp; : _PS_PROTECTION
 &amp;nbsp; +0x87b HangCount &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0y000
 &amp;nbsp; +0x87b GhostCount &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y000
 &amp;nbsp; +0x87b PrefilterException : 0y0
 &amp;nbsp; +0x87c Flags3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0
 &amp;nbsp; +0x87c Minimal &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0y0
 &amp;nbsp; +0x87c ReplacingPageRoot : 0y0
 &amp;nbsp; +0x87c Crashed &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0y0
 &amp;nbsp; +0x87c JobVadsAreTracked : 0y0
 &amp;nbsp; +0x87c VadTrackingDisabled : 0y0
 &amp;nbsp; +0x87c AuxiliaryProcess : 0y0
 &amp;nbsp; +0x87c SubsystemProcess : 0y0
 &amp;nbsp; +0x87c IndirectCpuSets  : 0y0
 &amp;nbsp; +0x87c RelinquishedCommit : 0y0
 &amp;nbsp; +0x87c HighGraphicsPriority : 0y0
 &amp;nbsp; +0x87c CommitFailLogged : 0y0
 &amp;nbsp; +0x87c ReserveFailLogged : 0y0
 &amp;nbsp; +0x87c SystemProcess &amp;nbsp;  : 0y0
 &amp;nbsp; +0x87c HideImageBaseAddresses : 0y0
 &amp;nbsp; +0x87c AddressPolicyFrozen : 0y0
 &amp;nbsp; +0x87c ProcessFirstResume : 0y0
 &amp;nbsp; +0x87c ForegroundExternal : 0y0
 &amp;nbsp; +0x87c ForegroundSystem : 0y0
 &amp;nbsp; +0x87c HighMemoryPriority : 0y0
 &amp;nbsp; +0x87c EnableProcessSuspendResumeLogging : 0y0
 &amp;nbsp; +0x87c EnableThreadSuspendResumeLogging : 0y0
 &amp;nbsp; +0x87c SecurityDomainChanged : 0y0
 &amp;nbsp; +0x87c SecurityFreezeComplete : 0y0
 &amp;nbsp; +0x87c VmProcessorHost  : 0y0
 &amp;nbsp; +0x87c VmProcessorHostTransition : 0y0
 &amp;nbsp; +0x87c AltSyscall &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0y0
 &amp;nbsp; +0x87c TimerResolutionIgnore : 0y0
 &amp;nbsp; +0x87c DisallowUserTerminate : 0y0
 &amp;nbsp; +0x880 DeviceAsid &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0n0
 &amp;nbsp; +0x888 SvmData &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : (null) 
 &amp;nbsp; +0x890 SvmProcessLock &amp;nbsp; : _EX_PUSH_LOCK
 &amp;nbsp; +0x898 SvmLock &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  : 0
 &amp;nbsp; +0x8a0 SvmProcessDeviceListHead : _LIST_ENTRY [ 0xffffdc07`a3ab6960 - 0xffffdc07`a3ab6960 ]
 &amp;nbsp; +0x8b0 LastFreezeInterruptTime : 0
 &amp;nbsp; +0x8b8 DiskCounters &amp;nbsp; &amp;nbsp; : 0xffffdc07`a3ab6b00 _PROCESS_DISK_COUNTERS
 &amp;nbsp; +0x8c0 PicoContext &amp;nbsp; &amp;nbsp;  : (null) 
 &amp;nbsp; +0x8c8 EnclaveTable &amp;nbsp; &amp;nbsp; : (null) 
 &amp;nbsp; +0x8d0 EnclaveNumber &amp;nbsp;  : 0
 &amp;nbsp; +0x8d8 EnclaveLock &amp;nbsp; &amp;nbsp;  : _EX_PUSH_LOCK
 &amp;nbsp; +0x8e0 HighPriorityFaultsAllowed : 0
 &amp;nbsp; +0x8e8 EnergyContext &amp;nbsp;  : 0xffffdc07`a3ab6b28 _PO_PROCESS_ENERGY_CONTEXT
 &amp;nbsp; +0x8f0 VmContext &amp;nbsp; &amp;nbsp; &amp;nbsp;  : (null) 
 &amp;nbsp; +0x8f8 SequenceNumber &amp;nbsp; : 0
 &amp;nbsp; +0x900 CreateInterruptTime : 0x00000003`eca0dc41
 &amp;nbsp; +0x908 CreateUnbiasedInterruptTime : 0x00000003`eca0dc41
 &amp;nbsp; +0x910 TotalUnbiasedFrozenTime : 0
 &amp;nbsp; +0x918 LastAppStateUpdateTime : 0x00000003`eca0dc41
 &amp;nbsp; +0x920 LastAppStateUptime : 0y0000000000000000000000000000000000000000000000000000000000000 (0)
 &amp;nbsp; +0x920 LastAppState &amp;nbsp; &amp;nbsp; : 0y000
 &amp;nbsp; +0x928 SharedCommitCharge : 0x51
 &amp;nbsp; +0x930 SharedCommitLock : _EX_PUSH_LOCK
 &amp;nbsp; +0x938 SharedCommitLinks : _LIST_ENTRY [ 0xffffa505`c7f48d68 - 0xffffa505`c7f49c18 ]
 &amp;nbsp; +0x948 AllowedCpuSets &amp;nbsp; : 0
 &amp;nbsp; +0x950 DefaultCpuSets &amp;nbsp; : 0
 &amp;nbsp; +0x948 AllowedCpuSetsIndirect : (null) 
 &amp;nbsp; +0x950 DefaultCpuSetsIndirect : (null) 
 &amp;nbsp; +0x958 DiskIoAttribution : (null) 
 &amp;nbsp; +0x960 DxgProcess &amp;nbsp; &amp;nbsp; &amp;nbsp; : (null) 
 &amp;nbsp; +0x968 Win32KFilterSet  : 0
 &amp;nbsp; +0x970 ProcessTimerDelay : _PS_INTERLOCKED_TIMER_DELAY_VALUES
 &amp;nbsp; +0x978 KTimerSets &amp;nbsp; &amp;nbsp; &amp;nbsp; : 0
 &amp;nbsp; +0x97c KTimer2Sets &amp;nbsp; &amp;nbsp;  : 0
 &amp;nbsp; +0x980 ThreadTimerSets  : 0
 &amp;nbsp; +0x988 VirtualTimerListLock : 0
 &amp;nbsp; +0x990 VirtualTimerListHead : _LIST_ENTRY [ 0xffffdc07`a3ab6a50 - 0xffffdc07`a3ab6a50 ]
 &amp;nbsp; +0x9a0 WakeChannel &amp;nbsp; &amp;nbsp;  : _WNF_STATE_NAME
 &amp;nbsp; +0x9a0 WakeInfo &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; : _PS_PROCESS_WAKE_INFORMATION
 &amp;nbsp; +0x9d0 MitigationFlags  : 0x20
 &amp;nbsp; +0x9d0 MitigationFlagsValues : &amp;lt;anonymous-tag&amp;gt;
 &amp;nbsp; +0x9d4 MitigationFlags2 : 0x40000000
 &amp;nbsp; +0x9d4 MitigationFlags2Values : &amp;lt;anonymous-tag&amp;gt;
 &amp;nbsp; +0x9d8 PartitionObject  : 0xffffdc07`9bcbbea0 Void
 &amp;nbsp; +0x9e0 SecurityDomain &amp;nbsp; : 0x00000001`00000069
 &amp;nbsp; +0x9e8 ParentSecurityDomain : 0x00000001`00000069
 &amp;nbsp; +0x9f0 CoverageSamplerContext : (null) 
 &amp;nbsp; +0x9f8 MmHotPatchContext : (null) 
 &amp;nbsp; +0xa00 DynamicEHContinuationTargetsTree : _RTL_AVL_TREE
 &amp;nbsp; +0xa08 DynamicEHContinuationTargetsLock : _EX_PUSH_LOCK
 &amp;nbsp; +0xa10 DynamicEnforcedCetCompatibleRanges : _PS_DYNAMIC_ENFORCED_ADDRESS_RANGES
 &amp;nbsp; +0xa20 DisabledComponentFlags : 0
 &amp;nbsp; +0xa28 PathRedirectionHashes : (null) 
​
kd&amp;gt; db @rcx+0x5a8
ffffdc07`9e8a1668  74 65 73 74 5f 77 74 66-5f 68 61 72 6e 65 00 02  test_wtf_harne..
ffffdc07`9e8a1678  00 00 00 00 00 00 00 00-e0 1c 7d 9e 07 dc ff ff  ..........}.....
ffffdc07`9e8a1688  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
ffffdc07`9e8a1698  00 00 ff ff ff 7f 00 00-a0 16 8a 9e 07 dc ff ff  ................&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;rcx+0x5a8&lt;/span&gt;&lt;span&gt;위치를 살펴보면 다음과 같이 ImageFileName이 존재하는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;+0x5a8 ImageFileName &amp;nbsp;  : [15] &amp;nbsp;&quot;test_wtf_harne&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OS 백그라운드 상에서 지속적으로 다양한 프로세스가 시작되기 때문에, 타겟 프로세스를 찾기위해 다음과 같은 스크립트를 이용하는 것이 신상에 이롭다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Debugger.txt 이름으로 다음과 같은 스크립트를 생성한다. 간단히 내용을 살펴보면, 브레이크 포인트가 걸릴 때마다 rcx+0x5a8 주소에 있는 문자열을 가져와서 ImageName이라는 변수에 저장하고, 타겟 프로세스의 이름 &quot;&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;test_wtf_har&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;&quot;가 맞는지 비교하면서, 맞으면 콜 스택을 출력하고 틀리면 그냥 계속 실행하는 코드이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;r $t0 = (rcx+0x5a8)
as /ma ${/v:ImageName} @$t0
.echo ${ImageName}
.if ($spat(@&quot;${ImageName}&quot;, &quot;*test_wtf_har*&quot;)) {kn; .echo &quot;break at target process!&quot;} .else { g }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다음과 같이 브레이크 포인트를 걸고 실행하고 vm 상에서 타켓 프로세스를 실행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;kd&amp;gt; bp nt!PspInsertProcess &quot;$$&amp;lt;C:\\Users\\Charlie\\Desktop\\fuzzing\\Debugger.txt&quot;
kd&amp;gt; g
​
...
​
kd&amp;gt; r $t0 = (rcx+0x5a8)
kd&amp;gt; as /ma ${/v:ImageName} @$t0
kd&amp;gt; .echo ${ImageName}
test_wtf_harne
kd&amp;gt; .if ($spat(@&quot;${ImageName}&quot;, &quot;*test_wtf_har*&quot;)) {kn; .echo &quot;break at target process!&quot;} .else { g }
 # Child-SP &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  RetAddr &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Call Site
00 ffff8e8d`4908adb8 fffff802`36affac8 &amp;nbsp; &amp;nbsp; nt!PspInsertProcess
01 ffff8e8d`4908adc0 fffff802`368096b5 &amp;nbsp; &amp;nbsp; nt!NtCreateUserProcess+0xd88
02 ffff8e8d`4908ba90 00007ff8`8922e634 &amp;nbsp; &amp;nbsp; nt!KiSystemServiceCopyEnd+0x25
SYMSRV:  BYINDEX: 0xA28
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\ProgramData\Dbg\sym
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ntdll.pdb
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 094B224BC5297445CF29F9C9BB588DC91
SYMSRV:  PATH: C:\ProgramData\Dbg\sym\ntdll.pdb\094B224BC5297445CF29F9C9BB588DC91\ntdll.pdb
SYMSRV:  RESULT: 0x00000000
DBGHELP: ntdll - public symbols &amp;nbsp;
 &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\ntdll.pdb\094B224BC5297445CF29F9C9BB588DC91\ntdll.pdb
SYMSRV:  BYINDEX: 0xA29
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\ProgramData\Dbg\sym
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; kernelbase.pdb
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BFA648CE3D974430D6F69BCCC300FC391
SYMSRV:  PATH: C:\ProgramData\Dbg\sym\kernelbase.pdb\BFA648CE3D974430D6F69BCCC300FC391\kernelbase.pdb
SYMSRV:  RESULT: 0x00000000
DBGHELP: KERNELBASE - public symbols &amp;nbsp;
 &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\kernelbase.pdb\BFA648CE3D974430D6F69BCCC300FC391\kernelbase.pdb
03 000000d4`6497d808 00007ff8`86b38e73 &amp;nbsp; &amp;nbsp; ntdll!NtCreateUserProcess+0x14
04 000000d4`6497d810 00007ff8`86b371a6 &amp;nbsp; &amp;nbsp; KERNELBASE!CreateProcessInternalW+0xfe3
SYMSRV:  BYINDEX: 0xA2A
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; C:\ProgramData\Dbg\sym
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; kernel32.pdb
 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BF9567320871B7B8741ED4FF2369DC5C1
SYMSRV:  PATH: C:\ProgramData\Dbg\sym\kernel32.pdb\BF9567320871B7B8741ED4FF2369DC5C1\kernel32.pdb
SYMSRV:  RESULT: 0x00000000
DBGHELP: KERNEL32 - public symbols &amp;nbsp;
 &amp;nbsp; &amp;nbsp; &amp;nbsp;  C:\ProgramData\Dbg\sym\kernel32.pdb\BF9567320871B7B8741ED4FF2369DC5C1\kernel32.pdb
05 000000d4`6497ede0 00007ff8`87fecbb4 &amp;nbsp; &amp;nbsp; KERNELBASE!CreateProcessW+0x66
06 000000d4`6497ee50 00007ff7`a2a84486 &amp;nbsp; &amp;nbsp; KERNEL32!CreateProcessWStub+0x54
07 000000d4`6497eeb0 00000000`00000001 &amp;nbsp; &amp;nbsp; 0x00007ff7`a2a84486
08 000000d4`6497eeb8 00000240`6c7e14d0 &amp;nbsp; &amp;nbsp; 0x1
09 000000d4`6497eec0 00000240`6c7ec440 &amp;nbsp; &amp;nbsp; 0x00000240`6c7e14d0
0a 000000d4`6497eec8 00000000`00000000 &amp;nbsp; &amp;nbsp; 0x00000240`6c7ec440
break at target process!
nt!PspInsertProcess:
fffff802`36afd32c 488bc4 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  mov &amp;nbsp; &amp;nbsp; rax,rsp&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 시점에서는 아직 연결리스트에 프로세스를 추가하지 않았기 때문에, &lt;/span&gt;&lt;span&gt;!process 0 0&lt;/span&gt;&lt;span&gt; 명령어로 프로세스를 확인할 수 없다. 따라서, 이제 &lt;/span&gt;&lt;span&gt;bp nt!KiStartUserThread&lt;/span&gt;&lt;span&gt;로 프로세스를 실행하기 직전 함수에 브포를 걸면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;shell&quot;&gt;&lt;code&gt;kd&amp;gt; bp nt!KiStartUserThread
kd&amp;gt; g&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;nt!KiStartUserThread&lt;/span&gt;&lt;span&gt; 에서 멈추면 앞선 과정과 마찬가지로 다음과 같이 진행하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;kd&amp;gt; !process 0 0 test_wtf_harness.exe
PROCESS ffffcf01ccf6a080
 &amp;nbsp;  SessionId: 2  Cid: 1880 &amp;nbsp;  Peb: da4e6a4000  ParentCid: 0690
 &amp;nbsp;  DirBase: 6e9b7000  ObjectTable: ffffe2090870b780  HandleCount: &amp;nbsp;44.
 &amp;nbsp;  Image: test_wtf_harness.exe
​
kd&amp;gt; .process /i /r /p ffffcf01ccf6a080
kd&amp;gt; g
​
...
​
kd&amp;gt; .sympath+ &quot;{symbol 경로}&quot;
kd&amp;gt; .reload /f /d
kd&amp;gt; bu test_wtf_harness!main
​
...
​
kd&amp;gt; g&lt;/code&gt;&lt;/pre&gt;</description>
      <category>좀 열심히 쓴 글</category>
      <category>debugging</category>
      <category>Kernel Debug</category>
      <category>user mode debug</category>
      <category>user process debug</category>
      <category>windbg</category>
      <category>windbg debug</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/418</guid>
      <comments>https://chp747.tistory.com/418#entry418comment</comments>
      <pubDate>Fri, 27 May 2022 01:28:35 +0900</pubDate>
    </item>
    <item>
      <title>Hyper-v 로그인 화면 안 뜰 때</title>
      <link>https://chp747.tistory.com/417</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 로그인 옵션 중 Hello PIN 비활성화 및 제거&lt;/p&gt;</description>
      <category>Information*/Troubleshoot</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/417</guid>
      <comments>https://chp747.tistory.com/417#entry417comment</comments>
      <pubDate>Fri, 20 May 2022 23:30:02 +0900</pubDate>
    </item>
    <item>
      <title>M1 Python package 환경구성</title>
      <link>https://chp747.tistory.com/416</link>
      <description>&lt;h1&gt;&lt;span&gt;M1&amp;nbsp;Python&amp;nbsp;package&amp;nbsp;환경구성&lt;/span&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;MINIFORGE 설치하기&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;&amp;gt; brew install miniforge
&amp;gt; conda -V
&amp;gt; conda config --set auto_activate_base false
&amp;gt; conda create -n malfinder python=3.9
&amp;gt; conda activate malfinder
# (malfinder) &amp;gt; pip install jupyterlab # 이렇게 직접 설치할 수도 있지만 m1에서는 디펜던시 문제때문에 conda-forge를 사용해야 함
(malfinder) &amp;gt; conda deactivate
​
​
&amp;gt; conda search scikit-learn
# &amp;gt; conda install -n malfinder -c conda-forge scikit-learn=1.0.1=py39hef7049f_2 # 직접 버전 설정할 때는 이렇게
&amp;gt; conda install -n malfinder -c conda-forge scikit-learn
&amp;gt; conda install -n malfinder -c conda-forge jupyterlab
&amp;gt; conda install -n malfinder -c conda-forge pandas
&amp;gt; conda install -n malfinder -c conda-forge matplotlib
​
(malfinder) &amp;gt; conda deactivate
​&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;CONDA 환경 혹은 패키지 지우기&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;&amp;gt; conda env list # conda 환경 보기
&amp;gt; conda remove -n malfinder scikit-learn # scikit-learn 패키지 삭제
&amp;gt; conda remove -n malfinder --all # malfinder 환경 지우기&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Information*/알면도움됨</category>
      <category>conda</category>
      <category>miniforge</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/416</guid>
      <comments>https://chp747.tistory.com/416#entry416comment</comments>
      <pubDate>Mon, 9 May 2022 20:03:55 +0900</pubDate>
    </item>
    <item>
      <title>Breakout from the Seccomp Unconfined Container 정리</title>
      <link>https://chp747.tistory.com/415</link>
      <description>&lt;h1&gt;Breakout from the Seccomp Unconfined Container 정리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Original Article : &lt;a href=&quot;https://tbhaxor.com/breakout-from-seccomp-confined-container/&quot;&gt;https://tbhaxor.com/breakout-from-seccomp-confined-container/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keywords : AppArmor and Seccomp of Docker options&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커에서는 일반적으로 호스트 시스템 자원(네트워크, 커널 등)에 접근할 수 없지만, &lt;code&gt;--privileged&lt;/code&gt; 옵션을 통해 컨테이너에서 호스트 시스템 자원에 접근이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 컨셉은 다음과 같다. 일반적으로 docker container는 낮은 권한에서 사용할 수 없기 때문에, &lt;code&gt;sudo docker ~&lt;/code&gt; 로 sudo 를 이용하여 실행하거나, 사용자를 docker group에 추가하여 사용한다. 이 docker group은 높은 권한을 갖고 있기 때문에 시스템 자원에 접근이 가능한데, docker group에 부여된 권한을 이용하여 권한이 없는 사용자가 호스트의 시스템 자원 &lt;code&gt;/root/flag&lt;/code&gt;에 접근하는 것이 목표이다. 일반적으로 docker firewall이 잘못된 접근을 막지만, 이 문제에서는 잘못된 firewall의 사용으로 firewall을 우회하여 시스템 자원에 접근한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 일반 사용자가 시스템 자원에 접근할 수 있는 컨테이너 생성은 Firewall에 의해 차단되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tbhaxor.com/content/images/2022/04/image-9.png&quot; alt=&quot;image1&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 docker 에서는 &lt;code&gt;privileged&lt;/code&gt; 모드로 생성되지 않은 컨테이너에 &lt;code&gt;docker exec&lt;/code&gt; 를 이용하여 &lt;code&gt;privileged&lt;/code&gt;로 쉘을 생성할 수 있다. 문제의 Firewall은 해당 동작을 탐지하지 못한다. 먼저 해당 컨테이너 내에서 root 유저의 linux capabilities를 살펴보면 다음과 같다. 이 중 cap_sys_module 이 존재하므로 커널 모듈을 로드할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tbhaxor.com/content/images/2022/04/image-10.png&quot; alt=&quot;image2&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 컨테이너 내에서 리버스 쉘 모듈을 컴파일한다. 리버스쉘 c 코드와 make 파일은 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DypYy/btrBiq3jfyA/dFsH6VYzT4Bxlnv6jn6KXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DypYy/btrBiq3jfyA/dFsH6VYzT4Bxlnv6jn6KXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DypYy/btrBiq3jfyA/dFsH6VYzT4Bxlnv6jn6KXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDypYy%2FbtrBiq3jfyA%2FdFsH6VYzT4Bxlnv6jn6KXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1936&quot; height=&quot;698&quot; data-origin-width=&quot;1936&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQOzZV/btrBiHqcViR/daKKGuOoBL6Q9qKL0siL21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQOzZV/btrBiHqcViR/daKKGuOoBL6Q9qKL0siL21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQOzZV/btrBiHqcViR/daKKGuOoBL6Q9qKL0siL21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQOzZV%2FbtrBiHqcViR%2FdaKKGuOoBL6Q9qKL0siL21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1424&quot; height=&quot;262&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태로 insmod 를 이용하여 revershell.ko 모듈을 로드하면 될 것 같지만, 기본적으로 컨테이너를 생성할 때, &lt;code&gt;seccomp&lt;/code&gt;가 걸려 system call 호출에 제약이 생긴다. 특히 &lt;code&gt;finit_module&lt;/code&gt; system call 호출에 제약이 생기기 때문에, 컨테이너 생성 시 &lt;code&gt;--security-opt seccomp=unconfined&lt;/code&gt; 옵션을 통해 seccomp 제약을 꺼야 정상적으로 리버스쉘 모듈을 로드할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;stat(&quot;/root&quot;, {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
stat(&quot;/root/reverse-shell.ko&quot;, {st_mode=S_IFREG|0644, st_size=4856, ...}) = 0
openat(AT_FDCWD, &quot;/root/reverse-shell.ko&quot;, O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=4856, ...}) = 0
mmap(NULL, 4856, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f52a9aa8000
finit_module(3, &quot;&quot;, 0)                  = -1 EPERM (Operation not permitted)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 unconfined 모드로 seccomp를 제약을 없앤 상태로 컨테이너를 생성하고 앞서 진행했던 리버스쉘 모듈을 insmod 명령어를 통해 로드하면, 사전에 실행해놨던 netcat 프로세스에 리버스쉘이 붙는 걸 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PMDv7/btrBiaGos4n/OIHTfeg6DFWPbZRWwSckcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PMDv7/btrBiaGos4n/OIHTfeg6DFWPbZRWwSckcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PMDv7/btrBiaGos4n/OIHTfeg6DFWPbZRWwSckcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPMDv7%2FbtrBiaGos4n%2FOIHTfeg6DFWPbZRWwSckcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1744&quot; height=&quot;140&quot; data-origin-width=&quot;1744&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 리버스쉘로 호스트 시스템 자원에 접근할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://tbhaxor.com/content/images/2022/04/image-17.png&quot; alt=&quot;image3&quot; /&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Conclusion&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker group에 할당된 권한을 이용하여, 사용자가 컨테이너를 통해 시스템 자원에 접근한다는 시나리오인데, 이 글을 읽어보면서 몇가지 재밌는 개념을 배웠다. docker 에서 사용하는 privileged 옵션이나 seccomp와 관련된 security-opt 옵션을 새로 알았고, 특히나 linux capabilities에 해당하는 개념을 새로 알게 된 게 컸다. &lt;a href=&quot;https://man7.org/linux/man-pages/man7/capabilities.7.html&quot;&gt;Link&lt;/a&gt; (위에서 언급된 capabilities에 대한 man page) / &lt;a href=&quot;https://book.hacktricks.xyz/linux-hardening/privilege-escalation/linux-capabilities&quot;&gt;Link&lt;/a&gt; Capabilties를 이용하여 프로세스의 권한같은 거를 검사한다고 하는데, permission denied 같은게 이거를 검사해서 발생하는 거라고 한다. 요부분은 나중에 따로 정리해야겠당. 암튼 흥미로운 글이었음.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;References&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://tbhaxor.com/breakout-from-seccomp-confined-container/&quot;&gt;https://tbhaxor.com/breakout-from-seccomp-confined-container/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://attackdefense.com/challengedetails?cid=1534&quot;&gt;https://attackdefense.com/challengedetails?cid=1534&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man7/capabilities.7.html&quot;&gt;https://man7.org/linux/man-pages/man7/capabilities.7.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://book.hacktricks.xyz/linux-hardening/privilege-escalation/linux-capabilities&quot;&gt;https://book.hacktricks.xyz/linux-hardening/privilege-escalation/linux-capabilities&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Information*/알면도움됨</category>
      <category>apparmor</category>
      <category>container</category>
      <category>docker</category>
      <category>Firewall</category>
      <category>privileged</category>
      <category>seccomp</category>
      <author>ch4rli3kop</author>
      <guid isPermaLink="true">https://chp747.tistory.com/415</guid>
      <comments>https://chp747.tistory.com/415#entry415comment</comments>
      <pubDate>Wed, 4 May 2022 23:48:32 +0900</pubDate>
    </item>
  </channel>
</rss>