<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>13 Security Lab</title>
    <link>https://code13.tistory.com/</link>
    <description>Software, Security, Data Science
How to make world better</description>
    <language>ko</language>
    <pubDate>Sat, 30 May 2026 03:51:31 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Maj0r Tom</managingEditor>
    <item>
      <title>Wireshark HTTPS 분석방법</title>
      <link>https://code13.tistory.com/279</link>
      <description>&lt;h1 data-ke-size=&quot;size16&quot;&gt;Wireshark HTTPS Decryption&lt;br /&gt;Wireshark TLS Decryption&amp;nbsp;&lt;br /&gt;Wireshark SSL Decryption&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wireshark HTTPS 분석방법 이해에 대해서 다룬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL 통신 및 HTTPS 송수신 데이터를 복호화 분석하는 방법 정리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wireshark 에서 이를 복호화해서 평문형태로 보여주는 기능을 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Decryption 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wireshark는 적절한 키가 제공되면 TLS Decryption 가능. 지원 가능한 방법은 아래 두가지이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RSA 개인 키를 사용한 복호화.&amp;nbsp; &amp;nbsp; &amp;nbsp;. . . 1)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;세션별 ​​비밀키 로그 파일(&lt;span&gt;&amp;nbsp;&lt;/span&gt;#Usingthe (Pre)-Master Secret&lt;span&gt;&amp;nbsp;&lt;/span&gt;).&amp;nbsp; &amp;nbsp; &amp;nbsp;. . . 2)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Wireshark TLS Decryption 문서참고&lt;br /&gt;https://wiki.wireshark.org/TLS#tls-decryption&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Edit &amp;gt;&amp;nbsp; Preferences.. 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NpuFE/btrwsInIWWs/UyxcI5UCQxvDDaLG3diXtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NpuFE/btrwsInIWWs/UyxcI5UCQxvDDaLG3diXtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NpuFE/btrwsInIWWs/UyxcI5UCQxvDDaLG3diXtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNpuFE%2FbtrwsInIWWs%2FUyxcI5UCQxvDDaLG3diXtk%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;290&quot; height=&quot;497&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol &amp;gt; TLS 선택,&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mFO6O/btrwzb3HvVo/I998zHIl7TTk4LnGRuvGSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mFO6O/btrwzb3HvVo/I998zHIl7TTk4LnGRuvGSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mFO6O/btrwzb3HvVo/I998zHIl7TTk4LnGRuvGSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmFO6O%2Fbtrwzb3HvVo%2FI998zHIl7TTk4LnGRuvGSk%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;1230&quot; height=&quot;531&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RSA key 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RSA keys list 에서 선택, 서버의 Private Key (pem key) 를 넣어주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버의 PrivateKey를 가지고 있고, 서버가 RSA공개키 방식을 사용하는 경우 사용가능 (서버관리자 또는 테스트 분석에 사용가능할 듯)&lt;/p&gt;
&lt;pre id=&quot;code_1647787851228&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# https_ssl.key
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCmhjzTShoeFYLg
...
+ci6O0z5TLaxlFJxlBRJcv2AvLjp+dAC8XtabW1HwL0xXkdkNontZmiVUXwkEdRv
cFcv8m+/swQeAcpUi/qsQZY=
-----END PRIVATE KEY-----&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;*클라이언트&lt;span&gt;&amp;nbsp;&lt;/span&gt;인증서나 인증 기관(CA) 인증서가 아님에 주의&lt;/i&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RSA Key를 이용하는 경우 제한사항&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Diffie Hellmann (DHE) ciphers 를 이용하는 경우 안됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSGPaw/btrwPa5TnH9/U1G1GjUvS0nRvKQ4CsUkK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSGPaw/btrwPa5TnH9/U1G1GjUvS0nRvKQ4CsUkK0/img.png&quot; data-alt=&quot;Elliptic-curve Diffie&amp;amp;amp;ndash;Hellman (ECDHE)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSGPaw/btrwPa5TnH9/U1G1GjUvS0nRvKQ4CsUkK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSGPaw%2FbtrwPa5TnH9%2FU1G1GjUvS0nRvKQ4CsUkK0%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;695&quot; height=&quot;257&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Elliptic-curve Diffie&amp;amp;ndash;Hellman (ECDHE)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5LZvn/btrwWgKo3Ed/klAAHIlsV6QkoSzFNK91K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5LZvn/btrwWgKo3Ed/klAAHIlsV6QkoSzFNK91K1/img.png&quot; data-alt=&quot;RSA&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5LZvn/btrwWgKo3Ed/klAAHIlsV6QkoSzFNK91K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5LZvn%2FbtrwWgKo3Ed%2FklAAHIlsV6QkoSzFNK91K1%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;682&quot; height=&quot;257&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RSA&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;New TLS 1.3 protocol 이상은 안됨 (TLS 1.2 버전 이하)&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TLS 1.3 이상을 지원하지 않는 것이 아니라 TLS1.3 프로토콜 상 RSA 키를 사용할 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;만약 TLS1.3 or DHE를 사용한 상태에서 Private RSA Key를 사용한 Decryption을 시도한다면?&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;Wireshark TLS Decryption TLS Debug file log 를 보면 MasterKey를 찾을 수 없어 실패했다는 로그가 찍힌다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;How to check what SSL/TLS protocols are enabled in Apache configuration?&lt;/b&gt;&lt;br /&gt;[ CentOS/RHEL-based distributions ]&lt;br /&gt;&amp;gt; grep SSLProtocol /etc/httpd/conf.d/ssl.conf&lt;br /&gt;SSLProtocol +TLSv1.2&lt;br /&gt;[ Debian/Ubuntu-based distributions ]&lt;br /&gt;&amp;gt; grep -ir SSLProtocol /etc/apache2/*&lt;br /&gt;/etc/apache2/mods-available/ssl.conf:SSLProtocol +TLSv1.2 +TLSv1.3&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*OpenSSL 1.1.1 부터 TLS1.3 공식 릴리즈에 반영 (OpenSSL 1.0.1 부터 TLS1.2 반영)&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;#&amp;nbsp;Apache&amp;nbsp;Version&lt;br /&gt;apache2&amp;nbsp;-version&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;Output&lt;br /&gt;Server&amp;nbsp;version:&amp;nbsp;Apache/2.4.41&amp;nbsp;(Ubuntu)&lt;br /&gt;Server&amp;nbsp;built:&amp;nbsp;&amp;nbsp;&amp;nbsp;2020-04-13T17:19:17&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;OpenSSL&amp;nbsp;Version&lt;br /&gt;openssl&amp;nbsp;version&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;Output&lt;br /&gt;OpenSSL&amp;nbsp;1.1.1f&amp;nbsp;&amp;nbsp;31&amp;nbsp;Mar&amp;nbsp;2020&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size16&quot;&gt;강제로 TLS 특정버전 사용하게 하는 세팅&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ Apache ]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/etc/apache2/mods-available/ssl.conf&lt;/p&gt;
&lt;pre id=&quot;code_1647870887453&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#   The protocols to enable.
#   Available values: all, SSLv3, TLSv1, TLSv1.1, TLSv1.2
#   SSL v2  is no longer supported

# SSLProtocol all -SSLv3 # 주석처리 하고 작성
SSLProtocol -all +TLSv1.2 # 지원되는 프로토콜 전부(all)을 제외하고 TLSv1.2 추가
# 결국 TLSv1.2만 사용하도록 강제함&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;[ XAMPP ]&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;/opt/lampp/etc/httpd.conf&lt;/p&gt;
&lt;pre id=&quot;code_1648018465503&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# line 488
# Virtual hosts
Include etc/extra/httpd-vhosts.conf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/opt/lampp/etc/extra/httpd-vhosts.conf&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1647874642024&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Non-SSL or http hosts                                                                                                                                                                                                            
&amp;lt;VirtualHost *:80&amp;gt;                                                                                                                                                                                                                 
       DocumentRoot &quot;/opt/lampp/htdocs/&quot;                                                                                                                                                                                           
       ServerName localhost                                                                                                                                                                                                        
                                                                                                                                                                                                                                   
&amp;lt;/VirtualHost&amp;gt;                                                                                                                                                                                                                     
                                                                                                                                                                                                                                   
&amp;lt;VirtualHost *:80&amp;gt;                                                                                                                                                                                                                 
       DocumentRoot &quot;/opt/lampp/htdocs/test/&quot;
       ServerName test.local.com
&amp;lt;/VirtualHost&amp;gt;

# SSL or https Hosts
&amp;lt;VirtualHost *:443&amp;gt;
       DocumentRoot &quot;/opt/lampp/htdocs/test/&quot;
       ServerName test.local.com
       SSLEngine on
       SSLCertificateFile &quot;/home/username/Documents/https_ssl.crt&quot;
       SSLCertificateKeyFile &quot;/home/username/Documents/https_ssl.key&quot;
       #SSLProxyProtocol -all +TLSv1.2
       SSLProtocol -all +TLSv1.2
       SSLCipherSuite AES256-SHA
&amp;lt;/VirtualHost&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*AES256-SHA : TLS_RSA_WITH_AES_256_CBC_SHA&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvoFZl/btrwMGqsAA1/m5RcPweHK5bz92QHcDF3x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvoFZl/btrwMGqsAA1/m5RcPweHK5bz92QHcDF3x0/img.png&quot; data-alt=&quot;tlsv1.2 설정 후 통신패킷 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvoFZl/btrwMGqsAA1/m5RcPweHK5bz92QHcDF3x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvoFZl%2FbtrwMGqsAA1%2Fm5RcPweHK5bz92QHcDF3x0%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;1253&quot; height=&quot;218&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;tlsv1.2 설정 후 통신패킷 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHZKS3/btrw7QSbhtd/GFYpHMZAk1SSbmtt3ZjvNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHZKS3/btrw7QSbhtd/GFYpHMZAk1SSbmtt3ZjvNk/img.png&quot; data-alt=&quot;CipherSuite RSA_AES_256_CBC_SHA 적용 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHZKS3/btrw7QSbhtd/GFYpHMZAk1SSbmtt3ZjvNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHZKS3%2Fbtrw7QSbhtd%2FGFYpHMZAk1SSbmtt3ZjvNk%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;1026&quot; height=&quot;397&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CipherSuite RSA_AES_256_CBC_SHA 적용 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Test Apache&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# Test Apache for TLS 1
curl -I -v --tlsv1 --tls-max 1.0 https://www.example.com/

# Test Apache for TLS 1.1
curl -I -v --tlsv1.1 --tls-max 1.1 https://www.example.com/

# Test Apache for TLS 1.2
curl -I -v --tlsv1.2 --tls-max 1.2 https://www.example.com/

# Test Apache for TLS 1.3
curl -I -v --tlsv1.3 --tls-max 1.3 https://www.example.com/&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;세션별 비밀키 방식&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Pre)-Master-Secret log filename 에서 키로그 파일 선택&lt;/p&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;&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;키로그 파일을 생성하는 방법 1 환경변수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수에서 SSLKEYLOGFILE 경로를 설정 (Key: &quot;SSLKEYLOGFILE&quot;, Value: &quot;키로그파일 생성 될 경로&quot;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXIIuV/btrwp1uM1Uv/EbgicsatDk4EOw54QaWy8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXIIuV/btrwp1uM1Uv/EbgicsatDk4EOw54QaWy8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXIIuV/btrwp1uM1Uv/EbgicsatDk4EOw54QaWy8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXIIuV%2Fbtrwp1uM1Uv%2FEbgicsatDk4EOw54QaWy8k%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;927&quot; height=&quot;609&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;b&gt;*SSLKEYLOGFILE&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;The key log file is a text file generated by applications such as Firefox, Chrome and curl when the &lt;b&gt;SSLKEYLOGFILE&lt;/b&gt; environment variable is set. To be precise, their underlying library (NSS, OpenSSL or boringssl) writes the required per-session secrets to a file.&lt;br /&gt;&lt;b&gt;SSLKEYLOGFILE&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;은 환경 변수가 설정 되면 Firefox, Chrome 및 curl과 같은 응용 프로그램에서 생성되는 텍스트 파일 입니다. 정확히 말하면 기본 라이브러리(NSS, OpenSSL 또는boringssl)가 필요한 세션별 비밀을 파일에 기록합니다.&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;키로그 파일을 생성하는 방법 2 Powershell로 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1647786920833&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PS &amp;gt; SetX SSLKEYLOGFILE &quot;$(get-location)\ssl.log&quot;
Verify that the variable has been set in a separate powershell window (SetX does not apply to the current window).

PS &amp;gt; Get-ChildItem ENV: | findstr SSLKEYLOGFILE
SSLKEYLOGFILE                  C:\Users\rj\Desktop\ssl.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;키로그 파일을 생성하는 방법 2 어플리케이션 옵션으로 설정&lt;/h4&gt;
&lt;pre id=&quot;code_1647787010767&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;C:\Program Files\Google\Chrome\Application\chrome.exe&quot; --ssl-key-log-file=%USERPROFILE%\sslkey.log&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;키로그 파일 생성이 안되는 경우 해결 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) (stackoverflow.com article) You MUST be sure chrome totally be closed. And then reopen a fresh new chrome instance. Chrome has a default options let chrome run in background enabled.&lt;br /&gt;Double&amp;nbsp;check&amp;nbsp;your&amp;nbsp;taskbar&amp;nbsp;of&amp;nbsp;windows&amp;nbsp;or&amp;nbsp;processes&amp;nbsp;lists&amp;nbsp;to&amp;nbsp;make&amp;nbsp;sure&amp;nbsp;there's&amp;nbsp;no&amp;nbsp;chrome&amp;nbsp;instance&amp;nbsp;exists.&lt;br /&gt;That's why --ssl-key-log-file don't working, chrome stills alive after you click exit button.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) (Wireshark Docs) SSLKEYLOGFILE필요에 따라 경로를 변경하고&amp;nbsp;Chrome용으로 바꿉니다&amp;nbsp;firefox.&amp;nbsp;chrome이 메커니즘은 Safari, Microsoft Edge 및 기타 TLS 라이브러리(Microsoft SChannel/Apple&amp;nbsp;SecureTransport&amp;nbsp;)가 이 메커니즘을 지원하지 않기 때문에 작동하지 않습니다.&amp;nbsp;이 메커니즘은 웹 브라우저 이외의 애플리케이션에서도 작동하지만 애플리케이션에서 사용하는 TLS 라이브러리에 따라 다릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Decrypted TLS Example&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blDG76/btrw64JWpkC/1PBt2Go1yQSts5k9k9i0P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blDG76/btrw64JWpkC/1PBt2Go1yQSts5k9k9i0P0/img.png&quot; data-alt=&quot;Decrypted TLS packet in Wireshark&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blDG76/btrw64JWpkC/1PBt2Go1yQSts5k9k9i0P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblDG76%2Fbtrw64JWpkC%2F1PBt2Go1yQSts5k9k9i0P0%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;629&quot; height=&quot;668&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;824&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Decrypted TLS packet in Wireshark&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hxxps://wiki.wireshark.org/TLS#tls-decryption&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hxxps://accedian.com/blog/how-to-decrypt-an-https-exchange-with-wireshark/&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hxxps://unit42.paloaltonetworks.com/wireshark-tutorial-decrypting-https-traffic/&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apache.tutorials24x7.com/blog/how-to-enable-tls-1-2-and-tls-1-3-in-apache-web-server&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hxxps://www.lesstif.com/software-architect/curl-ssl-tls-version-113346985.html&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hxxps://wiki.openssl.org/index.php/TLS1.3#Groups&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hxxps://blog.didierstevens.com/2020/12/14/decrypting-tls-streams-with-wireshark-part-1/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Security/Security Articles</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/279</guid>
      <comments>https://code13.tistory.com/279#entry279comment</comments>
      <pubDate>Tue, 15 Mar 2022 19:37:56 +0900</pubDate>
    </item>
    <item>
      <title>What &amp;quot;Calling Convention&amp;quot; means?</title>
      <link>https://code13.tistory.com/277</link>
      <description>&lt;h2 data-ke-size=&quot;size16&quot;&gt;Calling Convention ?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;; 함수 호출 규약&amp;nbsp;&lt;br /&gt;호출자(caller)와&amp;nbsp;피호출자(callee)&amp;nbsp;간의&amp;nbsp;함수의&amp;nbsp;인자를&amp;nbsp;전달하는&amp;nbsp;방식에&amp;nbsp;대한&amp;nbsp;규약을&amp;nbsp;정의&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 호출 규약은 아키텍처마다 다를 수 있음 (예: x86, ARM, x86-64, MIPS 등)&lt;/li&gt;
&lt;li&gt;같은 아키텍처 내에서도 다양한 이유로 다양한 호출 규약을 가질 수 있음&lt;/li&gt;
&lt;li&gt;프로그래밍 언어에 따라, 컴파일러의 구현에 따라 함수 호출 규약이 다르게 정의되거나 구현&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size16&quot;&gt;Calling Convention 종류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 호출 규약은 4가지 기준으로 그 종류가 나뉜다&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Parameter 전달 방법 &lt;br /&gt;스택 프레임 사용해서 parameter 전달, 레지스터 사용해서 parameter 전달&lt;/li&gt;
&lt;li&gt;Parameter 전달 순서 &lt;br /&gt;함수명( param1, param2, param3, ....) 에서 어떤 parameter부터 먼저 전달 할 것인가?&lt;/li&gt;
&lt;li&gt;함수 리턴 값 전달 방법 &lt;br /&gt;함수 리턴 값을 어디에 저장해서, 돌려줄 것인가?&lt;/li&gt;
&lt;li&gt;함수 호출간 사용했던 stack frame을 정리하는 방법 &lt;br /&gt;함수 사용이 끝난후에, 사용했던 stack frame을 공간을 누가 정리할 것인가?&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;e.g.&lt;br /&gt;void __stdcall add( int a, int a );&lt;br /&gt;int __cdcl add(int a, int b);&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 91.8605%; height: 219px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;호출 규약&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;스택 정리&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;인수전달&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;&lt;/b&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;이름규칙&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;__&lt;/span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;cdecl&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;호출원&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;오른쪽 먼저&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;_함수명&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;__&lt;/span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;stdcall&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;함수&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;오른쪽 먼저&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;_함수명@인수크기&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;__&lt;/span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;fastcall&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;함수&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;오른쪽 먼저&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(ECX, EDX가장 먼저)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;@함수명@인수크기&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #3a32c3;&quot;&gt;thiscall&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;함수&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;오른쪽 먼저&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(this 포인터는 ecx레지스터로 전달)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;C++이름 규칙을 따름&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;__cdecl&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c언어는 기본적으로 cdecl 방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rx9Ie/btru9QGVNpA/Mou3X1k6TFrVytmvhY3fvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rx9Ie/btru9QGVNpA/Mou3X1k6TFrVytmvhY3fvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rx9Ie/btru9QGVNpA/Mou3X1k6TFrVytmvhY3fvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frx9Ie%2Fbtru9QGVNpA%2FMou3X1k6TFrVytmvhY3fvK%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;578&quot; height=&quot;303&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리턴 값&lt;/b&gt; : eax에 리턴값 저장&lt;br /&gt;(리턴 값이 4 &amp;lt; x &amp;lt; 8byte 경우 : 상위 4바이트 edx / 하위 4바이트는 eax)&lt;br /&gt;&lt;b&gt;stack frame 정리 방법&lt;/b&gt; &lt;br /&gt;caller(호출한&amp;nbsp;함수)가&amp;nbsp;callee(호출된&amp;nbsp;함수)의&amp;nbsp;stack&amp;nbsp;frame&amp;nbsp;공간을&amp;nbsp;정리함 &lt;br /&gt;add&amp;nbsp;&amp;nbsp;esp, (total parameter size)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ &lt;b&gt;cdecl&lt;/b&gt;에서 callee의 스택프레임을 &lt;b&gt;caller가 정리&lt;/b&gt;&amp;nbsp;&lt;b&gt;이유&lt;/b&gt;&lt;br /&gt;: &lt;b&gt;가변인자 함수&lt;/b&gt;(파라메터 개수 제한 x, e.g. printf( ) ) 때문&lt;br /&gt;printf(&amp;nbsp;&quot;a=%d,&amp;nbsp;b=%d,&amp;nbsp;c=%d,&amp;nbsp;d=%d&quot;,&amp;nbsp;n1,n2,n3,n4&amp;nbsp;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;printf(&quot;a=%d,&amp;nbsp;b=%d&quot;,&amp;nbsp;n1,n2)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size16&quot;&gt;__stdcall&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C lang은 기본적으로 cdecl 방식, stdcall 방식으로 컴파일 시 함수명 앞에 '_stdcall' 키워드를 붙인다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&amp;nbsp;윈도우에서&amp;nbsp;사용하고&amp;nbsp;있는&amp;nbsp;표준&amp;nbsp;호출&amp;nbsp;규약.&amp;nbsp;&lt;b&gt;windows&amp;nbsp;API&lt;/b&gt;는&amp;nbsp;stdcall을&amp;nbsp;따른다&amp;nbsp;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UB7Ae/btrvbiQyxGW/9kr085uzjWOy8Qk8aKqst0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UB7Ae/btrvbiQyxGW/9kr085uzjWOy8Qk8aKqst0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UB7Ae/btrvbiQyxGW/9kr085uzjWOy8Qk8aKqst0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUB7Ae%2FbtrvbiQyxGW%2F9kr085uzjWOy8Qk8aKqst0%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;584&quot; height=&quot;299&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;e.g ret 8 (RETN + POP 8)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;리턴 값&lt;/b&gt; : &amp;nbsp;eax에 리턴값 저장&lt;br /&gt;(리턴 값이 4 &amp;lt; x &amp;lt; 8byte 경우 : 상위 4바이트 edx / 하위 4바이트는 eax)&lt;br /&gt;&lt;b&gt;stack frame 정리 방법&lt;/b&gt; &lt;br /&gt;&lt;b&gt;callee&lt;/b&gt;(호출된 함수)가 자신의 stack frame 공간을&lt;b&gt;&amp;nbsp;정리&lt;/b&gt;함&lt;br /&gt;&amp;nbsp; &lt;br /&gt;# stack frame 정리하는 어셈 코드 : ret&amp;nbsp;&amp;nbsp;커맨드 사용&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;Name Decoration&lt;br /&gt;func&amp;nbsp;&amp;nbsp;--&amp;gt;&amp;nbsp;&amp;nbsp;_func@파라메터&amp;nbsp;총&amp;nbsp;합&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;__fastcall&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( critical한 성능을 요구하는 일부 함수에서 사용. 윈도우 커널의 함수) &lt;br /&gt;Parameter&amp;nbsp;전달&amp;nbsp;방법 &lt;br /&gt;레지스터&amp;nbsp;사용해서&amp;nbsp;파라메터&amp;nbsp;전달 &lt;br /&gt;: 처음 2개의 파라메터는 스택을 사용하지 않고, &lt;b&gt;ecx&lt;/b&gt;와&amp;nbsp;&lt;b&gt;edx&lt;/b&gt; 를 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;사용해서 전달.&lt;br /&gt;리턴 값: eax에 리턴값 저장 &lt;br /&gt;(리턴 값이 4 &amp;lt; x &amp;lt; 8byte 경우 : 상위 4바이트 edx / 하위 4바이트는 eax)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;stack frame 정리 방법:&amp;nbsp; callee(호출된&amp;nbsp;함수)가&amp;nbsp;자신의&amp;nbsp;stack&amp;nbsp;frame&amp;nbsp;공간을&amp;nbsp;직접&amp;nbsp;정리함&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예외사항 (Saved-Register)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의&amp;nbsp;디스어셈블리&amp;nbsp;코드에서,&amp;nbsp;ESI&amp;nbsp;레지스터에는&amp;nbsp;ShoWindow와&amp;nbsp;&amp;nbsp;UpdateWindow에&amp;nbsp;파라메터로&amp;nbsp;전달되어질&amp;nbsp;&amp;nbsp;hWnd&amp;nbsp;값이&amp;nbsp;들어가&amp;nbsp;있다.&lt;br /&gt;push&amp;nbsp;&amp;nbsp;&amp;nbsp;eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;&amp;nbsp;nCmdShow &lt;br /&gt;push&amp;nbsp;&amp;nbsp;&amp;nbsp;esi&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;&amp;nbsp;hWnd &lt;br /&gt;call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ds:ShowWindow &lt;br /&gt;push&amp;nbsp;&amp;nbsp;&amp;nbsp;esi &lt;br /&gt;call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ds:UpdateWindow &lt;br /&gt;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;eax,&amp;nbsp;1 &lt;br /&gt;pop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esi &lt;br /&gt;retn&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;때&amp;nbsp;만약&amp;nbsp;첫&amp;nbsp;번째로&amp;nbsp;호출되어지는&amp;nbsp;ShowWindow&amp;nbsp;함수&amp;nbsp;내부에서&amp;nbsp;ESI&amp;nbsp;레지스터의&amp;nbsp;내용을&amp;nbsp;바꾸어&amp;nbsp;놓았다면 &lt;br /&gt;이&amp;nbsp;ESI&amp;nbsp;레지스터를&amp;nbsp;사용하고자&amp;nbsp;했던&amp;nbsp;UpdateWindow&amp;nbsp;함수에서는&amp;nbsp;전혀&amp;nbsp;엉뚱한&amp;nbsp;결과를&amp;nbsp;얻게&amp;nbsp;될&amp;nbsp;것이다 &lt;br /&gt;(엉뚱한&amp;nbsp;hWnd&amp;nbsp;값이&amp;nbsp;UpdateWindow에&amp;nbsp;전달되었으므로) &lt;br /&gt;&amp;nbsp; &lt;br /&gt;우리가&amp;nbsp;사용하는&amp;nbsp;Windows의&amp;nbsp;컴파일러들은&amp;nbsp;이러한&amp;nbsp;문제를&amp;nbsp;피하기&amp;nbsp;위해&amp;nbsp;Saved-&amp;nbsp;Register&amp;nbsp;를&amp;nbsp;사용하여 &lt;br /&gt;함수들간의&amp;nbsp;레지스터&amp;nbsp;사용의&amp;nbsp;충돌을&amp;nbsp;피하고&amp;nbsp;있다.&amp;nbsp;아래&amp;nbsp;표는,&amp;nbsp;32&amp;nbsp;bit&amp;nbsp;Windows를&amp;nbsp;기준으로&amp;nbsp;한&amp;nbsp;값이다. &lt;br /&gt;&lt;br /&gt;Caller&amp;nbsp;saved&amp;nbsp;register,&amp;nbsp;Callee&amp;nbsp;saved&amp;nbsp;register&amp;nbsp;는&amp;nbsp;중간에&amp;nbsp;변경될&amp;nbsp;수&amp;nbsp;없다. &lt;br /&gt;모든&amp;nbsp;함수는&amp;nbsp;main(&amp;nbsp;)&amp;nbsp;에서&amp;nbsp;호출되기&amp;nbsp;때문에,&amp;nbsp;callee&amp;nbsp;saved&amp;nbsp;register를&amp;nbsp;백업해야&amp;nbsp;하고, &lt;br /&gt;main(&amp;nbsp;)도&amp;nbsp;main_crc_Startup(&amp;nbsp;)&amp;nbsp;에&amp;nbsp;의해서&amp;nbsp;호출되기&amp;nbsp;때문에&amp;nbsp;callee가&amp;nbsp;된다. &lt;br /&gt;(함수 호출규약의 caller, callee는 함수 호출 시점에 따라 변경되지만, 여기서의 caller, callee의 의미는 다르다) &lt;br /&gt;&lt;br /&gt;정리를&amp;nbsp;하면,&amp;nbsp;main(&amp;nbsp;)를&amp;nbsp;비롯한&amp;nbsp;프로그래머가&amp;nbsp;작성한&amp;nbsp;모든&amp;nbsp;함수는&amp;nbsp;callee&amp;nbsp;savaed&amp;nbsp;register를&amp;nbsp;백업하고, &lt;br /&gt;시스템&amp;nbsp;함수는&amp;nbsp;caller&amp;nbsp;saved&amp;nbsp;register를&amp;nbsp;백업함. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caller&amp;nbsp;saved&amp;nbsp;register &lt;/b&gt;&lt;br /&gt;(Caller가&amp;nbsp;save해야&amp;nbsp;하는&amp;nbsp;레지스터) &lt;br /&gt;EAX,&amp;nbsp;ECX,&amp;nbsp;EDX &lt;br /&gt;(eax,&amp;nbsp;ecx,&amp;nbsp;edx는&amp;nbsp;caller가&amp;nbsp;백업&amp;nbsp;받아&amp;nbsp;놓고,&amp;nbsp;callee가&amp;nbsp;마음대로&amp;nbsp;eax,&amp;nbsp;ecx,&amp;nbsp;edx &lt;br /&gt;&amp;nbsp;를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다) &lt;br /&gt;&lt;b&gt;Callee&amp;nbsp;saved&amp;nbsp;register &lt;/b&gt;&lt;br /&gt;(Callee가&amp;nbsp;save&amp;nbsp;해야&amp;nbsp;하는&amp;nbsp;레지스터) &lt;br /&gt;EBX,&amp;nbsp;ESI,&amp;nbsp;EDI,&amp;nbsp;EBP &lt;br /&gt;(ebx,&amp;nbsp;esi,&amp;nbsp;edi,&amp;nbsp;ebp는&amp;nbsp;callee가&amp;nbsp;백업&amp;nbsp;받아&amp;nbsp;놓고,&amp;nbsp;caller가&amp;nbsp;마음대로&amp;nbsp;ebx,&amp;nbsp;esi,&amp;nbsp; &lt;br /&gt;&amp;nbsp;edi,&amp;nbsp;ebp를&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다) &lt;br /&gt;&amp;nbsp;&amp;nbsp;-&amp;nbsp;ebp는&amp;nbsp;함수&amp;nbsp;prolog&amp;nbsp;과정을&amp;nbsp;통해&amp;nbsp;SFP(Saved&amp;nbsp;Frame&amp;nbsp;Pointer)라는&amp;nbsp;값으 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;로&amp;nbsp;스택프레임이&amp;nbsp;저장이&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;*&amp;nbsp;Callee는&amp;nbsp;Callee&amp;nbsp;saved&amp;nbsp;register를&amp;nbsp;사용하려&amp;nbsp;할&amp;nbsp;경우&amp;nbsp;반드시&amp;nbsp;백업을&amp;nbsp;하고 &lt;br /&gt;&amp;nbsp;&amp;nbsp;사용해야&amp;nbsp;하며&amp;nbsp;함수&amp;nbsp;복귀&amp;nbsp;전&amp;nbsp;다시&amp;nbsp;값을&amp;nbsp;복원해야&amp;nbsp;함 &lt;br /&gt;&amp;nbsp;&amp;nbsp;(Callee&amp;nbsp;입장에서는&amp;nbsp;Caller가&amp;nbsp;해당&amp;nbsp;레지스터를&amp;nbsp;사용했는지&amp;nbsp;알지&amp;nbsp;못하므로 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;무조건&amp;nbsp;백업을&amp;nbsp;수행&amp;nbsp;후&amp;nbsp;사용해야&amp;nbsp;함)​&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pjVtx/btru6M6FChe/wJgF6CV7Aemk5Dg41IwU41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pjVtx/btru6M6FChe/wJgF6CV7Aemk5Dg41IwU41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pjVtx/btru6M6FChe/wJgF6CV7Aemk5Dg41IwU41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpjVtx%2Fbtru6M6FChe%2FwJgF6CV7Aemk5Dg41IwU41%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;625&quot; height=&quot;340&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hxxps://blog.naver.com/PostView.naver?blogId=tjdghkgkdl&amp;amp;logNo=10117639381&amp;nbsp;&amp;nbsp;&lt;br /&gt;hxxps://blog.naver.com/PostView.naver?blogId=tjdghkgkdl&amp;amp;logNo=10117777106&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Security/Analysis</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/277</guid>
      <comments>https://code13.tistory.com/277#entry277comment</comments>
      <pubDate>Sun, 20 Feb 2022 20:48:50 +0900</pubDate>
    </item>
    <item>
      <title>nmap Scan OS version information</title>
      <link>https://code13.tistory.com/274</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HEzJE/btq0flc19SD/QKJwLqUJXynFwiRV1hEdtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HEzJE/btq0flc19SD/QKJwLqUJXynFwiRV1hEdtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HEzJE/btq0flc19SD/QKJwLqUJXynFwiRV1hEdtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHEzJE%2Fbtq0flc19SD%2FQKJwLqUJXynFwiRV1hEdtK%2Fimg.png&quot; data-filename=&quot;111.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;720&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Nmap&amp;nbsp;&lt;br /&gt;Network Mapper ; Open source network scanner&lt;/h1&gt;
&lt;p&gt;Nmap은&amp;nbsp;패킷&amp;nbsp;을&amp;nbsp;전송&amp;nbsp;하고&amp;nbsp;응답을&amp;nbsp;분석하여&amp;nbsp;컴퓨터&amp;nbsp;네트워크&amp;nbsp;에서&amp;nbsp;호스트&amp;nbsp;와&amp;nbsp;서비스&amp;nbsp;를&amp;nbsp;발견하는&amp;nbsp;데&amp;nbsp;사용&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Nmap은&amp;nbsp;IP&amp;nbsp;패킷을&amp;nbsp;사용하여&amp;nbsp;네트워크에&amp;nbsp;연결된&amp;nbsp;모든&amp;nbsp;장치를&amp;nbsp;식별하고&amp;nbsp;실행중인&amp;nbsp;서비스&amp;nbsp;및&amp;nbsp;운영&amp;nbsp;체제에&amp;nbsp;대한&amp;nbsp;정보를&amp;nbsp;제공하는&amp;nbsp;네트워크&amp;nbsp;검색&amp;nbsp;도구입니다.&lt;/p&gt;
&lt;h2&gt;Nmap의&amp;nbsp;특징&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;호스트 탐지 : 네트워크 상에서 컴퓨터들을 확인한다. 예를 들어 ping 응답이나 특정포트가 열린 컴퓨터들을 나열한다. &lt;br /&gt;포트&amp;nbsp;스캔&amp;nbsp;:&amp;nbsp;하나&amp;nbsp;혹은&amp;nbsp;그&amp;nbsp;이상의&amp;nbsp;대상&amp;nbsp;컴퓨터들에&amp;nbsp;열린&amp;nbsp;포트들을&amp;nbsp;나열한다. &lt;br /&gt;버전&amp;nbsp;탐지&amp;nbsp;:&amp;nbsp;응용프로그램의&amp;nbsp;이름과&amp;nbsp;버전&amp;nbsp;번호를&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;원격&amp;nbsp;컴퓨터의&amp;nbsp;서비스를&amp;nbsp;확인&amp;nbsp;한다. &lt;br /&gt;OS&amp;nbsp;탐지&amp;nbsp;:&amp;nbsp;원격으로&amp;nbsp;OS와&amp;nbsp;네트워크&amp;nbsp;장치의&amp;nbsp;하드웨어&amp;nbsp;특성을&amp;nbsp;확인&amp;nbsp;한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N22Q5/btq0flc1OjR/2oaLYBKajIV2v6KYeYxzVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N22Q5/btq0flc1OjR/2oaLYBKajIV2v6KYeYxzVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N22Q5/btq0flc1OjR/2oaLYBKajIV2v6KYeYxzVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN22Q5%2Fbtq0flc1OjR%2F2oaLYBKajIV2v6KYeYxzVK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Nmap core process&lt;/h1&gt;
&lt;p&gt;Nmap의 주요 용도는 세 가지 핵심 프로세스로 나눌 수 있다.&lt;/p&gt;
&lt;p&gt;1 프로그램은 네트워크에서 활성화 된 모든 IP에 대한 자세한 정보를 제공하고 각 IP를 검색 할 수 있습니다. 이를 통해 관리자는 IP가 합법적 인 서비스에서 사용되고 있는지 외부 공격자가 사용하고 있는지 확인할 수 있습니다. &lt;br /&gt;&lt;br /&gt;2 Nmap은 네트워크 전체에 대한 정보를 제공합니다. 라이브 호스트 및 열린 포트 목록을 제공하고 연결된 모든 장치의 OS를 식별하는 데 사용할 수 있습니다. 이는 지속적인 시스템 모니터링과 침투 테스트의 중요한 부분에서 중요한 도구가됩니다. 예를 들어, Nmap은 Metasploit 프레임 워크 와 함께 사용 하여 네트워크 취약성을 조사한 다음 복구 할 수 있습니다. &lt;br /&gt;&lt;br /&gt;3 Nmap은 개인 및 비즈니스 웹 사이트를 보호하려는 사용자에게도 귀중한 도구가되었습니다. 특히 집에서 웹 사이트를 호스팅하는 경우 Nmap을 사용하여 자신의 웹 서버를 스캔하는 것은 본질적으로 해커가 사이트를 공격하는 데 사용하는 프로세스를 시뮬레이션하는 것입니다. 이러한 방식으로 자신의 사이트를 &quot;공격&quot;하는 것은 보안 취약성을 식별하는 강력한 방법입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;OS&amp;nbsp;스캐닝&lt;/h1&gt;
&lt;p&gt;OS 스캐닝은 Nmap의 가장 강력한 기능 중 하나. 스캔을 사용할 때 Nmap은 Fingerprint를 통해 TCP 및 UDP 패킷을 특정 포트로 보낸 다음 Response data를 분석. 이 &lt;span style=&quot;color: #333333;&quot;&gt;Response&lt;span&gt; 가 &lt;/span&gt;&lt;/span&gt;운영 체제 관련 응답 DB 시그니처와 비교하고 호스트의 OS (및 버전)에 대한 정보를 출력한다.&lt;/p&gt;
&lt;p&gt;Nmap의 가장 잘 알려진 기능 중 하나는 TCP / IP 스택 지문을 사용한 원격 OS 감지. Nmap은 일련의 TCP 및 UDP 패킷을 원격 호스트로 보내고 응답의 거의 모든 비트를 검사한다. &amp;nbsp;TCP ISN 샘플링, TCP 옵션 지원 및 주문, IP ID 샘플링, 초기 창 크기 검사와 같은 수십 가지 테스트를 수행 한 후 Nmap은 결과를 nmap-os-db 2,600 개 이상의 알려진 OS 지문 데이터베이스와 일치하는 경우 OS 세부 정보를 출력한다.&lt;/p&gt;
&lt;p&gt;Nmap이 머신의 OS를 추측 할 수없고 조건이 양호한 경우 (조건을 예를 들면 적어도 1개 이상 열린 포트와 하나의 닫힌 포트가 발견) Nmap은 알고있는 경우 지문을 제출하는 데 사용할 수있는 사이트를 제공한다.&lt;/p&gt;
&lt;p&gt;OS Detection -&amp;gt; 어쨌든 프로세스 중에 수집 된 정보를 사용하는 다른 시도할 수 있는 발판이 된다. 그중 하나가 TCP Sequence Predictability Classification 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1615892296332&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; nmap -O [target IP]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn608y/btq0g07yv6I/gIUhe56FlUw0zDlw3KTxNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn608y/btq0g07yv6I/gIUhe56FlUw0zDlw3KTxNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn608y/btq0g07yv6I/gIUhe56FlUw0zDlw3KTxNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn608y%2Fbtq0g07yv6I%2FgIUhe56FlUw0zDlw3KTxNK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;OS Detection 관련 옵션&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kOf5n/btq0oLiT2eF/BkYI8xIO3rz0pzFSWNVluK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kOf5n/btq0oLiT2eF/BkYI8xIO3rz0pzFSWNVluK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kOf5n/btq0oLiT2eF/BkYI8xIO3rz0pzFSWNVluK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkOf5n%2Fbtq0oLiT2eF%2FBkYI8xIO3rz0pzFSWNVluK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1615892897565&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-O (OS 감지 활성화)
위에서 설명한대로 OS 감지를 활성화합니다. 또는 -A다른 것들과 함께 OS 감지를 활성화 하는 데 사용할 수 있습니다 .

--osscan-limit (유망한 대상으로 OS 감지 제한)
하나 이상의 열린 TCP 포트와 하나의 닫힌 TCP 포트가 발견되면 OS 감지가 훨씬 더 효과적입니다. 이 옵션을 설정하면 Nmap은이 기준을 충족하지 않는 호스트에 대해 OS 감지를 시도하지 않습니다. 이는 특히 -Pn많은 호스트 에 대한 스캔에서 상당한 시간을 절약 할 수 있습니다 . -O또는로 OS 감지가 요청 된 경우에만 중요 -A합니다.

--osscan-guess; --fuzzy(OS 탐지 결과 추측)
Nmap이 완벽한 OS 일치를 감지 할 수없는 경우, 때때로 거의 일치를 가능성으로 제공합니다. Nmap이 기본적으로이 작업을 수행하려면 일치가 매우 가까워 야합니다. 이러한 (동등한) 옵션 중 하나는 Nmap 추측을 더 공격적으로 만듭니다. Nmap은 여전히 ​​불완전한 일치가 인쇄 될 때 알려주고 각 추측에 대한 신뢰 수준 (백분율)을 표시합니다.

--max-os-tries (대상에 대한 최대 OS 감지 시도 횟수 설정)
Nmap이 대상에 대해 OS 감지를 수행하고 완벽하게 일치하는 것을 찾지 못하면 일반적으로 시도를 반복합니다. 기본적으로 Nmap은 조건이 OS 지문 제출에 유리한 경우 5 번 시도하고 조건이 좋지 않은 경우 두 번 시도합니다. 더 낮은 --max-os-tries값 (예 : 1)을 지정하면 잠재적으로 OS를 식별 할 수있는 재 시도를 놓칠 수 있지만 Nmap 속도가 빨라집니다. 또는 조건이 좋을 때 더 많은 재 시도를 허용하도록 높은 값을 설정할 수 있습니다. Nmap OS 데이터베이스에 제출하고 통합하기 위해 더 나은 지문을 생성하는 것을 제외하고는 거의 수행되지 않습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;대신에 -A 를 쓰면 OS Detection을 포함해서 유용할 법한 정보들을 한번에 출력해준다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JSzAg/btq0nNnUWsa/uR9mKgQo0AjU4siXybZsg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JSzAg/btq0nNnUWsa/uR9mKgQo0AjU4siXybZsg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JSzAg/btq0nNnUWsa/uR9mKgQo0AjU4siXybZsg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJSzAg%2Fbtq0nNnUWsa%2FuR9mKgQo0AjU4siXybZsg1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Examples&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1616071134633&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;EXAMPLES:
  nmap -v -A scanme.nmap.org
  nmap -v -sn 192.168.0.0/16 10.0.0.0/8
  nmap -v -iR 10000 -Pn -p 80&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Computer Security/Analysis</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/274</guid>
      <comments>https://code13.tistory.com/274#entry274comment</comments>
      <pubDate>Tue, 16 Mar 2021 20:03:34 +0900</pubDate>
    </item>
    <item>
      <title>미미카츠 mimikatz 통해서 RDP ID Password 알아내기</title>
      <link>https://code13.tistory.com/273</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AFVBz/btq0iAHv4y3/LhCpa5Dt9qPhAGQlD1OVL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AFVBz/btq0iAHv4y3/LhCpa5Dt9qPhAGQlD1OVL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AFVBz/btq0iAHv4y3/LhCpa5Dt9qPhAGQlD1OVL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAFVBz%2Fbtq0iAHv4y3%2FLhCpa5Dt9qPhAGQlD1OVL0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Mimikatz?&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;메모리에서 해시, PIN, Kerberos 티켓, PW 등을 찾아내 탈취하는 도구. C를 배우고 Windows 보안을 실험하기 위해 만든 도구라고 설명하고있다.&lt;br /&gt;mimikatz 가능한 다른 유용한 기능으로는 Pass-the-Hash, Pass-the-Ticket, Golden tickets 등이 있다. 네트워크 내에서 공격자가 쉽게 활용 할 수 있도록 도구를 제공한다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mimikatz&lt;/span&gt; 개발자 Benjamin Delpy가 개발하였다. 효율적/공격적 Security Tool로써 침투 테스트 용도로 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;미미캐츠는 사용하기 어렵지 않으며, &lt;span style=&quot;color: #333333;&quot;&gt;mimikatz&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt; 1.0&lt;/span&gt;&lt;/span&gt;에는 메타스플로잇(Metasploit)의 일부로 미터프리터 스크립트가 번들로 제공된다. 새로운 &lt;span style=&quot;color: #333333;&quot;&gt;mimikatz&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt; 2.0 또한&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 메타스플로잇으로 통합되었다.&lt;/p&gt;
&lt;p&gt;mimikatz Windows 버전 (32/64 비트)에 따라 x64또는 Win32, 두 가지 유형으로 제공된다.&lt;br /&gt;Win32 버전은 64 비트 프로세스 메모리 (e.g. lsass.exe )에 액세스 할 수 없지만 Windows 64 비트에서 32bits 미니 덤프를 열 수 있다. mimikatz 기능들이 관리자 권한 또는 SYSTEM 토큰을 필요로한다. 그리고 UAC 수준을 신경써서 실행 할 필요가 있다.&lt;/p&gt;
&lt;h1&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mimikatz 동작 구조&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;mimikatz&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;크리덴셜 탈취를 위해 Windows SSO(single-sign-on) 기능을 악용.&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;윈도우 10 이전까지 윈도우는 기본적으로 &lt;b&gt;WDigest&lt;/b&gt;라는 기능이 사용되었다. &lt;/span&gt;이는 암호화된 암호를 메모리에서 로딩 &amp;amp; 복호화하기 위한 비밀 키를 로딩한다. WDigest는 기업이나 정부 네트워크에서 대규모의 사용자를 인증하기 위한 유용한 기능이었지만, &lt;span style=&quot;color: #333333;&quot;&gt;mimikatz&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;메모리에서 암호를 추출하기 위해 사용되었다.&lt;br /&gt;&lt;br /&gt;2013년에 MS가 윈도우 8.1에서 이 기능을 비활성화할 수 있도록 했으며, 윈도우 10에서는 비활성화를 기본 설정으로 만들었다. 하지만 여전히 Windows 에는 &quot;WDigest&quot; 가 포함되어있어 관리자 권한을 얻은 공격자들은 간단히 이 기능을 활성화해서 &lt;span style=&quot;color: #333333;&quot;&gt;mimikatz&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 실행할 수 있다.&lt;/p&gt;
&lt;p&gt;Mimikatz는 Benjamin Delpy (@gentilkiwi)가 C로 코딩 한 Windows x32 / x64 프로그램으로 Windows 자격 증명 (및 개념 증명) &lt;span&gt;&amp;nbsp;&lt;/span&gt;추가 기능을 제공하는 두 가지 선택적 구성 요소는&lt;span&gt;&amp;nbsp;&lt;/span&gt;mimidrv&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Windows 커널과 상호 작용하는 드라이버)와&lt;span&gt;&amp;nbsp;&lt;/span&gt;mimilib&lt;span&gt;&amp;nbsp;&lt;/span&gt;(AppLocker 우회, 인증 패키지 / SSP, 암호 필터 및 WinDBG 용 sekurlsa)입니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;Mimikatz는 특정 작업을 수행하고 LSASS 프로세스와 상호 작용하기 위해 관리자 또는 SYSTEM이 필요하며 종종 디버그 권한이 필요합니다 (요청 된 작업에 따라 다름).&lt;span&gt;&amp;nbsp;&lt;/span&gt;Mimikatz.exe는 거기에 언급 된 모든 기능을 포함하거나 적어도 포함해야한다.&lt;/p&gt;
&lt;p&gt;Mimikatz&amp;nbsp;&amp;amp;&amp;nbsp;Credentials:&lt;br /&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest&amp;nbsp;&amp;ldquo;UseLogonCredential&amp;rdquo;(DWORD)&lt;/p&gt;
&lt;p&gt;계정정보를 알아오기 위해 많이 사용하는 mimikatz 툴은 원래 윈도우10에서 실행이 불가했지만 2018년 2월에 업데이트되어 이용이 가능하다&lt;/p&gt;
&lt;h1&gt;mimikatz Command&lt;/h1&gt;
&lt;pre id=&quot;code_1615891775024&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;log
privilege::debug


sekurlsa::logonpasswords
sekurlsa::tickets /export

sekurlsa::pth /user:Administrateur /domain:winxp /ntlm:f193d757b4d487ab7e5a3743f038f713 /run:cmd



kerberos::list /export kerberos::ptt c:\chocolate.kirbi kerberos::golden /admin:administrateur /domain:chocolate.local /sid:S-1-5-21-130452501-2365100805-3685010670 /krbtgt:310b643c5316c8c3c70a10cfb17e2e31 /ticket:chocolate.kirbi&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;blog.gentilkiwi.com/mimikatz&lt;/p&gt;</description>
      <category>Computer Security/Analysis</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/273</guid>
      <comments>https://code13.tistory.com/273#entry273comment</comments>
      <pubDate>Tue, 16 Mar 2021 19:52:20 +0900</pubDate>
    </item>
    <item>
      <title>공캐키 RSA 구조 알아보기 .der .pem</title>
      <link>https://code13.tistory.com/272</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210305_asymmetric_encryption.png&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;377&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l1Vsa/btqZpUfcvx2/BZMyaWPlVR6nU3SagKAexK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l1Vsa/btqZpUfcvx2/BZMyaWPlVR6nU3SagKAexK/img.png&quot; data-alt=&quot;Asymmetric Encryption&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l1Vsa/btqZpUfcvx2/BZMyaWPlVR6nU3SagKAexK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl1Vsa%2FbtqZpUfcvx2%2FBZMyaWPlVR6nU3SagKAexK%2Fimg.png&quot; data-filename=&quot;210305_asymmetric_encryption.png&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;377&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;Asymmetric Encryption&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;공개키 (public-key cryptography)&lt;/h1&gt;
&lt;p&gt;사전에 비밀 키를 나눠가지지 않은 사용자들이 안전하게 통신할 수 있도록 한다. 공개 키 암호 방식에서는 공개 키와 비밀 키가 존재하며, 공개 키는 누구나 알 수 있지만 그에 대응하는 비밀 키는 키의 소유자만이 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;공개키&amp;nbsp;암호학&amp;nbsp;방식에서&amp;nbsp;키&amp;nbsp;생성은&amp;nbsp;Trap&amp;nbsp;door&amp;nbsp;one&amp;nbsp;way&amp;nbsp;function에&amp;nbsp;기반을&amp;nbsp;둔다. &lt;br /&gt;&lt;br /&gt;한&amp;nbsp;방향으로&amp;nbsp;계산이&amp;nbsp;쉬우나&amp;nbsp;다른&amp;nbsp;방향으로의&amp;nbsp;계산이&amp;nbsp;어렵다는&amp;nbsp;것을&amp;nbsp;이용한&amp;nbsp;방식이다. &lt;br /&gt;&lt;br /&gt;키를 생성하는데 두 가지의 방법이 존재한다.&lt;/p&gt;
&lt;h2&gt;소인수분해&lt;/h2&gt;
&lt;p&gt;첫&amp;nbsp;번째로&lt;b&gt;&amp;nbsp;소인수분해&lt;/b&gt;를&amp;nbsp;이용한&amp;nbsp;키&amp;nbsp;생성&amp;nbsp;방법이&amp;nbsp;있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/betkGc/btqZoycCu0A/gk1Ip9mG15i6ptDDxLyoM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/betkGc/btqZoycCu0A/gk1Ip9mG15i6ptDDxLyoM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/betkGc/btqZoycCu0A/gk1Ip9mG15i6ptDDxLyoM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbetkGc%2FbtqZoycCu0A%2Fgk1Ip9mG15i6ptDDxLyoM1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;p가 11이고 q가 13일때 N을 구하는 건 간단히 11x13 = 143 간단하게 구할 수 있지만 143을 소수인 p와 q를 구하려면 전자보다 어려워지는 것을 이용한 것이다.&lt;/p&gt;
&lt;h2&gt;이산대수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;두&amp;nbsp;번째로&amp;nbsp;&lt;b&gt;이산대수&lt;/b&gt;를&amp;nbsp;이용한&amp;nbsp;방법이&amp;nbsp;존재한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3MH87/btqZn1e2ZtT/HvfZFxKrhJ0xKccV9fl9Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3MH87/btqZn1e2ZtT/HvfZFxKrhJ0xKccV9fl9Zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3MH87/btqZn1e2ZtT/HvfZFxKrhJ0xKccV9fl9Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3MH87%2FbtqZn1e2ZtT%2FHvfZFxKrhJ0xKccV9fl9Zk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;g, p, y가 주어져도 해당 x값을 구하는건 어려운 점을 이용한 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sfbaU/btqZn1lNMuh/YNZMYqQtkxuZzXnTX3J530/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sfbaU/btqZn1lNMuh/YNZMYqQtkxuZzXnTX3J530/img.png&quot; data-alt=&quot;공개키 암호방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sfbaU/btqZn1lNMuh/YNZMYqQtkxuZzXnTX3J530/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsfbaU%2FbtqZn1lNMuh%2FYNZMYqQtkxuZzXnTX3J530%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;공개키 암호방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;RSA 키 생성&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3JQud/btqZkp17RKV/v0KoPi8m7f4YDKIZ8yin50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3JQud/btqZkp17RKV/v0KoPi8m7f4YDKIZ8yin50/img.png&quot; data-alt=&quot;RSA Key Generation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3JQud/btqZkp17RKV/v0KoPi8m7f4YDKIZ8yin50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3JQud%2FbtqZkp17RKV%2Fv0KoPi8m7f4YDKIZ8yin50%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;RSA Key Generation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;1.&amp;nbsp;서로&amp;nbsp;다른&amp;nbsp;큰&amp;nbsp;소수&amp;nbsp;&lt;b&gt;p,&amp;nbsp;q&lt;/b&gt;를 선택한다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;2.&amp;nbsp; n = p * q&lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&lt;b&gt;&amp;phi;(n)&lt;/b&gt;&amp;nbsp;=&amp;gt;&amp;nbsp;오일러&amp;nbsp;Totient&amp;nbsp;함수,&amp;nbsp;n보다&amp;nbsp;작은&amp;nbsp;자연수&amp;nbsp;중에서&amp;nbsp;n과&amp;nbsp;서로&amp;nbsp;소인&amp;nbsp;자연수의&amp;nbsp;개수를&amp;nbsp;구한다. &lt;br /&gt;&lt;br /&gt;&amp;phi;(n)&amp;nbsp;=&amp;nbsp;(p-1)(q-1) &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;&amp;phi;(n)보다&amp;nbsp;작고&amp;nbsp;&amp;phi;(n)과&amp;nbsp;서로소인&amp;nbsp;임의의&amp;nbsp;자연수&amp;nbsp;&lt;b&gt;e&lt;/b&gt;를&amp;nbsp;선택한다. &lt;br /&gt;&lt;br /&gt;gcd(e,&amp;nbsp;&amp;phi;(n))&amp;nbsp;=&amp;nbsp;1&amp;nbsp;(1&amp;nbsp;&amp;lt;&amp;nbsp;e&amp;nbsp;&amp;lt;&amp;nbsp;&amp;phi;(n)&amp;nbsp;만족하는&amp;nbsp;e를&amp;nbsp;선택) &lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;확장&amp;nbsp;유클리드&amp;nbsp;호제법을&amp;nbsp;이용해서&amp;nbsp;e&amp;nbsp;mod&amp;nbsp;&amp;phi;(n)&amp;nbsp;=&amp;nbsp;1인&amp;nbsp;&lt;b&gt;d&lt;/b&gt;를&amp;nbsp;구한다. &lt;br /&gt;&lt;br /&gt;공개 키(Public Key) : (N, e) &lt;br /&gt;개인&amp;nbsp;키(Private&amp;nbsp;Key)&amp;nbsp;:&amp;nbsp;d&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 84.6562%; height: 296px;&quot; border=&quot;1&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 22px;&quot;&gt;기호&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 22px;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 22px;&quot; width=&quot;107&quot;&gt;p, q&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 22px;&quot; width=&quot;551&quot;&gt;매우 큰 서로 다른 소수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 22px;&quot; width=&quot;107&quot;&gt;n&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 22px;&quot; width=&quot;551&quot;&gt;p*q의 합성수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 22px;&quot; width=&quot;107&quot;&gt;gcd(a, b)&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 22px;&quot; width=&quot;551&quot;&gt;a와b의 최대 공약수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 22px;&quot; width=&quot;107&quot;&gt;&amp;phi;(n)&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 22px;&quot; width=&quot;551&quot;&gt;오일러 Totient함수로, &amp;phi;(n)은 n보다 작은 자연수 중에서 n과 서로 소인 자연수의 개수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 22px;&quot; width=&quot;107&quot;&gt;a mod n&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 22px;&quot; width=&quot;551&quot;&gt;모듈러 연산으로, a를 n로 나누었을 때 나머지 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 22px;&quot; width=&quot;107&quot;&gt;a&amp;equiv; r mod n&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 22px;&quot; width=&quot;551&quot;&gt;a와 r은 n으로 나누었을 때 그 나머지가 같음 (a와 r은 합동)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 22px;&quot; width=&quot;107&quot;&gt;e&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 22px;&quot; width=&quot;551&quot;&gt;n과 함께 공개되는 공개키로 암호화 지수에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 24px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 24px;&quot; width=&quot;107&quot;&gt;d&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 24px;&quot; width=&quot;551&quot;&gt;공개되지 않는 개인키로 복호화 지수에 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 24px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 24px;&quot; width=&quot;107&quot;&gt;M&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 24px;&quot; width=&quot;551&quot;&gt;평문으로 공개키를 이용하여 암호화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 24px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 24px;&quot; width=&quot;107&quot;&gt;C&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 24px;&quot; width=&quot;551&quot;&gt;암호문으로 개인키를 이용하여 복호화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 24px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 24px;&quot; width=&quot;107&quot;&gt;KU&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 24px;&quot; width=&quot;551&quot;&gt;공개키로 KU= {e, n}으로 표기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 24px;&quot;&gt;
&lt;td style=&quot;width: 18.1689%; height: 24px;&quot; width=&quot;107&quot;&gt;KR&lt;/td&gt;
&lt;td style=&quot;width: 101.27%; height: 24px;&quot; width=&quot;551&quot;&gt;개인키로 KR= {d, n}으로 표기&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;RSA 공개 키, 개인 키 구하기&lt;/h1&gt;
&lt;p&gt;&lt;br /&gt;예를들어&amp;nbsp;p가&amp;nbsp;11이고&amp;nbsp;q가&amp;nbsp;3이라고&amp;nbsp;하자. &lt;br /&gt;1.&amp;nbsp;N&amp;nbsp;=&amp;nbsp;p&amp;nbsp;*&amp;nbsp;q를&amp;nbsp;구한다.&amp;nbsp;=&amp;gt;&amp;nbsp;n&amp;nbsp;=&amp;nbsp;33 &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;&amp;phi;(n)=(p-1)(q-1)를&amp;nbsp;계산한다.&amp;nbsp;=&amp;gt;&amp;nbsp;(11-1)(3-1)&amp;nbsp;=&amp;nbsp;20 &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;&amp;phi;(n)보다&amp;nbsp;작고&amp;nbsp;&amp;phi;(n)과&amp;nbsp;서로소인&amp;nbsp;임의의&amp;nbsp;자연수&amp;nbsp;e를&amp;nbsp;선택한다.&amp;nbsp;=&amp;gt;&amp;nbsp;e&amp;nbsp;=&amp;nbsp;3&amp;nbsp;선택 &lt;br /&gt;&lt;br /&gt;이&amp;nbsp;때&amp;nbsp;20와&amp;nbsp;서로소&amp;nbsp;이면서&amp;nbsp;소수인&amp;nbsp;3을&amp;nbsp;선택한다.&amp;nbsp;e&amp;nbsp;=&amp;nbsp;3 &lt;br /&gt;ed&amp;nbsp;=&amp;nbsp;1&amp;nbsp;mod&amp;nbsp;(p-1)(q-1)에서&amp;nbsp;ed&amp;nbsp;=&amp;nbsp;1&amp;nbsp;mod&amp;nbsp;20이&amp;nbsp;된다. &lt;br /&gt;&lt;br /&gt;따라서&amp;nbsp;d&amp;nbsp;=&amp;nbsp;7이다.&amp;nbsp;(e가&amp;nbsp;3이므로) &lt;br /&gt;&lt;br /&gt;공개&amp;nbsp;키&amp;nbsp;(N,&amp;nbsp;e)&amp;nbsp;:&amp;nbsp;(33,&amp;nbsp;3) &lt;br /&gt;개인&amp;nbsp;키&amp;nbsp;d&amp;nbsp;:&amp;nbsp;7 &lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Cipher Text 만들기&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;200&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wED53/btqZjuI6G0T/L0o67vKAo5xTWCkKmeokd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wED53/btqZjuI6G0T/L0o67vKAo5xTWCkKmeokd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wED53/btqZjuI6G0T/L0o67vKAo5xTWCkKmeokd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwED53%2FbtqZjuI6G0T%2FL0o67vKAo5xTWCkKmeokd0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;200&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Plain Text 복호화 하기&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;200&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F65V0/btqZowTqKna/bxTJF6fS1XjfjRPeKfy9jK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F65V0/btqZowTqKna/bxTJF6fS1XjfjRPeKfy9jK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F65V0/btqZowTqKna/bxTJF6fS1XjfjRPeKfy9jK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF65V0%2FbtqZowTqKna%2FbxTJF6fS1XjfjRPeKfy9jK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;200&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span&gt;&lt;span&gt;RSA 암호화 기법에서의 지수&lt;/span&gt;&lt;span&gt; 처&lt;/span&gt;&lt;span&gt;리&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;RSA 에서 모듈러 연산을 하기 위해서, 지수 연산을 많이 하게 됩니다. 암호화, 복호활할 때, 각각 쓰이게 되는데요, 이를 실수 연산을 한 뒤에 모듈러 연산을 하게 되면 메모리와 연산 속도에서 현저히 떨어지게 됩니다. 이를 조금더 쉽고 빠르게 연산하기 위해서 알고리즘이 존재합니다. 모듈러 하는 값의 바이너리 값을 이용해서 연산을 하는 방식입니다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span&gt;&lt;span&gt;알고리즘을 연산 예제&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;ab&lt;span&gt;&amp;nbsp;&lt;/span&gt;mod n 의 연산을 하고자 할 때, 아래의 알고리즘을 이용하면 간단하게 연산을 수행할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;여기서 b는 바이너리 형태로 존재한다. 즉, b는 bkbk-1&amp;hellip;b0&lt;span&gt;&amp;nbsp;&lt;/span&gt;로 표현된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210305_rsa_exp2.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;163&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c63xo3/btqZlQFBIkI/XW4iR9FzoRYNHqKsqfrfkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c63xo3/btqZlQFBIkI/XW4iR9FzoRYNHqKsqfrfkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c63xo3/btqZlQFBIkI/XW4iR9FzoRYNHqKsqfrfkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc63xo3%2FbtqZlQFBIkI%2FXW4iR9FzoRYNHqKsqfrfkk%2Fimg.png&quot; data-filename=&quot;210305_rsa_exp2.png&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;163&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;위의 알고리즘을 이용하는 예제는 다음과 같다. a&lt;/span&gt;b&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;mod n 연산에서 a=7, b = 560 =1000110000, n=561 라고 하면 아래와 같은 형태로 연산이 이루어진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210305_rsa_exp1.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;121&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2Wrxy/btqZowT6obi/1QFZZqfokT2oKSShAUZYk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2Wrxy/btqZowT6obi/1QFZZqfokT2oKSShAUZYk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2Wrxy/btqZowT6obi/1QFZZqfokT2oKSShAUZYk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2Wrxy%2FbtqZowT6obi%2F1QFZZqfokT2oKSShAUZYk1%2Fimg.png&quot; data-filename=&quot;210305_rsa_exp1.png&quot; data-origin-width=&quot;566&quot; data-origin-height=&quot;121&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;RSA 키 파일 포맷&lt;/h1&gt;
&lt;p&gt;RSA Public Key를 표현하는 format 은 DER format 과 PEM format 이 있다. PKCS#1 표준에서는 RSA Key를 ASN.1 방식으로 표현하라고 규정하고 있다. (*ASN : Abstract Syntax Notation)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;.DER (Distinguished Encoding Rule)&lt;/b&gt;&lt;br /&gt;DER format은, ASN.1 구조에 맞추어 DER encoding한 것&lt;br /&gt;2개&amp;nbsp;&lt;b&gt;INTEGER&amp;nbsp;&lt;/b&gt;값의&amp;nbsp;&lt;b&gt;SEQUENCE&amp;nbsp;&lt;/b&gt;로&amp;nbsp;표시&lt;/p&gt;
&lt;p&gt;&lt;b&gt;.PEM (Privacy-enhanced Electronic Mail)&lt;/b&gt;&lt;br /&gt;&lt;u&gt;Base64로 인코딩&lt;/u&gt; 된 ASCII text file&amp;nbsp;&lt;br /&gt;&amp;nbsp;Header(--BEGIN PUBLIC KEY-- ) 와 Footer(---END PUBLIC KEY--)를 사용하고, ASCII Text형식으로 표현된다. &lt;br /&gt;PEM은 DER format 이 binary 형식으로 되어 있기 때문에, Base64로 인코딩 함으로서 ASCII text 형식으로 변환한 것&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;.PEM = (Header) + base64_encode(.DER) + (Footer)&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;원래는 secure email에 사용되는 인코딩 포멧이었는데 더이상 email쪽에서는 잘 쓰이지 않고 인증서 또는 키값을 저장하는데 많이 사용된다. &lt;br /&gt;-----BEGIN&amp;nbsp;XXX-----,&amp;nbsp;-----END&amp;nbsp;XXX-----&amp;nbsp;로&amp;nbsp;묶여있는&amp;nbsp;text&amp;nbsp;file을&amp;nbsp;보면&amp;nbsp;이&amp;nbsp;형식으로&amp;nbsp;인코딩&amp;nbsp;되어있다고&amp;nbsp;생각하면&amp;nbsp;된다.&amp;nbsp;&lt;br /&gt;(담고있는&amp;nbsp;내용이&amp;nbsp;무엇인지에&amp;nbsp;따라&amp;nbsp;XXX&amp;nbsp;위치에&amp;nbsp;CERTIFICATE,&amp;nbsp;RSA&amp;nbsp;PRIVATE&amp;nbsp;KEY&amp;nbsp;등의&amp;nbsp;키워드가&amp;nbsp;들어있다)&lt;/p&gt;
&lt;pre id=&quot;code_1614943964217&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//PEM PrivateKey Example

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDBw2b5UiQQOeWrGr7AfK7sglIdmteUASLxKMnhBagtyZYgILBF
eI4Owf7C1FSibxAVMRbuAJ2QjkHu+gTp4aeNeaRMNQMowQTmK/sMgFK3jGwiAWEp
HdqVUJlKET6xvMFxhCvvEepyaan0UjU2TLVxrJq3IEFLoaNC7JdtyY+BMwIDAQAB
AoGAPq9Klwo95In2hT5ny7oKlTUr/6viZl1fwokhlozP9dAro0UwAamYu6mDE+DB
aLNpjpGNC35jeyqqpfd4s3lvTMKFShUJSul6u/oWxdWjA6fleLg/QNaV2/3LDEEo
KafEWI2cipEl9GiQHubFYMJU+jqRwMTRvfh/7sdXbFRU+UECQQD72vs89IPT0N1r
9hEMdkbim7W9DqTy8U2khil0Y/jFl9325Wa+fPKwl7zCyq5sIl4OR5vUGswnHcLi
MjL5hQHDAkEAxPOwni70rifF8ebMHcLHUmgRsEqVGQhmkABdAYydradjFgQlS8Qs
gBkbGjH0xF8/MCic66uYisAkTv/VXfib0QJAN0H9e4s+XTvnSOetJ+nPdaqqPje3
UyJEYcOZ1tKUY24FokUEvOiXKs2v+aEUkd8cec+WTfwvLKnn908CRiK7lwJAJlyE
0Tq6I9XRY12d8koHAtEMaPcN9XNCbtfzRaL672EEFry1+vz54fWB5udGEp2utBWl
Au5IZvYn3E9OYuBSkQJBANrzvuAV28H6i0ELisFx8nyCzTWJhT6AirSq2vILFOt9
PxdBVH/8NY9MlYJfiEEzEwebSh9kMaez9+rQy/agwxo=
-----END RSA PRIVATE KEY-----
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;OpenSSL RSA 키생성 커맨드&lt;/h2&gt;
&lt;pre id=&quot;code_1614947099384&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//private key
openssl genrsa -out private.pem 1024
//public key
openssl rsa -in private2.pem -pubout -out publickey.pem&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Public-Private key syntax&lt;/h2&gt;
&lt;p&gt;Publickey와 Private 키 표준 구조체 정의&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1614957820230&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// RSA Public Key syntax
RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

// RSA Private Key syntax
RSAPrivateKey ::= SEQUENCE {
    version           Version,
    modulus           INTEGER,  -- n
    publicExponent    INTEGER,  -- e
    privateExponent   INTEGER,  -- d
    prime1            INTEGER,  -- p
    prime2            INTEGER,  -- q
    exponent1         INTEGER,  -- d mod (p-1)
    exponent2         INTEGER,  -- d mod (q-1)
    coefficient       INTEGER,  -- (inverse of q) mod p
    otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;PrivateKey를 PEM 포맷으로 출력한 결과와 Private 키에서 각 오프셋별 의미하는 값의미 (n, e, d, p, q)&lt;/p&gt;
&lt;pre id=&quot;code_1615021178458&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;gt; openssl asn1parse -in key.pm&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210305_p12RKF5.png&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;486&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oVIy4/btqZpVS5XuZ/fARnk7g3KMUWltSkWEWx01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oVIy4/btqZpVS5XuZ/fARnk7g3KMUWltSkWEWx01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oVIy4/btqZpVS5XuZ/fARnk7g3KMUWltSkWEWx01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoVIy4%2FbtqZpVS5XuZ%2FfARnk7g3KMUWltSkWEWx01%2Fimg.png&quot; data-filename=&quot;210305_p12RKF5.png&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;486&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Open SSH Key - &amp;gt; RSA PEM Key Example&lt;/b&gt; (by oddbit.com)&lt;/p&gt;
&lt;pre id=&quot;code_1615015934488&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# python 2 based
import base64
import struct

# get the second field from the public key
keydata = &quot;ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD7EZn/BzP26AWk/Ts2ymjpTXuXRiEWIWnHFTilOTcuJ/P1HfOwiy4RHC1rv59Yh/E6jbTx623+OGySJWh1IS3dAEaHhcGKnJaikrBn3ccdoNVkAAuL/YD7FMG1Z0SjtcZS6MoO8Lb9pkq6R+Ok6JQjwCEsB+OaVwP9RnVA+HSYeyCVE0KakLCbBJcD1U2aHP4+IH4OaXhZacpb9Ueja6NNfGrv558xTgfZ+fLdJ7cpg6wU8UZnVM1BJiUW5KFasc+2IuZR0+g/oJXaYwvW2T6XsMgipetCEtQoMAJ4zmugzHSQuFRYHw/7S6PUI2U03glFmULvEV+qIxsVFT1ng3pj lars@tiamat.house&quot;
keydata = keydata.split()[1]
keydata = base64.b64decode(keydata)


parts = []
while keydata:
    # read the length of the data
    dlen = struct.unpack('&amp;gt;I', keydata[:4])[0]

    # read in &amp;lt;length&amp;gt; bytes
    data, keydata = keydata[4:dlen+4], keydata[4+dlen:]

    parts.append(data)

e_val = eval('0x' + ''.join(['%02X' % struct.unpack('B', x)[0] for x in parts[1]]))
n_val = eval('0x' + ''.join(['%02X' % struct.unpack('B', x)[0] for x in parts[2]]))

print(e_val)
print(n_val)

from pyasn1.type import univ

pkcs1_seq = univ.Sequence()
pkcs1_seq.setComponentByPosition(0, univ.Integer(n_val))
pkcs1_seq.setComponentByPosition(1, univ.Integer(e_val))

from pyasn1.codec.der import encoder as der_encoder

print '-----BEGIN RSA PUBLIC KEY-----'
print base64.encodestring(der_encoder.encode(pkcs1_seq))
print '-----END RSA PUBLIC KEY-----'&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;pycrypto (pycryptodome) RSA Example&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1615023954942&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import binascii

keyPair = RSA.generate(1024)

pubKey = keyPair.publickey()
print(&quot;Public key:  n=&quot;, hex(pubKey.n))
print(&quot;Public key:  e=&quot;, hex(pubKey.e))
pubKeyPEM = pubKey.exportKey()
print(pubKeyPEM.decode('ascii'))

print(&quot;Private key:  n=&quot;, hex(pubKey.n))
print(&quot;Private key:  d=&quot;, hex(keyPair.d))
privKeyPEM = keyPair.exportKey()
print(privKeyPEM.decode('ascii'))

msg = b'A message for encryption'
encryptor = PKCS1_OAEP.new(pubKey)
encrypted = encryptor.encrypt(msg)
print(&quot;Encrypted:&quot;, binascii.hexlify(encrypted))

decryptor = PKCS1_OAEP.new(keyPair)
decrypted = decryptor.decrypt(encrypted)
print('Decrypted:', decrypted)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;gmpy2 (GMP &amp;amp; &lt;/b&gt;&lt;span&gt;&lt;b&gt;MPIR python)&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1615210736077&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 15px; color: #383a42; background: #f6f7f8; font-size: 14px; border-radius: 3px; font-family: Menlo, Consolas, Monaco, monospace; border: 1px solid #dddddd; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import gmpy2
from gmpy2 import mpz

bit_count = 1024
rand_state = gmpy2.random_state(42)

def generate_prime(bits):
    temp = gmpy2.mpz_rrandomb(rand_state, bit_count)
    return gmpy2.next_prime(temp)

# Setting up the encryption
#
p = generate_prime(bit_count)
q = generate_prime(bit_count)
assert(p != q)

n = gmpy2.mul(p, q)
phi = gmpy2.mul(p-1, q-1)

print(&quot;p:&quot;, p)
print(&quot;q:&quot;, q)
print(&quot;n:&quot;, n)
print(&quot;phi:&quot;, phi)

# Key Generation
#
# Choose 1 &amp;lt; e &amp;lt; phi such that gcd(e, phi) = 1
# e will be our Public Key
#
# Choose d the multiplicative inverse of e in Z/phi
# d will be our Secret Key
e = gmpy2.mpz_random(rand_state, phi)
while (e &amp;lt;= 1 or gmpy2.gcd(e, phi) != 1):
    e = gmpy2.mpz_random(rand_state, phi)
assert(e &amp;gt; 1)
assert(gmpy2.gcd(e, phi) == 1)

d = gmpy2.invert(e, phi)
assert(d != 1)
assert(gmpy2.t_mod(e*d, phi) == 1)

print(&quot;PK(e):&quot;, e)
print(&quot;SK(d):&quot;, d)


# Encryption and Decryption
#
m = mpz(123456789101112131415)
c = gmpy2.powmod(m, e, n)
m_rec = gmpy2.powmod(c, d, n)

print(&quot;Original message:&quot;, m)
print(&quot;Ciphertext:&quot;, c)
print(&quot;Recovered message:&quot;, m_rec)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;레퍼런스&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;tools.ietf.org/html/rfc3447&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;samsclass blog -RSA Key Format&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;samsclass.info/141/proj/pCH-RKF.htm&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;ASN.1&amp;nbsp;JavaScript&amp;nbsp;decoder&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;lapo.it/asn1js/&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;CONVERTING&amp;nbsp;OPENSSH&amp;nbsp;PUBLIC&amp;nbsp;KEYS&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;blog.oddbit.com/post/2011-05-08-converting-openssh-public-keys/&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #666666;&quot;&gt;cryptobook.nakov&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;cryptobook.nakov.com/asymmetric-key-ciphers/rsa-encrypt-decrypt-examples&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Public&amp;nbsp;Key&amp;nbsp;Cryptography:&amp;nbsp;RSA&lt;br /&gt;mathybit.github.io/crypto-rsa&lt;/p&gt;</description>
      <category>Computer Security/Security Articles</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/272</guid>
      <comments>https://code13.tistory.com/272#entry272comment</comments>
      <pubDate>Fri, 5 Mar 2021 18:23:03 +0900</pubDate>
    </item>
    <item>
      <title>IDA Pro IDB2PAT for python3</title>
      <link>https://code13.tistory.com/271</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;101&quot; width=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qTZqj/btqZjvUBPwi/vkJzdjLUYL7D72GpfE3T91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qTZqj/btqZjvUBPwi/vkJzdjLUYL7D72GpfE3T91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qTZqj/btqZjvUBPwi/vkJzdjLUYL7D72GpfE3T91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqTZqj%2FbtqZjvUBPwi%2FvkJzdjLUYL7D72GpfE3T91%2Fimg.png&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;101&quot; width=&quot;640&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Among the scripting tools provided by IDA pro flare, there is idb2pat.py that creates a signature.&lt;/p&gt;
&lt;p&gt;The script is considered to work in python2, so it does not work properly in python3.&lt;/p&gt;
&lt;p&gt;In the case of the most recent version, ida pro 7.5, since python3 is the default version, a script error occurs in the normal execution method.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWzd4/btqZiT2v4Pj/Iw2AYKbH1FUg6BMnczWdmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWzd4/btqZiT2v4Pj/Iw2AYKbH1FUg6BMnczWdmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWzd4/btqZiT2v4Pj/Iw2AYKbH1FUg6BMnczWdmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWzd4%2FbtqZiT2v4Pj%2FIw2AYKbH1FUg6BMnczWdmK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2&gt;Method 1. Set config USE_PYTHON2&lt;/h2&gt;
&lt;pre id=&quot;code_1614867800636&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* IDA's install path:  path/to/ida_install/python/use_python2
* The 'IDAUSR' directory:
   +  ~/.idapro/python/use_python2 (on Linux/OSX)
   + %APPDATA%\Hex-Rays\IDA Pro\python\use_python2 (on Windows)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Create&amp;nbsp;a&amp;nbsp;file&amp;nbsp;called&amp;nbsp;&quot;use_python2&quot;&amp;nbsp;under&amp;nbsp;the&amp;nbsp;install&amp;nbsp;path&amp;nbsp;and&amp;nbsp;make&amp;nbsp;it&amp;nbsp;run&amp;nbsp;as&amp;nbsp;python2.&amp;nbsp;Make&amp;nbsp;the&amp;nbsp;file&amp;nbsp;recognized&amp;nbsp;as&amp;nbsp;a&amp;nbsp;configuration&amp;nbsp;file&amp;nbsp;when&amp;nbsp;ida&amp;nbsp;pro&amp;nbsp;is&amp;nbsp;loaded.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Method 2. Porting&amp;nbsp;to&amp;nbsp;suit&amp;nbsp;python3&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;It works correctly if the following modifications are reflected.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1614867994478&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;line 38
    iter(itertools.count(start).__next__, end)
line 259
    sig += &quot;..&quot; * (32 - (len(sig) // 2))
line 296
    for ref_loc, ref in refs.items():
line 417
    filename = ask_file(1, name, &quot;Enter the name of the pattern file&quot;)
line 467
    f.write(b&quot;\r\n&quot;)
    f.write(b&quot;---&quot;)
    f.write(b&quot;\r\n&quot;)
line 474
    f.write(b&quot;\r\n&quot;)
    f.write(b&quot;---&quot;)
    f.write(b&quot;\r\n&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;IDA Pro FLARE git&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://github.com/fireeye/flare-ida/blob/master/python/flare/idb2pat.py&quot;&gt;github.com/fireeye/flare-ida/blob/master/python/flare/idb2pat.py&lt;/a&gt;&lt;/p&gt;</description>
      <category>Computer Security/Analysis</category>
      <category>idapro</category>
      <category>idapython</category>
      <category>idb2pat</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/271</guid>
      <comments>https://code13.tistory.com/271#entry271comment</comments>
      <pubDate>Thu, 4 Mar 2021 23:27:30 +0900</pubDate>
    </item>
    <item>
      <title>IDA Pro Command-line Analysis</title>
      <link>https://code13.tistory.com/270</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210303_idapro.png&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;568&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvNJbB/btqY8HuORgN/hw9ke0ASqFGEilfGYB1iOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvNJbB/btqY8HuORgN/hw9ke0ASqFGEilfGYB1iOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvNJbB/btqY8HuORgN/hw9ke0ASqFGEilfGYB1iOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvNJbB%2FbtqY8HuORgN%2Fhw9ke0ASqFGEilfGYB1iOK%2Fimg.png&quot; data-filename=&quot;210303_idapro.png&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;568&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;IDA Pro를 통해서 대량 분석을 위해 자동 분석 또는 커맨드라인으로 처리하는 방법을 정리한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://code13.tistory.com/241&quot;&gt;▶ About IDA Pro Batch mode options&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;font-family: Verdana; font-size: 10pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;IDA Pro 설치 경로 내 실행파일과 종류&lt;/h1&gt;
&lt;p&gt;IDA Pro 에는 GUI 버전의 실행파일과 커맨드라인 버전의 실행파일이 있다.&lt;/p&gt;
&lt;p&gt;x86 gui : ida.exe&lt;br /&gt;x86 cli : idat.exe&lt;br /&gt;x64 gui : ida64.exe&lt;br /&gt;x64 gui : idat64.exe&lt;/p&gt;
&lt;p&gt;각 프로그램은 분석 대상 바이너리의 아키텍처(x86, x64 등) 또는 gui, cli 를 의미하지만 내부적인 동작에는 차이가 없다.&lt;br /&gt;다만 당연히 화면처리 여부에 따라서 속도차이가 발생하므로, 커맨드라인 처리를 위해서는 cli 모드를 쓰는게 나을듯하다. (GUI 모드도 인자 주면 동일하게 동작함)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;IDA Pro 로 분석 idb 파일 만들기&lt;/h1&gt;
&lt;p&gt;ida pro 분석 데이터 포맷인 .idb 파일과 어셈블리 분석 결과인 .asm 파일이 만들어진다.&lt;br /&gt;&lt;b&gt;idb&lt;/b&gt; :&amp;nbsp; 파일은 바이너리를 분석하고 나서 저장하면 생기는 ida pro의 고유 분석데이터 포맷으로 IDA pro가 분석한 파일의 분석결과에 대한 정보를 담고 있다. 바이너리 별로 분석한 결과가 각각 idb 파일에 저장된다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;asm&lt;/b&gt; : 바이너리 코드를 디어셈블리한 어셈블리 코드 텍스트파일, 텍스트&amp;nbsp;파일&amp;nbsp;형태로서&amp;nbsp;함수&amp;nbsp;별&amp;nbsp;코드&amp;nbsp;정보를&amp;nbsp;담고&amp;nbsp;있다&lt;/p&gt;
&lt;pre id=&quot;code_1614782183881&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;idat.exe &amp;ndash;A &amp;ndash;B {full path to  the file you want to analyze}

&quot;-B&quot;: Batch mode. IDA generates &quot;idb&quot; and &quot;asm&quot; file automatically
&quot;-A&quot;: Autonomous mode.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;스크립트를 통해서 데이터 추출하기&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;IDA Pro 실행파일(ida.exe)에 인자로 스크립트경로를 주어서 실행한다.&lt;br /&gt;위에서 생성한 idb 파일도 입력인자로 같이 전달한다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1614782178975&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;idat.exe -A -S&quot;C:\Path\test_script.py foo bar&quot; &quot;C:\Path\mydatabase.idb&quot;

&quot;-S&quot;: Executes a script file when the database is opened&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;테스트 idc 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1614782170678&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import idc
import idascript
 
print &quot;Hello world from IDAPython\n&quot;
for i in xrange(1, len(idc.ARGV)):
    print &quot;ARGV[%d]=%s&quot; % (i, idc.ARGV[i])

idc.Exit(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;IDA Pro FLIRT (Function Signature ) 생성하기&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(&lt;b&gt;FLIRT:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Fast Library Identification and Recognition Technology)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;*시그니처 적용 시 IDA 더미 이름으로 명명 된 함수만 자동으로 이름을 바꿀 수 있습니다. 즉, 사용자가 임의로 함수의 이름을 바꾸고 해당 함수가 나중에 sig를 적용하면 함수의 이름이 변경되지 않습니다. 따라서 분석 초기에 적용하는 것이 유리합니다.&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;color: #333333;&quot;&gt;방법1. idb2pat 활용 &lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1614782612231&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ida.exe -S&quot;[idb2pat.py파일경로]&quot; [idb파일경로]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&quot;-A&quot; 옵션 없이 실행해야 프로그램 로드 및 초기분석 과정 후에 스크립트가 실행된다.&lt;/p&gt;
&lt;p&gt;정상적으로 진행되면 IDA Dialogue 출력창에서 스크립트 실행결과 확인할 수 있다.&lt;br /&gt;아래와 같은 진행이 확인 되지 않으면 보통 뭔가 문제가 생겨서 정상적으로 진행되지 않은 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J4S9M/btqZdmpVIMU/Mkz1RQLdvSK41VHKGhP531/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J4S9M/btqZdmpVIMU/Mkz1RQLdvSK41VHKGhP531/img.png&quot; data-alt=&quot;idb2pat.py&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J4S9M/btqZdmpVIMU/Mkz1RQLdvSK41VHKGhP531/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ4S9M%2FbtqZdmpVIMU%2FMkz1RQLdvSK41VHKGhP531%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;idb2pat.py&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;방법2. Lib 포맷 파일로 부터 추출&lt;/h2&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 방법은 시그니처를 만들 정적 라이브러리 파일(*.lib) 이 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210304_patsig-flirt.png&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;144&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OTqVT/btqZcsyhNbk/2xOcGIsDihNpNXa3vb19t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OTqVT/btqZcsyhNbk/2xOcGIsDihNpNXa3vb19t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OTqVT/btqZcsyhNbk/2xOcGIsDihNpNXa3vb19t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOTqVT%2FbtqZcsyhNbk%2F2xOcGIsDihNpNXa3vb19t0%2Fimg.png&quot; data-filename=&quot;210304_patsig-flirt.png&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;144&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1614865229482&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pcf.exe [lib file path]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;lib file 이 위치한 경로에 pat 파일이 생성된다.&lt;/p&gt;
&lt;p&gt;여러개로 생성된 pat 파일을 하나의 시그니처로 유지하려면 내용을 복사 붙여넣기해서 이어붙여 저장하면된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;.pat 파일&lt;/h3&gt;
&lt;p&gt;생성 된 .pat 파일은 텍스트 파일이어서 내부에 시그니처: 오프셋: 함수 이름정보 등이 들어가있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/odGcv/btqY90HH8sD/Uxbjrirmyis4SgtOsK1Fq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/odGcv/btqY90HH8sD/Uxbjrirmyis4SgtOsK1Fq1/img.png&quot; data-alt=&quot;pattern .pat&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/odGcv/btqY90HH8sD/Uxbjrirmyis4SgtOsK1Fq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FodGcv%2FbtqY90HH8sD%2FUxbjrirmyis4SgtOsK1Fq1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;pattern .pat&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Sinature 파일 생성하기 (.sig)&lt;/h1&gt;
&lt;p&gt;IDA 플러그인 프로그램 중에 sigmake 를 통해서 sig 파일을 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1614783138767&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sigmake [.pat파일경로] [.sig파일경로]
// .pat파일경로는 변환할 pat파일경로
// .sig파일경로는 생성 될 파일명 또는 경로&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Signature COLLISIONS Error&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;같은 패턴을 가지는 함수가 2개 이상있을경우 아래와 같은 충돌 에러 메시지가 나온다.&lt;/p&gt;
&lt;p&gt;잘못된 것은 아니고 어떤것을 패턴의 함수이름으로 할것인지를 선택해주면된다.&lt;/p&gt;
&lt;pre id=&quot;code_1614865488951&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[file path] : modules/leaves: 1/123, COLLISIONS: 1

See the documentation to learn how to resolve collisions. &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;시그니처 파일의 확장자 exc 내용을 보면 아래와 같이 적혀있다.&lt;/p&gt;
&lt;p&gt;첫번쨰 라인을 지워주고, 저장한다. 그리고 다시실행하면 정상적으로 sig파일이 생성된다.&lt;/p&gt;
&lt;pre id=&quot;code_1614865462414&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;;--------- (delete these lines to allow sigmake to read this file)

; add '+' at the start of a line to select a module

; add '-' if you are not sure about the selection

; do nothing if you want to exclude all modules


&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;sig파일을 Signatures window 또는 Shift+f5 눌러서 불러오는 것보다 자동으로 로드 될 수 있는 방법 찾아봤으나, 지정된 일부 시그니처만 자동으로 적용되는것으로 보인다.&lt;/p&gt;
&lt;p&gt;ida pro 에서 제공하는 함수 LoadSigFile로 스크립트 또는 명령으로 불러올 수 있고 자동화 로드 리스트를 만들 수 있을 것 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;IDA Pro 바이너리 호출관계 그래프로 생성하기&lt;/h1&gt;
&lt;p&gt;GDL 문법 기반으로 그래프를 표현하여 텍스트파일로 생성한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;GDL(Graph Description Language) : CFG를&amp;nbsp;표현하기&amp;nbsp;위한&amp;nbsp;Graph&amp;nbsp;Description&amp;nbsp;Language&lt;br /&gt;GDL의 구성&lt;br /&gt;CFG 전체를 대표하는 graph &lt;br /&gt;각 basic block을 나타내는 node &lt;br /&gt;basic block들 간의 관계를 나타내는 edge&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;그래프 생성 코드 Example&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1614783213503&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import idc

cur = idc.MinEA()
end = idc.MaxEA()

path = idc.GetIdbPath().rsplit('.')[0]+ '.gdl'

idc.GenCallGdl(path, 'Call Gdl', idc.CHART_GEN_GDL)
idc.Message('Gdl file has been saved to {}\n'.format(path))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;바이너리 호출 그래프 출력 결과&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcK7T8/btqY7oWGIVm/fV3rKs0lnKeMcTAudMKw3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcK7T8/btqY7oWGIVm/fV3rKs0lnKeMcTAudMKw3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcK7T8/btqY7oWGIVm/fV3rKs0lnKeMcTAudMKw3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcK7T8%2FbtqY7oWGIVm%2FfV3rKs0lnKeMcTAudMKw3k%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Security/Analysis</category>
      <category>CLI</category>
      <category>commandline</category>
      <category>hex-rays</category>
      <category>ida pro</category>
      <category>idapython</category>
      <category>IDB</category>
      <category>idb2pat</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/270</guid>
      <comments>https://code13.tistory.com/270#entry270comment</comments>
      <pubDate>Wed, 3 Mar 2021 23:49:15 +0900</pubDate>
    </item>
    <item>
      <title>Windows 사용자 계정 관리 cmd 그리고 Powershell 로 처리하기</title>
      <link>https://code13.tistory.com/269</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210224_1.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;401&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zcuDf/btqYo0bidB0/gtyRqwqz0JJvKOHusrRlbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zcuDf/btqYo0bidB0/gtyRqwqz0JJvKOHusrRlbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zcuDf/btqYo0bidB0/gtyRqwqz0JJvKOHusrRlbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzcuDf%2FbtqYo0bidB0%2FgtyRqwqz0JJvKOHusrRlbK%2Fimg.png&quot; data-filename=&quot;210224_1.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;401&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Windows 사용자 계정 추가 활성화 삭제 cmd powershell 로 수행하기&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;b&gt;로컬&amp;nbsp;사용자&amp;nbsp;계정&amp;nbsp;만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;1. 시작&amp;nbsp;&amp;nbsp;&amp;gt; 설정&amp;nbsp;&amp;nbsp;&amp;gt; 계정 을 선택한 다음 가족 및 다른 사용자를 선택합니다. 일부 에디션의 Windows에서는 다른 사용자가 표시됩니다.&amp;nbsp; &lt;br /&gt;2. 이 PC에 다른 사용자 추가를 선택합니다. &lt;br /&gt;3. 이 사람의 로그인 정보를 가지고 있지 않습니다.를 선택하고 다음 페이지에서 Microsoft 계정 없이 사용자 추가를 선택합니다. &lt;br /&gt;4. 사용자 이름, 암호, 암호 힌트를 입력하거나 보안 질문을 선택하고 다음을 선택합니다.&lt;/p&gt;
&lt;h2&gt;&lt;b&gt;다른 계정 만들기&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;로컬 사용자 계정을 관리자 계정으로 변경 &lt;br /&gt;1. 시작&amp;nbsp;&amp;nbsp;&amp;gt;설정&amp;nbsp;&amp;nbsp;&amp;gt; 계정 을 선택한 다음, 가족 및 다른 사용자에서, 계정 소유자 이름을 선택한 다음, 계정 유형 변경을 선택합니다.&lt;br /&gt;2. 계정 유형에서 관리자를 선택한 다음,확인을 선택합니다.&lt;br /&gt;3.&amp;nbsp;새&amp;nbsp;관리자&amp;nbsp;계정으로&amp;nbsp;로그인합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210224_2.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;264&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X7LGt/btqYvesAY1P/PITUkk58ZdkMY0sLUcJTMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X7LGt/btqYvesAY1P/PITUkk58ZdkMY0sLUcJTMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X7LGt/btqYvesAY1P/PITUkk58ZdkMY0sLUcJTMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX7LGt%2FbtqYvesAY1P%2FPITUkk58ZdkMY0sLUcJTMk%2Fimg.png&quot; data-filename=&quot;210224_2.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;264&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;CMD(Command Prompt) vs. Powershell&lt;/h1&gt;
&lt;p&gt;&lt;span&gt;cmd.exe is the default command-line interpreter for Windows.&lt;br /&gt;PowerShell is a task automation and configuration management framework from Microsoft.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;210224_3.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;364&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bB31Na/btqYoZXQnaU/NDS0Tmk1NLmWGRR6DBkEtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bB31Na/btqYoZXQnaU/NDS0Tmk1NLmWGRR6DBkEtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bB31Na/btqYoZXQnaU/NDS0Tmk1NLmWGRR6DBkEtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbB31Na%2FbtqYoZXQnaU%2FNDS0Tmk1NLmWGRR6DBkEtK%2Fimg.png&quot; data-filename=&quot;210224_3.png&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;364&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Command prompt (cmd.exe)&lt;/h1&gt;
&lt;p&gt;net&amp;nbsp;user&amp;nbsp;[&amp;lt;UserName&amp;gt;&amp;nbsp;{&amp;lt;Password&amp;gt;&amp;nbsp;|&amp;nbsp;*}&amp;nbsp;[&amp;lt;Options&amp;gt;]]&amp;nbsp;[/domain] &lt;br /&gt;net&amp;nbsp;user&amp;nbsp;[&amp;lt;UserName&amp;gt;&amp;nbsp;{&amp;lt;Password&amp;gt;&amp;nbsp;|&amp;nbsp;*}&amp;nbsp;/add&amp;nbsp;[&amp;lt;Options&amp;gt;]&amp;nbsp;[/domain]] &lt;br /&gt;net&amp;nbsp;user&amp;nbsp;[&amp;lt;UserName&amp;gt;&amp;nbsp;[/delete]&amp;nbsp;[/domain]]&lt;/p&gt;
&lt;p&gt;&lt;b&gt;계정 정보 출력&lt;/b&gt; &lt;br /&gt;net user [UserName]&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;계정 추가&lt;/b&gt; &lt;br /&gt;net user&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[UserName] [pw] /add&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;계정 삭제&lt;/b&gt; &lt;br /&gt;net user&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[UserName] /del&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;계정 활성화/비활성화&lt;/b&gt; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;net user&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[UserName] /active:yes&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp; &lt;i&gt;e.g. &lt;span style=&quot;color: #333333;&quot;&gt;net user&lt;span&gt; guest&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;/active:yes&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;net user&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;[UserName] /active:no&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;관리자 권한 부여&lt;/b&gt; &lt;br /&gt;net localgroup administrators &lt;span style=&quot;color: #333333;&quot;&gt;[UserName] &lt;/span&gt;/add&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Remote Desktop Users Group&lt;/b&gt;&lt;br /&gt;net&amp;nbsp;localgroup&amp;nbsp;Remote&amp;nbsp;Desktop&amp;nbsp;Users&amp;nbsp;UserLoginName&amp;nbsp;/add&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;210224_4.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;468&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AY54z/btqYurFFyLj/BGuIkZ4BY2pkRQK708v6Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AY54z/btqYurFFyLj/BGuIkZ4BY2pkRQK708v6Mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AY54z/btqYurFFyLj/BGuIkZ4BY2pkRQK708v6Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAY54z%2FbtqYurFFyLj%2FBGuIkZ4BY2pkRQK708v6Mk%2Fimg.png&quot; data-filename=&quot;210224_4.png&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;468&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Powershell.exe&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;&lt;b&gt;계정 정보 출력&lt;/b&gt;&lt;br /&gt;&lt;span&gt;Get-LocalUser&lt;/span&gt;&lt;span&gt; -Name&lt;/span&gt;&lt;span&gt; &quot;[&lt;span style=&quot;color: #333333;&quot;&gt;UserName]&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;&lt;br /&gt;&lt;/span&gt;Get-LocalUser&amp;nbsp;-SID&amp;nbsp;S-1-5-21-9526073513-1762370368-3942940353-500&lt;/p&gt;
&lt;p&gt;&lt;b&gt;계정 추가&lt;/b&gt;&lt;br /&gt;New-Local&amp;nbsp;User&amp;nbsp;-Name&amp;nbsp;[username]&amp;nbsp;[Option]&lt;br /&gt;New-LocalUser -Name &quot;John&quot; -Description &quot;Test User&quot; -NoPassword&lt;br /&gt;$&amp;nbsp;password&amp;nbsp;=&amp;nbsp;Read-Host&amp;nbsp;-AsSecureString&lt;br /&gt;New-LocalUser -Name &quot;&lt;span style=&quot;color: #333333;&quot;&gt;John&lt;/span&gt;&quot; -Description &quot;Test User with Password&quot; -Password $ password&lt;/p&gt;
&lt;p&gt;&lt;b&gt;계정삭제&lt;/b&gt;&lt;br /&gt;Remove-LocalUser -Name &quot;[&lt;span style=&quot;color: #333333;&quot;&gt;UserName&lt;/span&gt;]&quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;계정 활성화/비활성화&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Activate&lt;br /&gt;방법1 Enable-LocalUser&lt;/span&gt;&lt;span&gt; -Name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;[UserName]&quot;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;방법2 Get-LocalUser&lt;/span&gt;&lt;span&gt; -Name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;[UserName]&quot;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;Enable-LocalUser&lt;br /&gt;e.g. &lt;span style=&quot;color: #333333;&quot;&gt;Get-LocalUser&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-Name&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;Administrator&quot;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;|&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Enable-LocalUser&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Deactivate&lt;br /&gt;방법1 Disable-LocalUser -Name &quot;[&lt;span style=&quot;color: #333333;&quot;&gt;UserName&lt;/span&gt;]&quot;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;방법2 Get-LocalUser&lt;/span&gt;&lt;span&gt; [UserName] | &lt;/span&gt;&lt;span&gt;Disable-LocalUser&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;e.g. Get-LocalUser&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Guest |&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Disable-LocalUser&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;관리자 권한 부여&lt;/b&gt;&lt;br /&gt;Add-LocalGroupMember -Group Administrators -Member [UserName]&lt;br /&gt;관리자 그룹 보기&lt;br /&gt;Get-LocalGroupMember -Group &quot;Administrators&quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Remote Desktop Users Group&lt;/b&gt;&lt;br /&gt;Add-LocalGroupMember -Group &amp;ldquo;Remote Desktop Users&amp;rdquo; -Member [UserName]&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;숨겨진 계정 생성하기&lt;/h1&gt;
&lt;p&gt;net user [UserName$] /add&lt;br /&gt;이렇게 하면 net user 명령으로는 &lt;span style=&quot;color: #333333;&quot;&gt;UserName$ 이 나오지 않음 (실제로 $는 숨겨진 계정을 의미)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;로그인 화면에서는 &lt;span style=&quot;color: #333333;&quot;&gt;UserName$ 이 보인다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;net localgroup administrators [UserName$] /add&lt;br /&gt;여기서는 net localgroup administrators 명령으로 &lt;span style=&quot;color: #333333;&quot;&gt;UserName$ 가 보인다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;net user guest$ /add 하면 기존 guest 계정과는 별도로 숨겨진 일반계정이 생성 (이름만 guest)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;추가한 후에 net start&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;+새 관리자 계정 생성 및 섀도우 계정 생성, 새 관리자 정보를 섀도우 계정에 복사, 새로 생성 된 관리자 계정 삭제, 섀도우 계정 만 남기기, 원격 로그인시 섀도우 계정은 인증되지 않았으며 하나만 수행 할 수 있습니다. &lt;br /&gt;대상을 입력하고 원격 로그인 인증을 설정.&lt;span&gt; &lt;/span&gt;이 섀도우 계정 -&amp;gt; 레지스트리 만 찾을 수있다고 함&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Create&amp;nbsp;a&amp;nbsp;local&amp;nbsp;user&amp;nbsp;or&amp;nbsp;administrator&amp;nbsp;account&amp;nbsp;in&amp;nbsp;Windows&amp;nbsp;10&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://support.microsoft.com/en-us/windows/create-a-local-user-or-administrator-account-in-windows-10-20de74e0-ac7f-3502-a866-32915af2a34d&quot;&gt;support.microsoft.com/en-us/windows/create-a-local-user-or-administrator-account-in-windows-10-20de74e0-ac7f-3502-a866-32915af2a34d&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.localaccounts/new-localuser?view=powershell-5.1&quot;&gt;docs.microsoft.com/en-us/powershell/module/microsoft.powershell.localaccounts/new-localuser?view=powershell-5.1&lt;/a&gt;&lt;/p&gt;</description>
      <category>Computer Science/Windows Externals</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/269</guid>
      <comments>https://code13.tistory.com/269#entry269comment</comments>
      <pubDate>Wed, 24 Feb 2021 22:15:07 +0900</pubDate>
    </item>
    <item>
      <title>DBI(Dynamic Binary Instrumentation) 겉핥기로 알아보기</title>
      <link>https://code13.tistory.com/267</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210223_4.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;257&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU0DvB/btqYgG5zx4z/PrtYfCsq52SU98dKBHhM7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU0DvB/btqYgG5zx4z/PrtYfCsq52SU98dKBHhM7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU0DvB/btqYgG5zx4z/PrtYfCsq52SU98dKBHhM7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU0DvB%2FbtqYgG5zx4z%2FPrtYfCsq52SU98dKBHhM7k%2Fimg.png&quot; data-filename=&quot;210223_4.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;257&quot; width=&quot;800&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;DBI (Dynamic Binary Instrumentation)&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;printf(&quot;test %s&quot;, buf); 등과 같이 특정 시점에서의 변수값 등을 확인하거나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;프로그램의 행위를 조사하는 일&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;을 Instrumentation&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;라고 부른다 &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;바이너리 분석&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;을 할때 각종&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;모니터링 툴&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;들을 켜고 악성코드를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;실행하여 행위를 분석&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하거나, 런타임에 코드를 후킹하여 데이터를 조사 또는 변경하는 방법으로 분석한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;br /&gt;비교 &lt;span style=&quot;color: #333333;&quot;&gt;DBA vs. DBI&lt;/span&gt;&lt;/h1&gt;
&lt;h3&gt;&lt;br /&gt;DBA (Dynamic Binary Analysis) = Dynamic Program Analysis = Dynamic Analysis&lt;/h3&gt;
&lt;p&gt;프로그램 런타임에 바이너리를 분석한다.&lt;br /&gt;소프트웨어를 실제 또는 가상프로세서에서 프로그램을 실행함으로서 바이너리를 분석하는 방법이다.&lt;br /&gt;Dynamic Analysis 는 Static Analysis 에 비해 효과가 좋은편이나 테스트를 위한 충분한 테스트 커버리지가 가능해야한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Static binary instrumentation&lt;/b&gt; :&amp;nbsp; 프로그램이 실행되기 전에 object code, executable code를 재작성하는 단계에서 수행&lt;br /&gt;&lt;b&gt;Dynamic binary instrumentation&lt;/b&gt; : 런타임 단계에서 수행&lt;/p&gt;
&lt;h3&gt;DBI (Dynamic Binary Instrumentation)&lt;/h3&gt;
&lt;p&gt;바이너리를 런타임(실행되고 있는동안) 코드를 삽입하여 동작 분석한다.&lt;br /&gt;코드를 삽입하여 동작을 분석하는 행위가 instrumentation&lt;br /&gt;DBA 의 방법 중 하나로서 DBI 가 있다고 이해하였다.&lt;/p&gt;
&lt;h1&gt;​ &lt;br /&gt;비교 SI vs. BI&lt;/h1&gt;
&lt;h3&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;SI (Source Instrumentation) &lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;소스 코드 수준에서 하는 행위&lt;br /&gt;소스&amp;nbsp;계측은&amp;nbsp;개발자와&amp;nbsp;도메인&amp;nbsp;전문가가&amp;nbsp;실행중인&amp;nbsp;응용&amp;nbsp;프로그램에&amp;nbsp;대한&amp;nbsp;테스트&amp;nbsp;시나리오를&amp;nbsp;작성하기&amp;nbsp;위해&amp;nbsp;테스트중인&amp;nbsp;소스를&amp;nbsp;선택적으로&amp;nbsp;계측하는&amp;nbsp;프로세스입니다.&amp;nbsp;소스&amp;nbsp;계측을&amp;nbsp;활용하는&amp;nbsp;테스트를&amp;nbsp;구현하는&amp;nbsp;것을&amp;nbsp;Expectation&amp;nbsp;Testing이라고합니다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BI (Binary Instrumentation)&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;바이너리&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수준에서 하는 행위&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BI&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 중에서도 바이너리 실행 중에 조사하는 것을 DBI 라 부른다. 바이너리가 어떤 &lt;b&gt;함수&lt;/b&gt;들을 &lt;b&gt;호출&lt;/b&gt;하는지, 또 &lt;b&gt;인자값&lt;/b&gt;은 무엇인지 등을 &lt;b&gt;조사&lt;/b&gt;하는 것.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;바이너리 분석&lt;/b&gt;을 할때 각종 &lt;b&gt;모니터링 툴&lt;/b&gt;들을 켜고 악성코드를 &lt;b&gt;실행하여 행위를 분석&lt;/b&gt;하거나, 런타임에 코드를 후킹하여 데이터를 조사 또는 변경하는 방법으로 분석한다.&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;br /&gt;DBI의 프로젝트&lt;/h1&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Frida&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;PIN&lt;br /&gt;DynamoRio&lt;br /&gt;Dyninst&lt;br /&gt;Bochs&lt;br /&gt;Valgrind&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210223_2.png&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;554&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2912z/btqYiCOZkg9/Ulds4SkF85qt7uPtnv3d5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2912z/btqYiCOZkg9/Ulds4SkF85qt7uPtnv3d5k/img.png&quot; data-alt=&quot;DynamoRIO&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2912z/btqYiCOZkg9/Ulds4SkF85qt7uPtnv3d5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2912z%2FbtqYiCOZkg9%2FUlds4SkF85qt7uPtnv3d5k%2Fimg.png&quot; data-filename=&quot;210223_2.png&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;554&quot; width=&quot;500&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;DynamoRIO&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;Frida DBI&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210223_3.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;98&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GJwjh/btqYpW6dQ8F/ZwB8eVCHhE6UgwEmIbLpTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GJwjh/btqYpW6dQ8F/ZwB8eVCHhE6UgwEmIbLpTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GJwjh/btqYpW6dQ8F/ZwB8eVCHhE6UgwEmIbLpTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGJwjh%2FbtqYpW6dQ8F%2FZwB8eVCHhE6UgwEmIbLpTk%2Fimg.png&quot; data-filename=&quot;210223_3.png&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;98&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Frida가 중요한 이유는 IOS ANDROID 같은 환경에서는 로컬 디버깅이 제한되지만 Frida를 사용하면 로컬 디버깅하는 것 처럼 동적 분석이 가능&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;b&gt;FRIDA 는 scriptable 한 DBI 프레임워크 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;vala 라는 특이한 프로그래밍 언어로 작성) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;DBI 를 위한 주 조작은 자바스크립트를 통해서 하며,&lt;b&gt; C/S 구조&lt;/b&gt;로 동작하게 된다. &lt;br /&gt;&lt;/span&gt;&lt;span&gt;즉 처음에 바이너리에 프레임워크 라이브러리를 &lt;b&gt;인젝션&lt;/b&gt;하여 &lt;b&gt;파이프&lt;/b&gt;를 만들어 놓고, 그 파&lt;b&gt;이프를 통해서 명령을 주고 받으면서 바이너리 조사&lt;/b&gt;를 할 수 있도록 되어 있다. 물론 C/S 를 사용하지 않고 그냥&lt;b&gt; PIN 처럼 내부적으로 동작하도록 할 수도&lt;/b&gt; 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Frida는 Python 기반의 프로그램입니다. 물론 Core 부분은 C와 Google V8 Engine으로 작성됬지만 대체로 Python library를 많이 사용하고,&amp;nbsp;&lt;/span&gt;&lt;span&gt;여러가지 언어를 이용하여 스크립트를 작성할 수 있으나(바이너리 조작은 자바스크립트로 해야 한다) &lt;b&gt;Python 이 가장 단순&lt;/b&gt;하고 좋은 듯 하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;하지만 제작자는 발표 등을 할 때 node.js 를 많이 사용하는 모습을 보여주고 있다. &lt;/span&gt;FRIDA 의 가장 큰 장점은&lt;b&gt; 다양한 플랫폼&lt;/b&gt;을 지원한다는 것이다. PIN 과는 달리 ARM 아키텍쳐를 지원하므로 Android, IOS 앱에도 적용이 가능하다. 또한 64 bit 에서도 정상적으로 동작한다.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;또한, 컴파일이 필요없는 스크립트 언어로 작성이 가능하다는 것도 매력적이다. 코드 수정이 빈번한 경우 매번 컴파일을 하는 것만큼 귀찮은 것은 없기 때문이다.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br /&gt;Frida 제공기능&lt;/h3&gt;
&lt;p&gt;특정함수에 연결해 함수후킹 &lt;br /&gt;함수추적관점&amp;nbsp;실행중인&amp;nbsp;앱디버깅 &lt;br /&gt;실시간&amp;nbsp;트래픽&amp;nbsp;스니핑&amp;nbsp;및&amp;nbsp;암호해독 &lt;br /&gt;&lt;br /&gt;파이썬기반의&amp;nbsp;라이브러리&amp;nbsp;+&amp;nbsp;커맨드라인,&amp;nbsp;네이티브앱&amp;nbsp;후킹&amp;nbsp;통한&amp;nbsp;분석가능&amp;nbsp;&amp;nbsp; &lt;br /&gt;대상:&amp;nbsp;윈도우즈&amp;nbsp;맥,&amp;nbsp;리눅스&amp;nbsp;IOS&amp;nbsp;안드로이드&amp;nbsp;QNX&amp;nbsp; &lt;br /&gt;다양한&amp;nbsp;플랫폼에서&amp;nbsp;후킹을&amp;nbsp;할수&amp;nbsp;있는&amp;nbsp;플랫폼&amp;nbsp;/&amp;nbsp;파이썬틀에&amp;nbsp;인젝션할&amp;nbsp;코드를&amp;nbsp;자바스크립트로&amp;nbsp;작성가능&amp;nbsp;파이썬으로&amp;nbsp;실행할수있음 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210223_1.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;474&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5oXPz/btqYkbwJZAf/yZkkPr9SnSPLW74wlEzKc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5oXPz/btqYkbwJZAf/yZkkPr9SnSPLW74wlEzKc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5oXPz/btqYkbwJZAf/yZkkPr9SnSPLW74wlEzKc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5oXPz%2FbtqYkbwJZAf%2FyZkkPr9SnSPLW74wlEzKc1%2Fimg.png&quot; data-filename=&quot;210223_1.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;474&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Frida windows example)&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1614089193259&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from __future__ import print_function
import frida
import sys

def on_message(message, data):
    print(&quot;[%s] =&amp;gt; %s&quot; % (message, data))

def main(target_process):
    session = frida.attach(target_process)

    script = session.create_script(&quot;&quot;&quot;

    // Find base address of current imported jvm.dll by main process fledge.exe
    var baseAddr = Module.findBaseAddress('Jvm.dll');
    console.log('Jvm.dll baseAddr: ' + baseAddr);

    var SetAesDeCrypt0 = resolveAddress('0x1FF44870'); // Here we use the function address as seen in our disassembler

    Interceptor.attach(SetAesDeCrypt0, { // Intercept calls to our SetAesDecrypt function

        // When function is called, print out its parameters
        onEnter: function (args) {
            console.log('');
            console.log('[+] Called SetAesDeCrypt0' + SetAesDeCrypt0);
            console.log('[+] Ctx: ' + args[0]);
            console.log('[+] Input: ' + args[1]); // Plaintext
            console.log('[+] Output: ' + args[2]); // This pointer will store the de/encrypted data
            console.log('[+] Len: ' + args[3]); // Length of data to en/decrypt
            dumpAddr('Input', args[1], args[3].toInt32());
            this.outptr = args[2]; // Store arg2 and arg3 in order to see when we leave the function
            this.outsize = args[3].toInt32();
        },

        // When function is finished
        onLeave: function (retval) {
            dumpAddr('Output', this.outptr, this.outsize); // Print out data array, which will contain de/encrypted data as output
            console.log('[+] Returned from SetAesDeCrypt0: ' + retval);
        }
    });

    function dumpAddr(info, addr, size) {
        if (addr.isNull())
            return;

        console.log('Data dump ' + info + ' :');
        var buf = addr.readByteArray(size);

        // If you want color magic, set ansi to true
        console.log(hexdump(buf, { offset: 0, length: size, header: true, ansi: false }));
    }

    function resolveAddress(addr) {
        var idaBase = ptr('0x1FEE0000'); // Enter the base address of jvm.dll as seen in your favorite disassembler (here IDA)
        var offset = ptr(addr).sub(idaBase); // Calculate offset in memory from base address in IDA database
        var result = baseAddr.add(offset); // Add current memory base address to offset of function to monitor
        console.log('[+] New addr=' + result); // Write location of function in memory to console
        return result;
    }
&quot;&quot;&quot;)
    script.on('message', on_message)
    script.load()
    print(&quot;[!] Ctrl+D on UNIX, Ctrl+Z on Windows/cmd.exe to detach from instrumented program.\n\n&quot;)
    sys.stdin.read()
    session.detach()

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print(&quot;Usage: %s &amp;lt;process name or PID&amp;gt;&quot; % __file__)
        sys.exit(1)

    try:
        target_process = int(sys.argv[1])
    except ValueError:
        target_process = sys.argv[1]
    main(target_process)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Security/Analysis</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/267</guid>
      <comments>https://code13.tistory.com/267#entry267comment</comments>
      <pubDate>Tue, 23 Feb 2021 23:21:15 +0900</pubDate>
    </item>
    <item>
      <title>Windows 부모프로세스가 생성하는 자식프로세스 디버깅 따라가기</title>
      <link>https://code13.tistory.com/268</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210223_6.png&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;279&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mwUPg/btqYpWkSB0G/WLfCNLmivbzMqT6c5uIho0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mwUPg/btqYpWkSB0G/WLfCNLmivbzMqT6c5uIho0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mwUPg/btqYpWkSB0G/WLfCNLmivbzMqT6c5uIho0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmwUPg%2FbtqYpWkSB0G%2FWLfCNLmivbzMqT6c5uIho0%2Fimg.png&quot; data-filename=&quot;210223_6.png&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;279&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Windows&amp;nbsp;How&amp;nbsp;to&amp;nbsp;Debug&amp;nbsp;Child&amp;nbsp;Process&amp;nbsp;?&lt;/h1&gt;
&lt;p&gt;윈도우즈에서 자식프로세스를 디버깅하기 위해서는 디버거로 자식프로세스로 따라가주어야 한다.&lt;/p&gt;
&lt;p&gt;WinDbg의 경우에는 별도의 설정 없이 이것이 가능하지만, OllyDbg, x64Dbg에서는 Child Process 생성 후 Pending 하고 디버거 Attach 하고 디버깅을 진행하게 된다.&lt;/p&gt;
&lt;p&gt;그럼 왜 이런 차이가 발생할까?&lt;/p&gt;
&lt;h1&gt;WinDbg (The Windows Debugger)&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210223_7.png&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;546&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C7ioU/btqYpVM0GMc/UM4f27XWOW4CM9IeWabthk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C7ioU/btqYpVM0GMc/UM4f27XWOW4CM9IeWabthk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C7ioU/btqYpVM0GMc/UM4f27XWOW4CM9IeWabthk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC7ioU%2FbtqYpVM0GMc%2FUM4f27XWOW4CM9IeWabthk%2Fimg.png&quot; data-filename=&quot;210223_7.png&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;546&quot; width=&quot;600&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;WinDbg 에서 디버깅 할때&amp;nbsp;&amp;nbsp;자식프로세스를 CreateProcess 하게될 때 인자로 Debug flag 를 함께넘긴다. &lt;a href=&quot;https://docs.microsoft.com/ko-kr/windows/win32/procthread/process-creation-flags?redirectedfrom=MSDN&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;docs.microsoft.com/ko-kr/windows/win32/procthread/process-creation-flags?redirectedfrom=MSDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;DEBUG_PROCESS 0x00000001&lt;/b&gt; &lt;br /&gt;The&amp;nbsp;calling&amp;nbsp;thread&amp;nbsp;starts&amp;nbsp;and&amp;nbsp;debugs&amp;nbsp;the&amp;nbsp;new&amp;nbsp;process&amp;nbsp;and&amp;nbsp;all&amp;nbsp;child&amp;nbsp;processes&amp;nbsp;created&amp;nbsp;by&amp;nbsp;the&amp;nbsp;new&amp;nbsp;process.&amp;nbsp;It&amp;nbsp;can&amp;nbsp;receive&amp;nbsp;all&amp;nbsp;related&amp;nbsp;debug&amp;nbsp;events&amp;nbsp;using&amp;nbsp;the&amp;nbsp;WaitForDebugEvent&amp;nbsp;function. &lt;br /&gt;A&amp;nbsp;process&amp;nbsp;that&amp;nbsp;uses&amp;nbsp;DEBUG_PROCESS&amp;nbsp;becomes&amp;nbsp;the&amp;nbsp;root&amp;nbsp;of&amp;nbsp;a&amp;nbsp;debugging&amp;nbsp;chain.&amp;nbsp;This&amp;nbsp;continues&amp;nbsp;until&amp;nbsp;another&amp;nbsp;process&amp;nbsp;in&amp;nbsp;the&amp;nbsp;chain&amp;nbsp;is&amp;nbsp;created&amp;nbsp;with&amp;nbsp;DEBUG_PROCESS. &lt;br /&gt;If&amp;nbsp;this&amp;nbsp;flag&amp;nbsp;is&amp;nbsp;combined&amp;nbsp;with&amp;nbsp;DEBUG_ONLY_THIS_PROCESS,&amp;nbsp;the&amp;nbsp;caller&amp;nbsp;debugs&amp;nbsp;only&amp;nbsp;the&amp;nbsp;new&amp;nbsp;process,&amp;nbsp;not&amp;nbsp;any&amp;nbsp;child&amp;nbsp;processes.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;x64Dbg&amp;nbsp;&lt;/h1&gt;
&lt;p&gt;An&amp;nbsp;open-source&amp;nbsp;x64/x32&amp;nbsp;debugger&amp;nbsp;for&amp;nbsp;windows&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot; width=&quot;162&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NZqRp/btqYgHcazLn/kEvb9nN0kzAfw43hFNBFeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NZqRp/btqYgHcazLn/kEvb9nN0kzAfw43hFNBFeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NZqRp/btqYgHcazLn/kEvb9nN0kzAfw43hFNBFeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNZqRp%2FbtqYgHcazLn%2FkEvb9nN0kzAfw43hFNBFeK%2Fimg.png&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;225&quot; width=&quot;162&quot; height=&quot;NaN&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;그에 반해 다른 디버거는 CreateProcess 할 때 debug flag가 인자로 넘어가지 않는다. &lt;br /&gt;&lt;br /&gt;찾아보니&amp;nbsp;x64Dbg&amp;nbsp;에서&amp;nbsp;기본옵션으로&amp;nbsp;child&amp;nbsp;process&amp;nbsp;디버깅&amp;nbsp;을&amp;nbsp;붙이는&amp;nbsp;옵션을&amp;nbsp;제공하지&amp;nbsp;않았다.&lt;/p&gt;
&lt;p&gt;그러면 Windbg 를 써야할까 ? 대안은 플러그인을 쓰는것이다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Actually child process debugging isn't supported directly, but through a plugin by DbgChild&lt;/blockquote&gt;
&lt;p&gt;관련 플러그인 &lt;a href=&quot;https://github.com/David-Reguera-Garcia-Dreg/DbgChild&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;github.com/David-Reguera-Garcia-Dreg/DbgChild&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;210223_5.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;349&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EEnzg/btqYkbDCAGL/FSZZPnAbuxJ9gr03gzbXEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EEnzg/btqYkbDCAGL/FSZZPnAbuxJ9gr03gzbXEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EEnzg/btqYkbDCAGL/FSZZPnAbuxJ9gr03gzbXEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEEnzg%2FbtqYkbDCAGL%2FFSZZPnAbuxJ9gr03gzbXEk%2Fimg.png&quot; data-filename=&quot;210223_5.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;349&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;DbgChild는 자식 프로세스를 디버깅하기위한 standalone 도구입니다 (auto attach). DbgChild는 디버거 플러그인과 함께 사용할 수 있습니다. 현재 DbgChild는 x86 / x64 x64dbg 디버거용 플러그인을 지원합니다.&lt;/p&gt;</description>
      <category>Computer Security/Analysis</category>
      <author>Maj0r Tom</author>
      <guid isPermaLink="true">https://code13.tistory.com/268</guid>
      <comments>https://code13.tistory.com/268#entry268comment</comments>
      <pubDate>Tue, 23 Feb 2021 15:48:41 +0900</pubDate>
    </item>
  </channel>
</rss>