<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>♥</title>
        <link>https://velog.io/</link>
        <description>대학교 2학년, 컴퓨터학과</description>
        <lastBuildDate>Sun, 18 May 2025 14:24:08 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>♥</title>
            <url>https://velog.velcdn.com/images/lojhb__m/profile/4670f50a-4381-4379-a372-5a706b4cb1ca/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ♥. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lojhb__m" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Return Address Overwrite]]></title>
            <link>https://velog.io/@lojhb__m/Return-Address-Overwrite</link>
            <guid>https://velog.io/@lojhb__m/Return-Address-Overwrite</guid>
            <pubDate>Sun, 18 May 2025 14:24:08 GMT</pubDate>
            <description><![CDATA[<p><a href="https://dreamhack.io/wargame/challenges/351">https://dreamhack.io/wargame/challenges/351</a></p>
<p>워게임 Return Address Overwrite를 풀어보았다.</p>
<ol>
<li><p>문제 파일을 다운로드하고 압축을 풀었더니 rao와 rao.c라는 파일이 있었다.
<img src="https://velog.velcdn.com/images/lojhb__m/post/b642952e-9ee5-44b5-908f-aeddc11a1837/image.png" alt=""></p>
</li>
<li><p>터미널을 실행시켜 파일의 폴더로 이동하였다.<img src="https://velog.velcdn.com/images/lojhb__m/post/f47a5f81-bb10-44fa-ad37-c84eade8b6fe/image.png" alt=""></p>
</li>
<li><p>cat rao.c를 통해 rao.c 소스코드를 열어보았다.
<img src="https://velog.velcdn.com/images/lojhb__m/post/8754f144-d591-4657-add6-362e18e9f671/image.png" alt=""></p>
</li>
</ol>
<ul>
<li>scanf()를 통해 입력을 받고 있어서 버퍼 오버플로우 공격이 가능하다.</li>
<li>get_shell() 함수에서 쉘을 띄어줄 수 있다.</li>
</ul>
<ol start="4">
<li>gdb로 어셈블리어 코드를 확인한다.
<img src="https://velog.velcdn.com/images/lojhb__m/post/b03a1795-a9c3-4764-a318-e40008b68916/image.png" alt=""></li>
</ol>
<p><strong>어셈블리어 코드</strong><img src="https://velog.velcdn.com/images/lojhb__m/post/ee58f0ad-9100-4598-95b5-705d12f2d25b/image.png" alt=""></p>
<ul>
<li>버퍼 오버플로우를 해서 flag를 얻어야 한다.</li>
<li>buf에 0x30+0x8bytes의 임의의 문자와 0x8bytes의 return address를 입력하면 &lt;+65&gt;의 ret 실행 시 입력한 return address로 jump할 것이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/ccea145d-3ae4-4751-bba0-0cc82c69c954/image.png" alt=""></p>
<ul>
<li>get shell의 주소를 알아냈다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/83fa0af4-dc0a-44be-acd8-b3505bcff65b/image.png" alt=""></p>
<ul>
<li>python3 rao_ex.py를 입력</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/4c836964-bd4d-4107-b677-2c3cfb0958fe/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/7834e33e-3487-44f6-b8dc-67db9cb00ed5/image.png" alt=""></p>
<ul>
<li>flag를 얻었다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[드림핵] Web Hacking 1]]></title>
            <link>https://velog.io/@lojhb__m/%EB%93%9C%EB%A6%BC%ED%95%B5-Web-Hacking-1</link>
            <guid>https://velog.io/@lojhb__m/%EB%93%9C%EB%A6%BC%ED%95%B5-Web-Hacking-1</guid>
            <pubDate>Sun, 11 May 2025 15:29:16 GMT</pubDate>
            <description><![CDATA[<h1 id="1-web-hacking-introduction">1. Web Hacking Introduction</h1>
<h3 id="1-1-introduction">1-1. Introduction</h3>
<ul>
<li>위 강의를 듣기 위해서는 Flask, NodeJS, Spring 중 한가지 프레임워크로 작성된 웹 소스를 읽고 이해할 수 있어야 한다.</li>
</ul>
<h1 id="2-웹-기초-지식">2. 웹 기초 지식</h1>
<h3 id="2-1-웹-기본-상식">2-1. 웹 기본 상식</h3>
<p><strong>통신</strong></p>
<ul>
<li>정보를 전하는 것.</li>
</ul>
<p><strong>웹(World Wide Web, W3, Web)</strong></p>
<ul>
<li>인터넷이라는 통신망을 활용하여 구현된 전 지구적 정보 공간. 시간과 장소에 구애받지 않고 인터넷에 접속할 수만 있다면 웹을 사용할 수 있다. (웹은 연결된 사람들 사이에 형성되는 정보의 흐림이 거미줄 같다는 뜻으로 붙여짐.)</li>
<li>HTTP를 이용하여 정보를 공유하는 서비스.</li>
<li>HTTP: 웹상에서 서로 통신을 하기 위해 정해둔 일종의 규칙.</li>
<li>웹 서버(Web Server): 웹에서 정보를 제공하는 주체.</li>
<li>웹 클라이언트(Web Client): 웹에서 정보를 요구하고, 정보를 받는 이용자.</li>
</ul>
<p><strong>웹서비스</strong></p>
<ul>
<li>웹 상에서 제공되는 서비스</li>
<li>과거: 이용자가 요청하는 정보를 제공하기만 하는 수동적인 형태의 서비스.</li>
<li>현재: 이용자의 요청을 해석하고 가공하여 필요한 정보와 기능을 제공하는 능동형 서비스.</li>
</ul>
<p><strong>프론트엔드</strong></p>
<ul>
<li>웹 서비스 구조에서, 이용자의 요청을 받는 부분.</li>
<li>이용자에게 직접 보여지는 부분으로 <strong>웹 리소스</strong>라는 것으로 구성된다. 페이지가 보여주고 있는 정보들은 모두 웹 리소스에 명시되어 있다.</li>
</ul>
<p><strong>백엔드</strong></p>
<ul>
<li>웹 서비스 구조에서, 요청을 처리하는 부분.</li>
</ul>
<p><strong>웹 리소스</strong></p>
<ul>
<li>웹에 갖춰진 정보 자산.</li>
<li>모든 웹 리소스는 고유의 URL(Uniform Resource Identifier)을 가지고, 이를 이용하여 식별된다.</li>
<li>대표적인 웹 리소스<ul>
<li>HTML: 웹 문서의 뼈와 살의 역할. 태그와 속성을 통한 구조화된 문서 작성을 지원한다.</li>
<li>CSS: 웹 문서의 생김새를 지정하는 역할. 웹 리소스들의 시각화 방법(요소들의 색상, 모양, 크기와 위치)을 기재한 스타일 시트. 브라우저는 이를 참고하여 웹 문서를 시각화한다.</li>
<li>JS: 웹 문서의 동작을 정의. 이용자가 데이터를 입력하면 실행할 동작들을 구현한다. 클라이언트가 실행하는 코드라고 하여 Client-Side Script라고도 부른다.</li>
</ul>
</li>
</ul>
<p><strong>웹 클라이언트와 서버의 통신</strong></p>
<ol>
<li>클라이언트인 이용자가 브라우저를 이요하여 웹 서버에 접속</li>
<li>클라이언트의 브라우저는 이용자의 요청을 해석하여 HTTP 형식으로 웹 서버에 리소스를 요청.</li>
<li>서버의 HTTP로 전달된 이용자의 요청을 해석하고, 그에 따라 적절한 동적을 한다.</li>
<li>서버는 이용자에게 전달할 리소스를 HTTP 형식으로 이용자에게 전달한다.</li>
<li>클라이언트의 브라우저는 서버에게 응답받은 웹 리소스를 시각화하여 이용자에게 보여준다.</li>
</ol>
<h3 id="2-2-httphttps">2-2. HTTP/HTTPS</h3>
<p><strong>인코딩 표준</strong></p>
<ul>
<li>컴퓨터에서 0과 1로 문자를 표현하는 약속.</li>
<li>아스키(Ascii)와 유니코드(Unicode)가 있다.</li>
<li>아스키: 7비트 데이터에 대한 인코딩. 영어를 표현할 때 사용하였는데, 다른 언어를 표현할 때는 호환되지 않아 소프트웨어를 개발하려는 회사에 큰 부담이 되었음. 이러한 어려움을 해결하기 위해 유니코드라는 새로운 표준이 만들어짐.</li>
<li>유니코드: 모든 언어의 문자를 표현하고자 하는 목표로 제정됨.</li>
<li>유니코드에서 한 문자는 최대 32개의 비트로 표현되기에, 표현할 수 있는 정보의 가짓수는 약 42억개(2^32)이다. 전 세계의 문자를 표현하고도 남을 넓은 공간이기에, 남는 공간에는 이모지들을 표현하고 있음.</li>
</ul>
<p><strong>통신 프로토콜</strong></p>
<ul>
<li>프로토콜: 규격화된 상호작용(요청과 응답)에 적용되는 약속. 프로토콜은 각 통신 주체가 교환하는 데이터를 명확히 해석할 수 있도록 문법을 포함한다.</li>
<li>표준 통신 프로토콜: TCP/IP(네트워크 통신의 기초), HTTP(웹 애플리케이션이 사용), FTP(파일을 주고받을 때 사용)</li>
</ul>
<p><strong>HTTP</strong></p>
<ul>
<li>서버와 클라이언트의 데이터 교환을 요청과 응답 형식으로 정의한 프로토콜. 기본 메커니즘은 클라이언트가 서버에게 요청하면, 서버가 응답하는 것이다.</li>
<li>웹 서버는 HTTP 서버를 HTTP 서비스 포트에 대기시킨다. 일반적으로 TCP/80 또는 TCP/8080 포트를 사용한다.</li>
</ul>
<p><strong>네트워크 포트와 서비스 포트</strong></p>
<ul>
<li>네트워크 포트: 네트워크에서 서버와 클라이언트가 정보를 교환하는 추상화된 장소.</li>
<li>서비스 포트: 네트워크 포트 중에서 특정 서비스가 점유하고 있는 포트. 예를 들어 HTTP가 80번 포트를 점유하고 있으므로 HTTP의 서비스 포트는 80번 포트가 된다.</li>
<li>전송계층: 포트로 데이터를 교환할 때 따르는 프로토콜. 대표적으로 TCP와 UDP가 있다. 서로 다른 전송계층은 서로 다른 프로토콜로 전송해야 하므로 서비스 포트를 표기할 때는 서비스가 사용하는 전송 계층 프로토콜을 같이 표기하기도 한다.</li>
<li>현대의 운영체제에서 포트의 개수는 0~65545번까지 사용하고 있다.</li>
<li>특권 포트(잘 알려진 포트): 0~1023번 포트, 각 포트 번호에 유명한 서비스가 등록되어 있다. 잘 알려진 포트에 서비스를 실행하려면 관리자 권한이 필요하기에 클라이언트는 이 대역에서 실행중인 서비스들은 관리자의 것이라고 신뢰할 수 있다.<ul>
<li>예시로는 22번 포트에 SSH, 80번 포트에 HTTP, 443번 포트에 HTTPS가 할당되어 있다. </li>
</ul>
</li>
</ul>
<p><strong>HTTP 메세지</strong></p>
<ul>
<li>HTTP 메세지에는 클라이언트가 전송하는 HTTP 요청, 서버가 반환하는 HTTP 응답이 있다. 이들은 크게 헤더와 바디로 구성된다는 공통점이 있다.</li>
</ul>
<p><strong>HTTP 헤더</strong></p>
<ul>
<li>각 줄은 CRLF로 구분되며, 첫 줄은 시작 줄, 나머지 줄은 헤더라고 부른다. 헤더의 끝은 빈 줄로 나타낸다.</li>
<li>시작 줄의 역할은 요청과 응답에서 큰 차이가 있다.</li>
<li>헤더는 필드와 값으로 구성되며 HTTP 메세지 또는 바디의 속성을 나타낸다. 하나의 HTTP 메세지에는 0개 이상의 헤더가 있을 수 있다.</li>
</ul>
<p><strong>HTTP 바디</strong></p>
<ul>
<li>헤드의 끝을 나타내는 CRLF 뒤 모든 줄.</li>
<li>클라이언트나 서버에게 전송하려는 데이터가 바디에 담긴다.</li>
</ul>
<p><strong>CRLF</strong></p>
<ul>
<li>CR(Carriage Return): 커서를 현재 줄의 맨 앞으로 이동시키는 문자</li>
<li>LF(Line Feed): 커서를 다음 줄로 이동시키는 문자.</li>
</ul>
<p><strong>HTTP 요청</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 4장. 데이터베이스와의 상호작용]]></title>
            <link>https://velog.io/@lojhb__m/PHP4%EC%9E%A5.-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80%EC%9D%98-%EC%83%81%ED%98%B8%EC%9E%91</link>
            <guid>https://velog.io/@lojhb__m/PHP4%EC%9E%A5.-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80%EC%9D%98-%EC%83%81%ED%98%B8%EC%9E%91</guid>
            <pubDate>Mon, 31 Mar 2025 11:26:43 GMT</pubDate>
            <description><![CDATA[<h2 id="41-sql-기본">4.1 SQL 기본</h2>
<ul>
<li><p>SQL: 데이터베이스에서 데이터를 조작하고 관리하기 위해 사용되는 표준화된 언어. SQL을 사용하여 데이터베이스에 쿼리(데이터베이스에서 원하는 정보를 요청하거나 질의하는 행위)를 전송하고 결과를 받아올 수 있다.</p>
</li>
<li><p>SQL 종류</p>
<ol>
<li>데이터 조작 언어(DML): 데이터를 검색, 삽입, 갱신, 삭제하는데 사용되는 언어. (대표적 구문: SELECT, INSERT, UPDATE, DELETE)  </li>
<li>데이터 정의 언어(DDL): 데이터베이스 구조를 정의하고 조작하는데 사용되는 언어. (대표적 구문: CREATE, ALTER, DROP)</li>
<li>데이터 제어 언어(DCL): 데이터 베이스에 대한 접근 권한을 제어하는데 사용되는 언어 (대표적 구문: GRANT, REVOKE)</li>
</ol>
</li>
</ul>
<ul>
<li><p>데이터 검색하기(SELECT): SELECT문을 사용하면 데이터 베이스에서 원하는 데이터를 검색할 수 있다. FROM절을 통해 테이블을 지정하고, WHERE 절을 통해 조건을 설정하여 데이터를 필터링 할 수 있다.</p>
<pre><code>SELECT * FROME 테이블명</code></pre></li>
<li><p>데이터 필터링하기(WHERE): WHERE 절을 사용하여 데이터를 조건에 따라 필터링할 수 있다. 연산자들을 활용하여 복잡한 조건을 설정할 수 있다.</p>
<pre><code>SELECT * FROM 테이블명 WHERE 조건칼럼 = &quot;값1&quot;</code></pre></li>
<li><p>데이터 삽입하기(INSERT):  INSERT 문을 사용하여 데이터베이스에 새로운 데이터를 삽입할 수 있다. INSERT문은 INTO 절을 통해 테이블을 지정하고 VALUES 절을 통해 삽입할 데이터를 지정한다.</p>
<pre><code>INSERT INTO 테이블명 (칼럼1, 칼럼2) VALUES (&quot;값1&quot;, &quot;값2&quot;)</code></pre></li>
<li><p>데이터 갱신하기(UPDATE): 데이터베이스의 기존 데이터를 갱신할 수 있다. SET절을 통해 업데이트할 필드와 값을 지정하고 WHERE 절을 통해 갱신할 데이터의 조건을 설정하며 원하는 데이터를 선택적으로 가져올 수 있다. </p>
<pre><code>UPDATE 테이블명 SET 변경할칼럼2 = &quot;값2&quot; WHERE 조건칼럼1 = &quot;값1&quot;</code></pre></li>
<li><p>데이터 삭제하기(DELETE): 데이터베이스에서 데이터를 삭제할 수 있다. FROM절로 삭제할 테이블을 지정하고 WHERE 절로 삭제할 데이터의 조건을 설정한다.</p>
<pre><code>DELETE FROM 테이블명 WHERE 조건칼럼 = &quot;값1&quot;</code></pre></li>
<li><p>데이터 정렬하기(ORDER BY): 데이터를 특정 기준에 따라 정렬할 수 있다. 오름차순(ASC)이나 내림차순(DESC)으로 정렬할 수 있다.</p>
<pre><code>SELECT * FROM 테이블명 ORDER BY 정렬칼럼 ASC</code></pre></li>
</ul>
<h2 id="42-mysql-데이터베이스-소개">4.2 MySQL 데이터베이스 소개</h2>
<p>MySQL은 가장 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템 중 하나이다. 사용하기 쉽고 안정적이며 확장 가능한 데이터베이스 솔루션으로 알려져 있다.</p>
<p>MySQL 데이터베이스는 데이터를 테이블의 형태로 저장한다. 각 테이블은 행과 열로 구성되고, 행은 실제 데이터를, 열은 데이터의 속성을 나타낸다. 이러한 테이블은 서로 관계를 맺고 데이터의 구조화 관리를 용이하게 한다.</p>
<p>MySQL이 지원하는 데이터베이스 작업(주요 작업만)</p>
<ul>
<li>데이터 검색(SELCE문 사용)</li>
<li>데이터 삽입(INSERT문 사용)</li>
<li>데이터 수정(UPDATE문 사용)</li>
<li>데이터 삭제(DELETE문 사용)</li>
</ul>
<h2 id="43-php에서-mysql-연결">4.3 PHP에서 MySQL 연결</h2>
<ul>
<li>PHP에서 MySQL 데이터베이스와 상호작용하기 위해서는 먼저 MySQL과의 연결을 설정해야 한다. PHP에서는 MySQLi 또는 PDO(PHP Data Objects)라는 두가지 주요한 확장을 제공한다. 이들을 사용하여  MySQL 데이터베이스에 연결하고 쿼리를 실행할 수  있다.</li>
</ul>
<h3 id="431-mysqli-확장">4.3.1 MySQLi 확장</h3>
<ul>
<li>MySQLi(i는 improved를 의미)는 PHP 확장으로, MySQL 데이터베이스와의 연결을 지원한다.</li>
<li>MySQL과 연결하는 간단한 예시들</li>
<li><ul>
<li><ol>
<li>연결 설정**<pre><code>$servername = &quot;localhost&quot;;
$username = &quot;사용자이름&quot;;
$password = &quot;비밀번호&quot;;
$database = &quot;데이터베이스이름&quot;;
</code></pre></li>
</ol>
</li>
</ul>
</li>
</ul>
<p>$conn = new mysqli($servername, $username, $password, $database);</p>
<p>if ($conn-&gt;connect_error) {
   die(&quot;연결 실패: &quot; . $conn-&gt;connect_error);
}</p>
<pre><code>
** 2. 연결 종료**     </code></pre><p>$conn-&gt;close();</p>
<pre><code>
** 3. 쿼리 실행**</code></pre><p>$sql = &quot;SELECT * FROM 테이블명&quot;;
$result = $conn-&gt;query($sql);</p>
<p>if ($result-&gt;num_rows &gt; 0) {
   while($row = $result-&gt;fetch_assoc()) {
         echo &quot;필드1: &quot; . $row[&quot;필드1&quot;] . &quot;, 필드2: &quot; . $row[&quot;필드2&quot;] . &quot;<br>&quot;;
   }
} else {
   echo &quot;결과 없음&quot;;
}</p>
<pre><code>
###  4.3.2 PDO 확장
- PDO는 PHP의 데이터베이스 추상화 계층이다. 이를 사용하여 다양한 데이터베이스에 일관된 방식으로 접근할 수 있다.
- PDO를 사용하여 MySQL과 연결하는 간단한 예제
** 1. 연결 설정 **    </code></pre><p>$servername = &quot;localhost&quot;;
$username = &quot;사용자이름&quot;;
$password = &quot;비밀번호&quot;;
$database = &quot;데이터베이스이름&quot;;</p>
<p>try {
   $conn = new PDO(&quot;mysql:host=$servername;dbname=$database&quot;, $username, $password);
   $conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   echo &quot;연결 성공&quot;;
} catch(PDOException $e) {
   echo &quot;연결 실패: &quot; . $e-&gt;getMessage();
}</p>
<pre><code>

**2. 연결 종료**
</code></pre><p>$conn = null;</p>
<pre><code>
**3. 쿼리 실행**</code></pre><p>$sql = &quot;SELECT * FROM 테이블명&quot;;
$stmt = $conn-&gt;query($sql);
$result = $stmt-&gt;fetchAll();</p>
<p>foreach($result as $row) {
   echo &quot;필드1: &quot; . $row[&quot;필드1&quot;] . &quot;, 필드2: &quot; . $row[&quot;필드2&quot;] . &quot;<br>&quot;;
}</p>
<pre><code>
- MySQLi와 PDO는 각각의 장단점이 있어 사용자의 선호나 프로젝트의 요구에 따라 선택할 수 있다. </code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 2장. PHP 개발 환경 설정]]></title>
            <link>https://velog.io/@lojhb__m/PHP-2%EC%9E%A5.-PHP-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@lojhb__m/PHP-2%EC%9E%A5.-PHP-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Wed, 26 Mar 2025 11:03:37 GMT</pubDate>
            <description><![CDATA[<h1 id="2-php-개발-환경-설정">2. PHP 개발 환경 설정</h1>
<h2 id="21-웹-서버-설치-및-구성">2.1 웹 서버 설치 및 구성</h2>
<ul>
<li>웹 서버: PHP 파일을 실행하고 웹 브라우저에 결과를 전달하는 역할을 한다.<ol>
<li>웹 서버 선택: Apache, Nginx, IIS 등이 있으나 개발시 구축이 편한 Apache를 사용한다.</li>
<li>웹 서버 설치</li>
<li>웹 서버 구성</li>
<li>테스트: 웹 서버 설치와 구성이 완료되면 테스트를 진행한다. 웹 브라우저를 열고 &quot;localhost&quot; 또는 웹 서버의 IP 주소를 입력하여 접속한다. 웹 서버거 동작하고 PHP가 올바르게 구성되었다면 &quot;Hello, World!&quot;와 같은 간단한 PHP 프로그램을 실행할 수 있어야 한다.</li>
</ol>
</li>
</ul>
<h2 id="211-아파치-웹-서버-설치">2.1.1 아파치 웹 서버 설치</h2>
<ol>
<li><p>아파치 웹 서버 설치
<img src="https://velog.velcdn.com/images/lojhb__m/post/626b1df8-36b3-47e5-a4fc-7f4d69032569/image.png" alt="">
<img src="https://velog.velcdn.com/images/lojhb__m/post/4bedcf37-7730-43ff-885a-22cefff070c4/image.png" alt=""></p>
</li>
<li><p>아파치 웹 서버 구성
<img src="https://velog.velcdn.com/images/lojhb__m/post/2b3c4cf6-69f5-4236-9924-5a439711f70f/image.png" alt=""></p>
</li>
<li><p>방화벽 구성
<img src="https://velog.velcdn.com/images/lojhb__m/post/223dba55-9099-45dc-8170-e184689b2912/image.png" alt=""></p>
</li>
<li><p>아파치 웹 서버 실행
<img src="https://velog.velcdn.com/images/lojhb__m/post/ec2b1653-ce40-412a-aeb3-7f3e77dda3aa/image.png" alt=""></p>
</li>
<li><p>테스트</p>
</li>
</ol>
<ul>
<li>ip 주소 보는 명령어: ip a -&gt; 두번째 inet 뒤에 숫자가 ip 주소
<img src="https://velog.velcdn.com/images/lojhb__m/post/2a2a5eca-7532-451b-9ba6-7de7f0981728/image.png" alt=""></li>
</ul>
<h2 id="22-mysql-설치-및-구성">2.2 MySQL 설치 및 구성</h2>
<ol>
<li><p>MySQL 설치
<img src="https://velog.velcdn.com/images/lojhb__m/post/a6ff0089-401b-4642-9bd9-726fbda05181/image.png" alt="">
<img src="https://velog.velcdn.com/images/lojhb__m/post/624530af-64b0-4226-ad88-980838be8030/image.png" alt=""></p>
</li>
<li><p>MySQL 구성</p>
</li>
</ol>
<ul>
<li>MySQL의 구성 파일은 일반적으로 <code>/etc/mysql/mysql.conf.d/mysqld.cnf</code> 경로에 위치한다.
<img src="https://velog.velcdn.com/images/lojhb__m/post/39c9a498-fa0b-4695-beac-fd541ee43093/image.png" alt=""></li>
</ul>
<ol start="3">
<li><p>방화벽 구성
<img src="https://velog.velcdn.com/images/lojhb__m/post/7aba4569-7900-4b42-af15-dca131970092/image.png" alt=""></p>
</li>
<li><p>MySQL 서버 실행
<img src="https://velog.velcdn.com/images/lojhb__m/post/65e1bdeb-866d-4adc-821a-961d6c38cbd4/image.png" alt=""></p>
</li>
<li><p>MySQL 사용자 및 권한 설정
<img src="https://velog.velcdn.com/images/lojhb__m/post/78618e58-fa00-4e1f-94c0-b6f4d34f7f21/image.png" alt=""></p>
</li>
</ol>
<h2 id="23-php-설치">2.3 PHP 설치</h2>
<ol>
<li>PHP 설치
<img src="https://velog.velcdn.com/images/lojhb__m/post/5ad4fe25-72bc-4960-87a2-09ee48335c31/image.png" alt="">
<img src="https://velog.velcdn.com/images/lojhb__m/post/ae4ae405-7337-49e1-b357-1f002f2c31e4/image.png" alt=""></li>
</ol>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/9bbac1bd-6683-4a4d-aa19-58a7b9fd5f56/image.png" alt=""></p>
<ol start="2">
<li>PHP 구성 변경(선택사항)</li>
</ol>
<ul>
<li>PHP를 설치한 후에 PHP 구성을 변경하기 위해서는 <code>/etc/php/{version명}/apache2/php.ini</code> 경로의 파일을 열어 수정한다.</li>
</ul>
<ol start="3">
<li>웹 서버와의 연동 확인
<img src="https://velog.velcdn.com/images/lojhb__m/post/7a2f5c7f-22f1-4403-b2ee-25439a8f8e7d/image.png" alt="">
<img src="https://velog.velcdn.com/images/lojhb__m/post/7a616f48-c090-49ca-831b-714be087ef58/image.png" alt="">
<img src="https://velog.velcdn.com/images/lojhb__m/post/0e2c6076-f016-4fe7-ba04-7be8fea3c553/image.png" alt=""></li>
</ol>
<p>PHP.ini 파일에서 사용가능한 PHP 모듈(중요한 것 위주)</p>
<ul>
<li>mysqli: MySQL 데이터베이스와의 상호작용을 위한 모듈. mysqli 함수를 사용하여 데이터베이스 연결, 쿼리 실행, 데이터 검색 등을 수행할 수 있다.</li>
<li>pdo_mysql: PDO(PHP Data Objects)를 사용하여 데이터베이스와의 상호작용을 할 수 있도록 해준다.</li>
<li>gd: 그래픽 처리와 이미지 조작을 위한 모듈.</li>
<li>curl: 웹 상의 다른 서버와 통신하기 위한 모듈. HTTP 요청 및 응답을 할 수 있다.</li>
<li>openssl: 암호화 기능을 제공하는 모듈. HTTPS 통신, 암호화된 데이터의 생성 및 해독 등에 사용된다.</li>
<li>json: JSON 데이터 형식을 다루기 위한 모듈.</li>
<li>session: 세션 관리를 위한 모듈.</li>
<li>mbstring: 문자열을 다루기 위한 모듈.</li>
<li>xml: XML 데이터를 다루기 위한 모듈.</li>
<li>zip: ZIP 파일 압축 및 해제를 위한 모듈.</li>
</ul>
<p>php.ini 파일 활성화</p>
<ol>
<li>파일 열기: <code>php.ini</code> 또는 <code>/etc/php/{version}/apache2/php.ini</code>에 위치함</li>
<li>모듈 활성화: <code>;extension=모듈_이름</code> 주석 처리를 찾고 세미콜론(;)을 제거하여 주석을 해제한다.</li>
<li>웹 서버 재시작: 저장한 후에는 웹 서버를 다시 시작해야 한다.
명령어: <code>sudo service apache2 restart</code></li>
</ol>
<h2 id="24-개발-도구-소개">2.4 개발 도구 소개</h2>
<h2 id="241-ide---우분투에서-사용할-수-있는-주요-개발-도구">2.4.1. IDE - 우분투에서 사용할 수 있는 주요 개발 도구</h2>
<ol>
<li>Visual Studio Code: 경량 코드 편집기. PHP 개발에 적합하다.</li>
<li>PhpStorm: PHP 개발 전용 IDE. PHP에 특화된 기능과 통합 개발 환경을 제공하고 있다.</li>
<li>Eclipse PDT: Eclipse 플랫폼 위에서 동작하는 PHP 개발 도구.</li>
<li>Sublime Text: 빠르고 가벼운 텍스트 편집기, 다양한 언어를 지원함.</li>
<li>Atom: GitHub에서 개발한 오픈 소스 텍스트 편집기. 다양한 언어에 대한 풍부한 확장성을 제공.</li>
</ol>
<h2 id="242-mysql-client---우분투에서-사용할-수-있는-mysql-클라이언트-프로그램">2.4.2 MySQL Client - 우분투에서 사용할 수 있는 MySQL 클라이언트 프로그램</h2>
<ol>
<li>MySQL 워크벤치: 공식적으로 MySQL에서 제공하는 통합 개발 환경.</li>
<li>phpMyAdmin: 웹 기반 MySQL 관리 도구. PHP로 작성되어있다. 웹 브라우저를 통해 MySQL 데이터베이스를 관리할 수 있다.</li>
<li>DBeaver: 오픈 소스 데이터베이스 도구. 다양한 데이터 베이스 시스템에 대한 클라이언트 기능을 제공.</li>
<li>MySQL 클라이언트: MySQL 서버와 상호작용 하기 위한 명령줄 도구. 우분투에 기본적으로 설치되어있고 <code>mysql</code>명령어를 사용하여 실행할 수 있음. 터미널에서 명령어를 사용하여 데이터베이스에 접속하고 쿼리를 실행할 수 있다.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PHP] 1장. PHP 소개와 기본 개념]]></title>
            <link>https://velog.io/@lojhb__m/PHP-1%EC%9E%A5.-PHP-%EC%86%8C%EA%B0%9C%EC%99%80-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@lojhb__m/PHP-1%EC%9E%A5.-PHP-%EC%86%8C%EA%B0%9C%EC%99%80-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Wed, 26 Mar 2025 11:01:53 GMT</pubDate>
            <description><![CDATA[<h1 id="1-php-소개와-기본-개념">1. PHP 소개와 기본 개념</h1>
<ul>
<li>PHP: 웹 개발을 위해 설계된 서버-사이드 스크립트 언어, 동적인 웹페이지를 생성하고 다양한 기능을 구현하는데 사용.</li>
<li>서버-사이드 스크립트 언어: 웹서버에서 실행되는 언어, 클라이언트가 서버에 요청을 보내면 서버가 이를 처리하고 동적인 웹페이지를 생성하는 역할을 한다.</li>
</ul>
<h2 id="11-php-소개">1.1 PHP 소개</h2>
<ul>
<li>PHP의 특징<ul>
<li>웹 서버에서 실행되므로 사용자의 브라우저에 직접 전송되지 않고 서버에서 처리된 후 결과가 클라이언트에게 전달된다. 이는 보안성과 안정성을 높이는데 도움이 된다.</li>
</ul>
</li>
</ul>
<h2 id="12-서버-사이드-스크립트-언어의-개념">1.2 서버-사이드 스크립트 언어의 개념</h2>
<ul>
<li>서버-사이드 스크립트 언어: 웹 서버에서 실행되며, 클라이언트의 요청에 대한 동적인 처리를 담당한다. 클라이언트가 웹 페이지에 요청할 때 서버에서 실행되어 결과를 생성한 후, 클라이언트에게 전송한다.</li>
<li>PHP는 대표적인 서버-사이드 스크립트 언어이다.</li>
<li>서버-사이드 스크립트 언어의 특징<ol>
<li>동적인 웹페이지 생성: 동적인 콘텐츠를 생성할 수 있음.</li>
<li>데이터 처리: 데이터베이스와의 상호작용을 통해 데이터를 처리할 수 있음.</li>
<li>보안: 클라이언트와 서버 사이에서 실행되므로 클라이언트에게 직접적인 스크립트 코드가 노출되지 않아 보안성을 높일 수 있다.</li>
<li>확장성: 다양한 라이브러리와 프레임워크를 활용하여 개발을 지원한다.</li>
</ol>
</li>
</ul>
<h2 id="13--php의-역사와-현재-사용-사례">1.3  PHP의 역사와 현재 사용 사례</h2>
<ul>
<li>PHP가 사용되는 사례<ol>
<li>동적인 웹 페이지 개발</li>
<li>웹 애플리케이션 개발</li>
<li>데이터베이스와의 상호작용</li>
<li>웹 서버 개발</li>
<li>오픈 솟 프로젝트 기여</li>
</ol>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[드림핵] Reverse Engineering]]></title>
            <link>https://velog.io/@lojhb__m/%EB%93%9C%EB%A6%BC%ED%95%B5-Reverse-Engineering</link>
            <guid>https://velog.io/@lojhb__m/%EB%93%9C%EB%A6%BC%ED%95%B5-Reverse-Engineering</guid>
            <pubDate>Sun, 16 Mar 2025 13:37:31 GMT</pubDate>
            <description><![CDATA[<h1 id="1-introduction">1. Introduction</h1>
<p>엔지니어링 vs 리버스 엔지니어링</p>
<ul>
<li>엔지니어링: 완성품과 이를 구성하는 부품들의 기능과 설계를 고안하고, 제작하는 과정.</li>
<li>리버스 엔지니어링(리버싱): 완성품을 해체하고 분석하여 구조, 기능, 디자인을 파악. 엔지니어링 과정을 거꾸로라고 생각하면 됨.</li>
</ul>
<h1 id="2-binary--analsis">2. Binary &amp; analsis</h1>
<p><strong>프로그램</strong></p>
<ul>
<li>컴파일러: 컴파일(기계어로 번역)을 해주는 소프트웨어</li>
<li>인터프리터: 인터프리팅(사용자가 작성한 스크립트를 그때그때 번역하여 CPU에 저장)을 해주는 소프트웨어</li>
</ul>
<p><strong>전처리(Preprocessing)</strong></p>
<ul>
<li>컴파일러가 소스코드를 어셈블리어로 컴파일하기 전에, 필요한 형식으로 가공하는 과정.</li>
<li>과정: 1. 주석 제거 -&gt; 2. 매크로(#define으로 정의함) 치환 -&gt; 3. 파일 병합(GCC에서는 -E 옵션을 사용하여 전처리 결과를 확인 함)</li>
</ul>
<p><strong>컴파일</strong></p>
<ul>
<li>C로 작성된 소스 코드를 어셈블리어로 번역</li>
<li>컴파일 과정에서 컴파일러는 소스코드 문법 검사를 하고 오류가 있다면 컴파일을 멈춘 후 에러를 출력.</li>
<li>gcc에서 최적화를 적용하는 옵션: <code>-O -O0 -O1 -O2 -O3 -Os -Ofast -Og</code></li>
<li>옵션 -S: 소스코드를 어셈블리 코드로 컴파일. </li>
</ul>
<p><strong>어셈블</strong></p>
<ul>
<li>컴파일로 생성된 어셈블리어코드를 ELF형식의 목적 파일로 변환하는 과정. </li>
<li>목적파일로 변환되고 나면 기계어로 번역되므로 더이상 사람이 해석하기 어려워진다.</li>
</ul>
<p><strong>링크</strong></p>
<ul>
<li>여러 목적 파일들을 연결하여 실행 가능한 바이너리로 만드는 과정.</li>
</ul>
<p><strong>디스어셈블</strong></p>
<ul>
<li>기계어를 어셈블리어로 재번역하는 과정. (어셈블의 역과정)</li>
</ul>
<p><strong>디컴파일러</strong></p>
<ul>
<li>어셈블리어보다 고급 언어로 바이너리를 번역하는 컴파일러. 그러나 오차가 있어서 바이너리의 소스코드와 동일한 코드를 생성하지는 못한다.</li>
<li>그럼에도 디스어셈블러보다 디컴파일러가 압도적으로 분석 효율이 높다. 그 오차가 바이너리의 동작을 왜곡하지는 않는다.</li>
</ul>
<p>정리</p>
<blockquote>
</blockquote>
<ul>
<li>전처리: 소스 코드가 컴파일에 필요한 형식으로 가공되는 과정.</li>
<li>컴파일: 소스 코드를 어셈블리어로 번역하는 과정.</li>
<li>어셈블: 어셈블리 코드를 기계어로 번역하고, 실행 가능한 형식으로 변형하는 과정.</li>
<li>링크: 여러 개의 목적 파일을 하나로 묶고, 필요한 라이브러리와 연결해주는 과정.</li>
<li>디스어셈블: 바이너리를 어셈블리어로 번역하는 과정</li>
<li>디컴파일: 바이너리를 고급 언어로 번역하는 과정.</li>
</ul>
<p><strong>정적 분석</strong></p>
<ul>
<li>프로그램을 실행시키지 않고 분석하는 방법, 관찰을 통해 분석.</li>
<li>장점<blockquote>
<ol>
<li>전체 구조를 파악하기 쉽다</li>
<li>프로그램을 실행하지 않아도 되므로 분석 환경의 제약에서도 비교적 자유롭다.</li>
<li>바이러스 등을 실행할 필요가 없으므로 악성 프로그램의 위협으로부터 안전하다.</li>
</ol>
</blockquote>
</li>
<li>단점<blockquote>
<ol>
<li>프로그램의 코드를 변형하는 난독화가 적용되면 분석이 매우 어려워진다.</li>
<li>프로그램의 실행 흐름이 복잡할수록 정적 분석만으로는 다양한 동적 요소를 고려하기 어렵다.</li>
</ol>
</blockquote>
<ul>
<li>정적 분석 도구의 예: <em><strong>IDA</strong></em>(어셈블리 코드, 디컴파일 된 코드, 상호 참조 기능(문자열이나 함수를 어디에서 사용하는지 보여줌), 제어 흐름 그래프(함수의 실행 흐름을 보기 쉽게 해줌) 등의 기능이 있음.</li>
</ul>
</li>
</ul>
<p><strong>동적 분석</strong></p>
<ul>
<li>프로그램을 실행시키면서 분석하는 방법.</li>
<li>장점<blockquote>
<p>코드를 자세히 분석해보지 않고도 프로그램의 개략적인 동작을 파악할 수 있다. 동적 분석을 통해 출력값들을 기반으로 동작을 추론하곤 한다. (대개의 프로그램은 많은 함수로 구성되어 있어 정적 분석만으로는 파악하는데 한계가 있다.)</p>
</blockquote>
</li>
<li>단점<blockquote>
<ol>
<li>동적 분석은 프로그램을 실행하면서 분석하는 것이므로 분석 환경을 구축하기 어려울 수 있다.</li>
<li>디버깅(동적 분석의 일종)을 방해하는 안티 디버깅에 의해 분석이 어려워질 수 있다.</li>
</ol>
</blockquote>
</li>
<li>동적 분석 도구의 예: 디버거(프로그램의 버그를 찾고 제거하기 위해 사용되는 도구) 중 하나인 <em><strong>x64dbg</strong></em>(윈도우의 대표적인 동적 분석 도구, CPU의 레지스터 상태, 메모리와 스택의 값을 확인하며 분석을 진행함.)</li>
</ul>
<h1 id="3-computer-science">3. Computer Science</h1>
<p><strong>서론</strong></p>
<ul>
<li>컴퓨터 구조: 컴퓨터에 대한 기본 설계</li>
<li>명령어 집합구조(ISA): CPU가 사용하는 명령어와 관련된 설계, 가장 널리 사용되는 ISA는 <strong>x86-64 아키텍처</strong></li>
</ul>
<p><strong>컴퓨터 구조</strong></p>
<ul>
<li>컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법.</li>
<li>세부 분야<blockquote>
<ol>
<li>기능 구조에 대한 설계: 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고, 설계하는 분야</li>
</ol>
</blockquote>
<ul>
<li>폰노이만 구조, 하버드 구조, 수정된 하버드 구조 등이 있다.<ol start="2">
<li>명령어 집합구조: CPU가 처리해야하는 명령어를 설계하는 분야</li>
</ol>
<ul>
<li>x86, x86-64, ARM, MIPS, AVR 등이 있다.</li>
</ul>
<ol start="3">
<li>마이크로 아키텍처: CPU의 하드웨어적 설계를 하는 분야.</li>
</ol>
<ul>
<li>캐시 설계, 파이프라이닝, 슈퍼 스칼라, 분기 예측, 비순차적 명령어 처리</li>
</ul>
</li>
</ul>
<ol start="4">
<li>하드웨어 및 컴퓨팅 방법론<ul>
<li>직접 메모리 접근 등이 있다.   </li>
</ul>
</li>
</ol>
</li>
<li>폰 노이만 구조, x86-64 아키텍처에 대해 알아봄</li>
</ul>
<p><strong>폰 노이만 구조</strong></p>
<ul>
<li>중앙처리장치(CPU): 산술논리장치(ALU), 제어장치(Control Unit), 레지스터(cpu에 필요한 데이터를 저장) 등으로 구성됨</li>
<li>기억장치: 주기억장치(RAM), 보조기억 장치(하드 드라이브(HDD), SSD)</li>
<li>버스<em>(컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로)</em>: 데이터 버스(데이터가 이동하는 통로), 주소 버스(주소를 지정), 제어 버스(읽기/쓰기를 제어), 소프트웨어, 프로토콜 등이 있음.</li>
</ul>
<p><strong>명령어 집합 구조(ISA)</strong></p>
<ul>
<li>CPU가 해석하는 명령어의 집합.</li>
<li>모든 컴퓨터가 동일한 수준의 연산 능력을 요구하지 않기 때문에 다양한 ISA가 개발되고 사용됨.</li>
<li>x86-64를 위주로 공부.(x86 기반 CPU의 점유율이 압도적으로 높음)</li>
</ul>
<p><strong>x86-64(amd64) 아키텍처</strong></p>
<ul>
<li>n비트 아키텍쳐: n은 CPU가 한번에 처리할 수 있는 데이터의 크기 단위인 WORD를 의미함</li>
<li>전문 소프트웨어나 고사양 게임 등을 실행할 땐 64비트 아키텍쳐를 추천함.</li>
</ul>
<p><strong>레지스터</strong></p>
<ul>
<li>CPU 내부의 저장장치</li>
<li>범용 레지스터: 주용도는 있으나, 그 외 임의의 용도로도 사용될 수 있는 레지스터. 8바이트를 저장할 수 있음.
x64에서는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8-r15가 있다.</li>
<li>세그먼트 레지스터: 과거에는 메모리 공간의 확장을 위해 사용했으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터이다. 6가지 세그먼트 레지스터가 존재하며 각각은 16비트이다. 
cs, ds, ss 레지스터는 코드 영역과 데이터, 스택 메모리 영역을 가리킬 때 사용되고, es, fs, gs는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작되었다.</li>
<li>명령어 포인터 레지스터: 포인터로서의 역할을 함.x64에서는 rip가 있다.</li>
<li>플래그 레지스터: CPU(프로세서)의 현재 상태를 저장하고 있는 레지스터. </li>
</ul>
<p><strong>레지스터 호환</strong></p>
<ul>
<li>x86-64 아키텍처는 IA-32(32비트)의 64비트 확장 아키텍처이고 호한이 가능하다. </li>
<li>eax, ebx, ecx, edx, esi, edi, esp, ebp는 rax, rbx, rcx, rdx, rsi, rsp, rbp의 하위 32비트를 가리킨다.</li>
<li>또한, 과거 16비트 아키텍처인 IA-16과도 호환한다.</li>
<li>ax, bx, cx, dx, si, di, sp, bp는 eax, ebx, ecx, edx, esi, edi, esp, ebp의 하위 16비트를 가리킨다.</li>
</ul>
<h1 id="4-프로세스-메모리-구조">4. 프로세스 메모리 구조</h1>
<p><strong>섹션</strong></p>
<ul>
<li>윈도우의 PE파일은 PE 헤더와 1개 이상의 섹션으로 구성되어 있다.</li>
<li>섹션: 유사한 용도로 사용되는 데이터가 모여있는 영역.</li>
<li>섹션에 대한 정보 중 중요한 것은 섹션의 이름과 크기, 섹션이 로드될 주소의 오프셋, 섹션의 속성과 권한이다.</li>
<li>PE에는 일반적으로 &quot;.text&quot;, &quot;.data&quot;, &quot;.rdata&quot;섹션이 일반적으로 사용된다.</li>
</ul>
<p><strong>.text 섹션</strong></p>
<ul>
<li>실행 가능한 기계 코드가 위치하는 영역.</li>
<li>읽기 권한과 실행 권한이 부여된다.</li>
<li>쓰기 권한이 있으면 공격 받을 가능성이 있으므로 쓰기 권한은 제한된다.</li>
<li>main() 등의 함수 코드에서 사용된다.</li>
</ul>
<p><strong>.data 섹션</strong></p>
<ul>
<li>컴파일 시점에 값이 정해진 <strong>전역 변수</strong>들이 위치함.</li>
<li>CPU가 읽고 쓸 수 있어야 하므로 읽기와 쓰기 권한이 부여된다.</li>
<li>초기화된 전역변수, 전역 상수에서 사용된다.</li>
</ul>
<p><strong>.rdata</strong></p>
<ul>
<li>컴파일 시점에 값이 정해진 <strong>전역 상수</strong>와 참조할 DLL(여러 프로그램에서 동시에 사용할 수 있는 코드와 데이터를 포함하는 동적 라이브러리) 및 외부 함수들의 정보가 저장된다.</li>
<li>CPU가 읽을 수 있어야 하므로 읽기 권한이 부여되지만 쓰기는 불가능하다.</li>
</ul>
<p><strong>섹션이 아닌 메모리</strong></p>
<ul>
<li>스택: 함수별로 자신의 지역변수 또는 연산과정에서 부차적으로 생겨나는 임시 값들을 저장하는 영역.
윈도우즈 프로세스의 각 쓰레드는 지역 변수나 함수의 인자(함수의 리턴 주소가 저장)되는 자신만의 스택 공간을 가지고 있다.<ul>
<li>자유롭게 읽고 쓸 수 있어야 하므로 읽기, 쓰기 권한이 부여된다.</li>
<li>스택이 확장될 때, 기존 주소보다 낮은 주소로 확장돼서 &#39;아래로 자란다&#39;는 표현을 사용한다.</li>
</ul>
</li>
<li>힙: 프로그램이 여러 용도로 사용하기 위해 할당바든 공간으로 모든 종류의 데이터가 저장될 수 있다.<ul>
<li>스택과는 달리 큰 데이터도 저장할 수 있고, 전역적으로 접근이 가능하도록 설계되었다. 또, 실행중 동적으로 할당받는다는 차이가 있다.</li>
<li>데이터를 읽고 쓰기만 하기 때문에 읽기, 쓰기 권한만을 가지지만 상황에 따라 실행 권한을 가지는 경우도 존재한다.</li>
<li>malloc(), calloc() 등으로 할당 받은 메모리에서 사용된다.</li>
</ul>
</li>
</ul>
<h1 id="5-x86-assembly">5. x86 Assembly</h1>
<p><strong>서론</strong></p>
<ul>
<li><p>0과 1로만 구성된 기계어는 해석하기 힘들기 때문에 <strong>어셈블리 언어</strong>와 <strong>어셈블러</strong>(어셈블리 언어를 기계어로 번역)가 고안됨.</p>
</li>
<li><p>이후 기계어를 어셈블리 언어로 번역하는 <strong>역어셈블러</strong>를 개발했다.</p>
</li>
<li><p>어셈블리어만 이해할 수 있다면 역어셈블러를 사용하여 소프트웨어를 분석할 수 있다.</p>
</li>
</ul>
<p><strong>어셈블리 언어</strong></p>
<ul>
<li>컴퓨터의 기계어와 치환되는 언어.</li>
<li>기계어와 CPU에 사용되는 명령어 집합구조(ISA)는 여러 종류이므로 어셈브리어도 여러종류임.</li>
</ul>
<p><strong>x64 어셈블리 언어</strong></p>
<ul>
<li>명령어(동사에 해당)와 피연산자(목적어)의 문법 구조로 구성됨.</li>
<li>명령어<ul>
<li>데이터 이동: <span style="color: hotpink"><code>mov</code></span>, <span style="color: hotpink"><code>lea</code></span></li>
<li>산술 연산: <span style="color: hotpink"><code>inc</code></span>, <span style="color: hotpink"><code>dec</code></span>, <span style="color: hotpink"><code>add</code></span>, <span style="color: hotpink"><code>sub</code></span></li>
<li>논리 연산: <span style="color: hotpink"><code>and</code></span>, <span style="color: hotpink"><code>or</code></span>, <span style="color: hotpink"><code>xor</code></span>, <span style="color: hotpink"><code>not</code></span></li>
<li>비교: <span style="color: hotpink"><code>cmp</code></span>, <span style="color: hotpink"><code>test</code></span></li>
<li>분기: <span style="color: hotpink"><code>jmp</code></span>, <span style="color: hotpink"><code>je</code></span>, <span style="color: hotpink"><code>jg</code></span></li>
<li>스택: <span style="color: hotpink"><code>push</code></span>, <span style="color: hotpink"><code>pop</code></span></li>
<li>프로시져: <span style="color: hotpink"><code>call</code></span>, <span style="color: hotpink"><code>ret</code></span>, <span style="color: hotpink"><code>leave</code></span></li>
<li>시스템 콜: <span style="color: hotpink"><code>syscall</code></span></li>
</ul>
</li>
<li>피연산자: 상수, 레지스터, 메모리가 올 수 있음.<ul>
<li>메모리는 <code>타입 \[]</code>로 표현. 타입에는 Byte, Word, DWord, QWord가 올 수 있으며, 각각 1, 2 4, 8바이트의 크기를 지정한다.</li>
</ul>
</li>
</ul>
<p><strong>x86-64 어셈블리 명령어</strong></p>
<ul>
<li>데이터 이동 명령어: 어떤 값을 레지스터나 메모리에 옮기도록 지시한다.<ul>
<li><code>mov rdi, rsi</code>: rsi의 값을 rdi에 대입</li>
<li><code>mov QWORD PTR[rdi], rsi</code>: rsi의 값을 rdi가 가리키는 주소에 대입.</li>
<li><code>lea rsi, DWORD PTR[rdi]</code>: rid가 가리키는 주소를 rsi에 대입.</li>
</ul>
</li>
<li>산술 연산: 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 지시한다.<ul>
<li><code>add dst, src</code>: dst += src</li>
<li><code>sub dst, src</code>: dst -= src</li>
<li><code>inc op</code>: op += 1</li>
<li><code>dec op</code>: op -= 1</li>
</ul>
</li>
<li>논리 연산: and, or, xor, neg 등의 <strong>비트 연산</strong>을 지시한다. 따라서 비트 단위로 연산이 이루어진다.<ul>
<li><code>and dst, src</code>: dst와 src가 모두 1이여야 1</li>
<li><code>or dst, src</code>: dst와 src 중 하나라도 1이면 1</li>
<li><code>xor dst, src</code>: dst와 src가 서로 다르면 1</li>
<li><code>not op</code>: op의 비트 전부 반전</li>
</ul>
</li>
<li>비교 명령어: 두 피연산자의 값을 비교하고 플래그를 설정한다.<ul>
<li><code>cmp op1, op2</code>: op1과 op2를 빼서 대소를 비교. </li>
<li><code>test op1, op2</code>: op1과 op2에 AND 비트 연산을 취하여 비교한다.</li>
</ul>
</li>
<li>분기 명령어: rip 레지스터를 이동시켜 실행 흐름을 바꾼다.<ul>
<li><code>jmp addr</code>: addr로 rip를 이동.</li>
<li><code>je addr</code>: 직전에 비교한 두 연산자가 같으면 점프</li>
<li><code>jg addr</code>: 직전에 비교한 두 연산자 중 전자가 더 크면 점프</li>
</ul>
</li>
</ul>
<p><strong>스택과 관련된 명령어</strong></p>
<ul>
<li><code>push val</code>: rsp를 8만큼 빼고, val을 스택 최상단에 쌓음.</li>
<li><code>pop reg</code>: 스택 최상단의 값을 꺼내서 reg에 대입히고 rsp를 8만큼 더함.</li>
</ul>
<p><strong>프로시저의 호출과 반환을 위한 명령어</strong></p>
<ul>
<li><code>call addr</code>: addr에 위치한 프로시져 호출</li>
<li><code>leave</code>: 스택프레임 정리<ul>
<li>스택프레임: 스택의 영역을 명확히 구분함.</li>
</ul>
</li>
<li><code>ret</code>: return address로 반환</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[드림핵] Dream Beginners 2]]></title>
            <link>https://velog.io/@lojhb__m/%EB%93%9C%EB%A6%BC%ED%95%B5-Dream-Beginners-2</link>
            <guid>https://velog.io/@lojhb__m/%EB%93%9C%EB%A6%BC%ED%95%B5-Dream-Beginners-2</guid>
            <pubDate>Sun, 09 Mar 2025 14:21:46 GMT</pubDate>
            <description><![CDATA[<h1 id="1-ncnetcat">1. NC(Netcat)</h1>
<h3 id="netcat-nc">Netcat (nc)</h3>
<ul>
<li>소켓: 통신을 위한 가장 작은 단위의 프로토콜</li>
<li>Netcat(nc): 서버에서 특정 포트를 통해 서비스를 동작시키는 환경을 구성해야 하는데, 클라이언트가 프로그램과 통신하기 위해서 사용하는 도구. 현대의 거의 모든 네트워크 통신은 네트워크 소켓을 통해 이루어진다.</li>
<li>nc 사용법: <span style="color: hotpink"><code>nc hostname(ip) port</code></span></li>
<li>웹 서비스의 경우 &#39;http&#39;로 시작하는 링크를 클릭하면 웹페이지가 출력되지만 그렇지 않은 경우 nc로 접속해야 함.</li>
<li>드림핵에서 제공하는 실습 문제와 워게임은 <span style="color: hotpink"><code>nc</code></span> 명령어로 접속하여 푸는 형태가 많음.</li>
</ul>
<h1 id="2-ssh">2. SSH</h1>
<ul>
<li>SSH: 원격 서버(컴퓨터)에 연결할 수 있도록 해주는 암호화된 네트워크 프로토콜. 암호화를 통해 호스트와 클라이언트가 안전하게 통신할 수 있음.</li>
<li>클라이언트가 원격 서버 터미널에 접속하여 명령어를 입력하면, 호스트가 명령 실행 결과를 클라이언트에게 전달함.</li>
</ul>
<pre><code>ssh user@HOST -p PORT -i [개인 키 파일 경로]</code></pre><h3 id="exercise-ssh">Exercise: SSH</h3>
<p><a href="https://dreamhack.io/wargame/challenges/875/">https://dreamhack.io/wargame/challenges/875/</a></p>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/46885d6a-2923-4ee7-9899-1eb1b5cac6c4/image.png" alt="">
<img src="https://velog.velcdn.com/images/lojhb__m/post/902d4e10-5b76-4ac8-a3f6-811fefa8228d/image.png" alt=""></p>
<ol>
<li>ssh 명령어를 입력하여 원격 서버에 접속하였다.</li>
<li>ls 명령어를 통해 flag가 있는 걸 확인하고 cat flag로 flag 값을 알아내었다.</li>
</ol>
<h1 id="3-docker">3. Docker</h1>
<p><strong>도커</strong></p>
<ul>
<li>컨테이너: 가상 환경이 구축되어있는 하나의 박스. 가상 머신과 유사하지만 도커 컨테이너는 새로운 운영체제 환경을 구축할 필요 없이 하나의 분리된 프로세스처럼 작동한다.(특정한 환경을 구성하기 위해 만들어진 가상의 공간)</li>
<li>도커: 컨테이너를 만들고, 실행하고, 배포할 수 있는 가상화 플랫폼.</li>
<li>도커이미지: 도커 컨테이너의 전 단계, 컨테이너를 생성하고 실행하기 위한 모든 것.</li>
<li>도커 컨테이너: 도커 이미지로부터 만들어진 실행 가능한 인스턴트(실행 중인 이미지).</li>
<li>도커 레지스트리: 도커 이미지를 저장하는 저장소.</li>
</ul>
<p><strong>도커 명령어</strong></p>
<ol>
<li><span style="color: hotpink"><code>docker build [옵션] &lt;경로&gt;</code></span>:도커파일을 이용하여 이미지를 생성한다.</li>
<li><span style="color: hotpink"><code>docder build .</code></span>:현재 디렉토리에 있는 도커파일로 이미지 생성한다.</li>
<li><span style="color: hotpink"><code>docker images</code></span>: 도커 이미지 목록을 출력한다.</li>
<li><span style="color: hotpink"><code>docker run [옵션] &lt;이미지명|ID&gt; [명령어]</code></span>: 도커 이미지로 컨테이너를 생성하고 실행한다.</li>
<li><ol start="4">
<li><span style="color: hotpink"><code>docker ps</code></span>: 실행 중인 컨테이너 목록을 출력한다. -a 옵션은 종료된 컨테이너까지 모두 출력한다.</li>
</ol>
</li>
<li><span style="color: hotpink"><code>docker create [옵션] &lt;이미지명|ID&gt; [명령어]</code></span>: 도커 이미지로 컨테이너를 생성한다.</li>
<li><span style="color: hotpink"><code>docker start [옵션] &lt;컨테이너명|ID&gt;</code></span>: 중단된 컨테이너를 시작한다.</li>
<li><span style="color: hotpink"><code>docker exec [옵션] &lt;컨테이너명|ID&gt; [명령어]</code></span>: 실행 중인 컨테이너에 접속하여 명령을 수행한다.</li>
<li><span style="color: hotpink"><code>docker stop [옵션] &lt;컨테이너명|ID&gt;</code></span>: 실행 중인 컨테이너를 중단한다.</li>
<li><span style="color: hotpink"><code>docker pull [옵션] &lt;이미지명&gt;</code></span>: 레지스트리에 존재하는 도커 이미지를 다운받는다.</li>
<li><span style="color: hotpink"><code>docker rm [옵션] &lt;컨테이너명|ID&gt;</code></span>: 도커 컨테이너를 삭제한다.</li>
<li><span style="color: hotpink"><code>docker rmi [옵션] &lt;컨테이너명|ID&gt;</code></span>: 도커 이미지를 삭제한다.</li>
<li><span style="color: hotpink"><code>docker inspect [옵션] &lt;이미지 혹은 컨테이너명|ID&gt;</code></span>: 도커 이미지 또는 컨테이너의 자세한 정보를 출력</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[드림핵] Dream Beginners  ]]></title>
            <link>https://velog.io/@lojhb__m/%EB%93%9C%EB%A6%BC%ED%95%B5-Dream-Beginners</link>
            <guid>https://velog.io/@lojhb__m/%EB%93%9C%EB%A6%BC%ED%95%B5-Dream-Beginners</guid>
            <pubDate>Thu, 06 Mar 2025 01:37:04 GMT</pubDate>
            <description><![CDATA[<h1 id="1-introduction-to-dreamhack">1. Introduction to Dreamhack</h1>
<p><strong>해킹</strong></p>
<ul>
<li>취약점 찾아내는 단계</li>
<li>공격하는 단계</li>
</ul>
<p><strong>웹해킹</strong></p>
<ul>
<li>웹을 대상으로 하는 해킹, 관련 기술</li>
</ul>
<p><strong>시스템해킹</strong>(포너블, 소프트웨어 해킹)</p>
<ul>
<li>소프트웨어의 취약점을 찾아서 이를 공격하는 해킹</li>
<li>리버스 엔지니어링(리버싱): 프로그램을 역으로 분석하여 작동 원리를 알아내는 기술</li>
</ul>
<h1 id="2-wargame">2. Wargame</h1>
<p><strong>워게임</strong></p>
<ul>
<li>의도적으로 취약점이 존재하도록 설계된 모의 해킹 환경</li>
<li>카테고리로는 포너블, 웹, 리버싱, 암호학, 포렌식, misc 등이 있다.</li>
</ul>
<p><strong>플래그(Flag)</strong></p>
<ul>
<li>공격 대상인 시스템에 존재하는 파일</li>
<li>CTF(Capture The Flag): 플래그의 내용이 공격자가 제출해야 하는 답안이다. 해킹 방어 대회에서 많이 쓰는 형식이다.</li>
<li>드림핵에서 사용하는 플래그는 보통 <code>DH{}</code> 형식의 중괄호 사이에 보통 해시값(숫자와 abcdef로 이루어져있는)이 들어있는 형태를 플래그로 사용하지만, 여기에는 문제 출제자가 하고 싶은 말이 들어갈 수도 있고, 때로는 예상치 못한 형태일 수도 있다.</li>
</ul>
<p><strong>라이트업</strong></p>
<ul>
<li>워게임이나 CTF에서 플래그를 찾는 과정에서 문제 풀이 과정을 정리한 것.</li>
<li>문제를 풀 때 순차적으로 풀이자가 하는 일 체크리스트</li>
</ul>
<ol>
<li><em>주어진 문제가 어떤 프로그램/서비스인지 이해했다.</em> - 풀이 없이 수행</li>
<li>취약점(또는 이상한 부분)이 무엇인지 파악했다.</li>
<li>찾은 취약점을 어떻게 공략/공격하면 될지 구상이 되었다.</li>
<li>풀이에 필요한 코드나 페이로드를 작성했다</li>
</ol>
<h3 id="실습-welcome-beginners">실습: Welcome-Beginners</h3>
<p><a href="https://dreamhack.io/wargame/challenges/812">https://dreamhack.io/wargame/challenges/812</a>
<img src="https://velog.velcdn.com/images/lojhb__m/post/f9c0f678-b091-4b3d-9dd4-3ff05862c6f8/image.png" alt="">
<strong>풀이</strong></p>
<ol>
<li>터미널 창 실행</li>
<li>vm 접속 후 드림핵에서 제공하는 nc 명령어 입력</li>
<li>입력창에 &#39;Dreamhack&#39; 입력</li>
<li>Welcome Beginners!가 출력되면 성공이다.</li>
<li>DH{}의 내용을 복사하여 드림핵에 입력</li>
</ol>
<h1 id="3-컴퓨터-과학-기초">3. 컴퓨터 과학 기초</h1>
<p>컴퓨터 과학</p>
<ul>
<li>컴퓨터를 이용한 모든 작업과 그 기반 이론을 연구하는 학문(코딩, 계산 이론, 알고리즘, 소프트웨어 설계, 네트워크 등도 포함)</li>
</ul>
<p>해킹</p>
<ul>
<li>컴퓨터 과학 지식을 응용하여 프로그램이나 시스템의 취약점을 발견하고 공격하는 행위</li>
<li>해킹을 공부하기 위해서는 컴퓨터 과학에 대한 기본적인 지식이 필요함.</li>
</ul>
<p><strong>비트와 바이트</strong></p>
<ul>
<li>여러 개의 비트로 구성된 이진 데이터에서 가장 왼쪽에 있는 비트를 MSB(Most Significant Bit, 최상위 비트), 가장 오른쪽에 있는 비트를 LSB(Least Significant Bit, 최하위 비트)라고 한다. </li>
<li>바이트 오더링: 2바이트 이상의 데이터는 메모리에 연속적으로 저장되는데, 이때 각 바이트가 메모리에 정렬되는 방식을 뜻한다. 바이트 오더링은 빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian)이 있다. 바잍 오더링으로 메모리를 정렬할 때는 비트의 순서가 아닌 바이트의 순서를 고려하는 것이므로 바이트 내 비트의 순서는 동일하고 바이트의 순서만 달라진다. </li>
<li>빅 엔디안: 큰 바이트부터 낮은 주소에 저장된다. 네트워크 상에서 데잍를 전송할 때 따른다.</li>
<li>리틀 엔디안: 작은 바이트부터 낮은 주소에 저장된다. 개인용 컴퓨터 및 서버 환경에서 사용되므로 리틀 엔디안 방식을 잘 알고 있어야 한다.</li>
<li>빅 엔디안과 리틀 엔디안을 설명할 때 이용되는 MSB와 LSB에서 B는 bit가 아닌 byte를 의미한다.</li>
<li>데이터가 어떤 바이트 오더링으로 메모리에 저장되었는지 고려하는 것이 중요하다.</li>
</ul>
<p><strong>시프트 연산자</strong></p>
<ul>
<li>x&lt;&lt;n: 비트를 n만큼 왼쪽으로 이동하고 오른쪽 빈칸은 모두 0으로 채운다. x * 2^n이라는 뜻이다.</li>
<li>x&gt;&gt;n: 비트를 n만큼 오른쪽으로 이동하고 왼쪽 빈칸은 가장 왼쪽에 있던 비트와 동일한 비트값으로 채운다.(양수는 양수, 음수는 음수로 부호사 유지된다.) x/(2^n)이라는 뜻이다.</li>
<li>x&gt;&gt;&gt;n: 비트를 n만큼 오른쪽으로 이동하고 왼쪽 빈칸은 모두 0으로 채운다.(음수는 부호가 유지되지 않는다.)</li>
</ul>
<p><strong>인고딩, 디코딩</strong></p>
<ul>
<li>인코딩: 데이터의 크기를 줄이거나 컴퓨터어로 변환하는 등 데이터를 특정한 형식으로 변환하는 것. 암호화와 비슷하지만 인코딩은 누구나 원문을 구할 수 있다는 차이점이 있음.</li>
<li>디코딩: 인코딩된 데이터에서 원래의 값을 구하는 것.</li>
</ul>
<p><strong>Base64 인코딩</strong></p>
<p><strong>운영체제</strong></p>
<ul>
<li>응용 프로그램: 사용자가 원하는 작업을 수행할 수 있도록 사용자를 위해 특정한 기능을 수행하는 프로그램.</li>
<li>운영체제: 응용 프로그램의 동작을 수행하고, 응용 프로그램에게 시스템 자원을 할당하는 등의 복잡한 관리 작업을 수행하는 소프트웨어. 컴퓨터 하드웨어와 사용자/응용 프로그램 사이에서 중재자 역할을 함.</li>
<li>운영체제는 CPU스케줄링, 메모리 공간 분배 및 관리, 컴퓨터와 입출력 장치 사이에 정보 교환 과정 관리, 사용자와 컴퓨터 사이 인터페이스 역할</li>
</ul>
<p><strong>커널과 셸</strong></p>
<ul>
<li>커널: 하드웨어 관리를 실제로 수행하는 프로그램</li>
<li>셸: 사용자와 운영체제의 커널 사이에서 사용자가 운영체제에 명령을 내릴 수 있도록 인터페이스 역할을 함. 명령어를 해석하여 사용자와 운영체제가 소통할 수 있도록 함.</li>
<li>셰을 획득하는 것을 시스템 해킹의 성공으로 여김.</li>
</ul>
<h3 id="실습-64se64">실습: 64se64</h3>
<p><a href="https://dreamhack.io/wargame/challenges/872">https://dreamhack.io/wargame/challenges/872</a></p>
<p><strong>풀이</strong></p>
<ol>
<li>문제 파일을 다운 받아 html 코드를 열었다. </li>
<li>코드에서 name=&quot;64se64_encoding&quot;를 통해 Base64 인고딩 방식으로 된 텍스트라는 것을 유추하고 인코딩된 텍스트를 다시 디코딩하였다.</li>
<li>디코딩을 하였더니 파이썬 코드라는 것을 알게 되었다.(#!/usr/bin/env python3를 통해 알게 됨)</li>
<li>파이썬 코드를 그대로 실행하였더니 터미널에 플래그가 출력되었다.
<img src="https://velog.velcdn.com/images/lojhb__m/post/ebf492fc-199c-4226-998a-2a458ac3bf1c/image.png" alt=""></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 사용법 4주차]]></title>
            <link>https://velog.io/@lojhb__m/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95-4%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@lojhb__m/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95-4%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Fri, 28 Feb 2025 16:33:08 GMT</pubDate>
            <description><![CDATA[<h1 id="1">1.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/ab76dc15-394f-4a52-a850-2749843a66ad/image.png" alt=""></p>
<h3 id="정답">정답:</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/283241e7-ed11-42ba-9365-dd19f43088ca/image.png" alt=""></p>
<h1 id="2">2.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/09b55dcf-2a5d-426a-aa1b-ed05b7e2138f/image.png" alt=""></p>
<h3 id="정답-1">정답:</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/3c33260a-7d62-4aa6-b5d1-62bfc039f50a/image.png" alt=""></p>
<h1 id="3">3.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/6ba89183-9d3a-4857-b5e4-ce36907cb7ca/image.png" alt=""></p>
<h3 id="정답-2">정답:</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/6530ab28-02f1-4d5b-a056-c8c7e76d190a/image.png" alt=""></p>
<h1 id="4">4.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/2cfd6472-fd44-44f1-a0f7-6fdf629e635c/image.png" alt=""></p>
<h3 id="정답-3">정답:</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/8145e5b8-5df3-4395-9aa9-71861666f27b/image.png" alt=""></p>
<h1 id="5">5.</h1>
<p><img src="blob:https://velog.io/f44c4488-5269-40ea-b578-022177afee4d" alt="업로드중.."></p>
<h3 id="정답-4">정답:</h3>
<p><img src="blob:https://velog.io/341970bc-9a14-4453-8955-95563880f199" alt="업로드중.."></p>
<h1 id="6">6.</h1>
<p><img src="blob:https://velog.io/af226559-4de0-4f0b-a4c0-efb2eee21890" alt="업로드중.."></p>
<h3 id="정답-5">정답:</h3>
<p><img src="blob:https://velog.io/2c967afd-9cf7-4cd1-8b54-a68944cf6c05" alt="업로드중.."></p>
<h1 id="7">7.</h1>
<p><img src="blob:https://velog.io/7daccac9-bfa2-4141-9906-20bf6f2004c2" alt="업로드중.."></p>
<h3 id="정답-6">정답:</h3>
<p><img src="blob:https://velog.io/2f6b470f-d9d1-47ef-967d-f507c4662da6" alt="업로드중.."></p>
<ul>
<li>kill -9 4172를 입력하니 기존 터미널 창이 사라졌다.<h1 id="8">8.</h1>
<img src="blob:https://velog.io/bac4587b-514f-4b52-a471-978b7c979677" alt="업로드중.."><h3 id="정답-7">정답:</h3>
<img src="blob:https://velog.io/bf71d605-1d27-4750-bfb9-0eacf3e05469" alt="업로드중.."></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 10813]]></title>
            <link>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80</link>
            <guid>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80</guid>
            <pubDate>Tue, 25 Feb 2025 07:19:48 GMT</pubDate>
            <description><![CDATA[<h1 id="1-문제">1. 문제</h1>
<blockquote>
<p>도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이 들어있다.
도현이는 앞으로 M번 공을 바꾸려고 한다. 도현이는 공을 바꿀 바구니 2개를 선택하고, 두 바구니에 들어있는 공을 서로 교환한다.
공을 어떻게 바꿀지가 주어졌을 때, M번 공을 바꾼 이후에 각 바구니에 어떤 공이 들어있는지 구하는 프로그램을 작성하시오.</p>
</blockquote>
<h1 id="2-입력">2. 입력</h1>
<blockquote>
<p>첫째 줄에 N (1 ≤ N ≤ 100)과 M (1 ≤ M ≤ 100)이 주어진다.
둘째 줄부터 M개의 줄에 걸쳐서 공을 교환할 방법이 주어진다. 각 방법은 두 정수 i j로 이루어져 있으며, i번 바구니와 j번 바구니에 들어있는 공을 교환한다는 뜻이다. (1 ≤ i ≤ j ≤ N)
도현이는 입력으로 주어진 순서대로 공을 교환한다.</p>
</blockquote>
<h1 id="3-출력">3. 출력</h1>
<blockquote>
<p>1번 바구니부터 N번 바구니에 들어있는 공의 번호를 공백으로 구분해 출력한다.</p>
</blockquote>
<h1 id="4-첫-번째-시도---성공">4. 첫 번째 시도 - 성공</h1>
<pre><code class="language-python">N, M = map(int, input().split())
buckets = list()
# 바구니 번호를 부여하는 for 문, 인덱스=바구니 번호-1
for k in range(N):  
    buckets.append(k)

# M은 바구니 자리를 바꾸는 횟수
for k in range(M):
    i, j = map(int, input().split())
    temp = buckets[i-1]
    buckets[i-1] = buckets[j-1]
    buckets[j-1] = temp

for k in range(N):
    print(buckets[k]+1, end=&quot; &quot;)
</code></pre>
<ul>
<li>인덱스는 0부터 시작하고 바구니 번호는 1부터 시작하므로
인덱스=바구니 번호-1인 것을 헷갈려하면 안 된다.</li>
<li>마지막 for문에서, print 함수는 아무 조건이 없으면 한 번 시행 후 &#39;\n&#39; 을 자동으로 입력하므로 인자로 end=&quot; &quot;를 추가하여 공백을 두고 출력하도록 하였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 10807]]></title>
            <link>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-10807</link>
            <guid>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-10807</guid>
            <pubDate>Tue, 25 Feb 2025 00:58:32 GMT</pubDate>
            <description><![CDATA[<h1 id="1-문제">1. 문제</h1>
<blockquote>
<p>총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.</p>
</blockquote>
<h1 id="2-입력">2. 입력</h1>
<blockquote>
<p>첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.</p>
</blockquote>
<h1 id="3-출력">3. 출력</h1>
<blockquote>
<p>첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.</p>
</blockquote>
<h1 id="4-첫-번째-시도---실패">4. 첫 번째 시도 - 실패</h1>
<pre><code class="language-python">N = input()
s = input()
nums = s.split()
v = input()
count = 0
for i in range(N):
    if nums[i] == v:
        count += 1
print(count)</code></pre>
<ul>
<li>오류가 떴을 때 N이 str 타입이라는 것을 깨달았다. for문에서 range(N)을 쓰기 위해서는 N을 int 타입으로 바꿔야 할 것이라 판단했다.<h1 id="5-두-번째-시도---성공">5. 두 번째 시도 - 성공</h1>
<pre><code class="language-python">N = input()
N = int(N)
s = input()
nums = s.split()
v = input()
count = 0
for i in range(N):
  if nums[i] == v:
      count += 1
print(count)</code></pre>
</li>
<li>nums[i]와 v를 하나하나 비교하고, 같으면 count의 수를 추가하는 것으로 코드를 작성하였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 10988]]></title>
            <link>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-10988</link>
            <guid>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-10988</guid>
            <pubDate>Tue, 25 Feb 2025 00:36:54 GMT</pubDate>
            <description><![CDATA[<h1 id="1-문제">1. 문제</h1>
<blockquote>
<p>알파벳 소문자로만 이루어진 단어가 주어진다. 이때, 이 단어가 팰린드롬인지 아닌지 확인하는 프로그램을 작성하시오.
팰린드롬이란 앞으로 읽을 때와 거꾸로 읽을 때 똑같은 단어를 말한다. 
level, noon은 팰린드롬이고, baekjoon, online, judge는 팰린드롬이 아니다.</p>
</blockquote>
<h1 id="2-입력">2. 입력</h1>
<blockquote>
<p>첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.</p>
</blockquote>
<h1 id="3-출력">3. 출력</h1>
<blockquote>
<p>첫째 줄에 팰린드롬이면 1, 아니면 0을 출력한다.</p>
</blockquote>
<h1 id="4-첫-번째-시도---성공">4. 첫 번째 시도 - 성공</h1>
<pre><code class="language-python">s = input()
length = len(s)
for i in range(length):
    if(s[i]!=s[(length-1)-i]):
        print(0)
        quit()
print(1)</code></pre>
<ul>
<li>문자열의 길이를 저장하고 문자열의 인덱스를 앞뒤로 좁혀가며 비교한다.</li>
<li>문자열의 문자를 비교하고 한 번이라도 다르면 0을 출력한 뒤 quit()로 프로그램을 끝낸다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 사용법 3주차]]></title>
            <link>https://velog.io/@lojhb__m/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95-3%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@lojhb__m/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95-3%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sat, 22 Feb 2025 12:15:57 GMT</pubDate>
            <description><![CDATA[<h1 id="1">1.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/f6cc0529-9669-4739-ba5e-b8d51b4efdcc/image.png" alt=""></p>
<h3 id="정답-4번">정답: 4번</h3>
<ul>
<li>4번은 홈디렉토리를 나타내는 기호이다.</li>
</ul>
<h1 id="2">2.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/f3651d07-86d7-4036-8f15-9ca071edc717/image.png" alt=""></p>
<h3 id="정답-3번">정답: 3번</h3>
<ul>
<li>2&gt;는 표준 오류 메세지를 파일에 저장한다.</li>
</ul>
<h1 id="3">3.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/8f68056c-e331-428d-ab19-1a4cf298295b/image.png" alt=""></p>
<h3 id="정답-bashrc">정답: ~/.bashrc</h3>
<h1 id="4">4.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/6541212d-f20d-446a-831b-ed2d0b1aea0f/image.png" alt=""></p>
<h3 id="정답-source">정답: source</h3>
<h1 id="5">5.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/98f9bbc8-4721-47e2-b875-6ff2ffc4d8ff/image.png" alt=""></p>
<h3 id="정답-1번">정답: 1번</h3>
<ul>
<li>시스템 공통으로 적용되는 환경 변수를 설정하는 파일이다.<h1 id="6">6.</h1>
<img src="https://velog.velcdn.com/images/lojhb__m/post/8e0eec9e-5873-4974-b7e8-1ff3ca8b7bd2/image.png" alt=""><h3 id="정답-2번">정답: 2번</h3>
</li>
</ul>
<h1 id="7">7.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/c91d7b19-837d-4023-ac2a-c2b22d3b82d4/image.png" alt=""></p>
<h3 id="정답-binbash">정답: #!/bin/bash</h3>
<h1 id="8">8.</h1>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/e341c10a-cf44-48ac-822e-5da7af03eb82/image.png" alt=""></p>
<h3 id="정답">정답:</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/0c66d843-1494-44d6-bf14-cacec0b24540/image.png" alt=""></p>
<ul>
<li>스크립트를 작성한 후 실행을 하였으나 권한(허가)가 없다고 하여서 <span style="color: blue">chmod +x 파일이름.sh</span> 명령으로 권한을 부여하였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 2675]]></title>
            <link>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-2675</link>
            <guid>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-2675</guid>
            <pubDate>Sat, 22 Feb 2025 10:04:28 GMT</pubDate>
            <description><![CDATA[<p><strong>문제</strong></p>
<blockquote>
<p>문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다</p>
</blockquote>
<p><strong>입력</strong></p>
<blockquote>
<p>첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다.
예제 입력: 
2
3 ABC
5 /HTP</p>
</blockquote>
<p><strong>출력</strong></p>
<blockquote>
<p>각 테스트 케이스에 대해 P를 출력한다.
예제 출력:
AAABBBCCC
/////HHHHHTTTTTPPPPP</p>
</blockquote>
<p><strong>첫 번째 시도 - 성공</strong></p>
<pre><code class="language-python">T = input()
testCase = int(T)

i = 0 # 테스트 케이스 순서
while i &lt; testCase: 
    P = &#39;&#39;
    R, S = input().split()
    r = int(R) # input은 문자열 타입만 입력이 가능하므로 int형으로 변환해준다.

    j = 0 # 문자열 길이에 따른 순서
    while j &lt; len(S):
        k = 0 # 문자열 S의 인덱스
        while k &lt; r:
            P += S[j]
            k += 1
        j += 1

    print(P)
    i += 1</code></pre>
<ul>
<li>while문을 사용하여 코드를 작성하였고, 딱히 어려움은 없었으며 한 번 만에 성공하였다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 7120]]></title>
            <link>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-7120</link>
            <guid>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-7120</guid>
            <pubDate>Sat, 22 Feb 2025 09:25:56 GMT</pubDate>
            <description><![CDATA[<p><strong>문제</strong></p>
<blockquote>
<p>컴퓨터 키보드의 버튼이 눌렸다가 인쇄된 텍스트에 동일한 글자가 두 개 이상 있는 경우가 있습니다. 예를 들어, &quot;piano&quot;라는 단어는 &quot;ppppppiaanooooo&quot;로 바뀔 수 있습니다.
당신의 과제는 이러한 오류를 수정하는 프로그램을 작성하는 것입니다. 주어진 문자열 내에서 동일한 문자가 연이어 나타나는 모든 위치를 찾아서 하나의 문자로 바꿉니다. 즉, 다른 모든 동일한 문자를 지우고 문자열의 나머지 부분을 남은 문자 하나의 끝에 추가합니다.</p>
</blockquote>
<p><strong>입력</strong></p>
<blockquote>
<p>입력의 첫 번째 줄은 소문자 라틴 문자만 포함하는 문자열입니다. 문자열의 길이는 최대 250자입니다.</p>
</blockquote>
<p><strong>출력</strong></p>
<blockquote>
<p>출력의 첫 번째 줄에 수정된 문자열을 출력합니다. 
(예제 입력: ppppppiaanooooo)</p>
</blockquote>
<p><strong>첫 번째 시도 - 실패</strong></p>
<pre><code class="language-python">s = input()
i = 0
newS = &#39;&#39;
while i &lt; len(s):
    if s[i-1] != s[i]:
        newS += s[i-1]
    i += 1
print(newS)</code></pre>
<ul>
<li>출력 시 <span style="color: blue">opian</span>이라고 나온다. 이는 <code>i = 0</code>일 때 <code>s[-1]</code>과 <code>s[0]</code>을 비교하게 됨으로써 나온 오류이다. <code>s[-1]</code>은 문자열의 가장 끝인 <code>s\[len(s)-1]</code>을 의미하는 것이다.</li>
<li>따라서 나는 <code>s[-1]</code>은 문자열의 가장 끝 번호를 의미한다는 것을 알게 되었다. 이후 <code>s[-n]</code>을 출력해보니 문자열의 인덱스를 마이너스로 하면 순환한다는 것을 알게 되었다. 이러한 점을 기억한다면 코드에는 활용될 것 같진 않고 오류를 수정하는데 도움이 될 것 같다.</li>
</ul>
<p><strong>두 번째 시도 - 실패</strong></p>
<pre><code class="language-python">s = input()
i = 1
newS = &#39;&#39;
while i &lt; len(s):
    if s[i-1] != s[i]:
        newS += s[i-1]
    i += 1
print(newS)</code></pre>
<ul>
<li>출력 시 <span style="color: blue">pian</span>이라고 나온다. 이는 문자열에서 <code>o</code>라는 문자는 비교했을 때 항상 같은 경우만 있어서 newS에 추가되지 않아서 생긴 오류이다.</li>
<li>따라서 마지막 문자열은 무조건 추가되어야 한다는 것을 깨달았다.</li>
</ul>
<p><strong>세 번째 시도 - 성공</strong></p>
<pre><code class="language-python">s = input()
i = 1
newS = &#39;&#39;
while i &lt; len(s):
    if s[i-1] != s[i]:
        newS += s[i-1]
    i += 1
newS += s[i-1]
print(newS)</code></pre>
<ul>
<li>마지막 문자열을 추가하는 것으로 코드를 수정하였고, 정상적으로<span style="color: blue">piano</span>가 출력되었다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 사용법 2주차]]></title>
            <link>https://velog.io/@lojhb__m/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95-2%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@lojhb__m/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95-2%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 02 Feb 2025 15:45:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>과제1. 아래와 같은 명령어들을 수행하여 hw1.c 파일을 생성하고, 컴파일 후 각각의 실행 결과를 캡쳐</p>
</blockquote>
<h3 id="1--vi-hw1c">1. $ vi hw1.c</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/510ac6d9-5e8c-405a-ad01-a9a0a90f27e3/image.png" alt="">
<strong>vi</strong></p>
<ul>
<li>문서 편집기이다. 화면 단위 편집기에 해당한다.</li>
<li>동작 모드로는 명령 모드, 입력 모드, 마지막행 모드(콜론 모드)가 있다.</li>
</ul>
<p><strong><code>hw1.c</code> 파일을 편집할 수 있는 환경을 실행하였다.</strong>
<img src="https://velog.velcdn.com/images/lojhb__m/post/70cdb0aa-6597-4af0-a457-0ba1aa2e01a0/image.png" alt="">
<strong>명령 모드가 시작되는 창이다.</strong>
<img src="https://velog.velcdn.com/images/lojhb__m/post/5743eb87-a186-4b14-b6c5-a63e644e049b/image.png" alt=""></p>
<p><strong>현재 커서에서 <code>i</code>를 입력하여 입력 모드로 전환하였다.</strong></p>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/337059f4-39b8-4f93-baa6-1486a65a42b6/image.png" alt="">
<strong>문제에 제시된 hw1.c 파일을 입력하였다.</strong>
<strong>이후 <code>esc</code>를 누르고 명령 모드로 전환하였고 <code>: + w + q</code>를 입력하여 작업한 내용을 저장한 후 vi를 종료하였다</strong></p>
<ul>
<li><code>esc</code> : 입력모드에서 누를 경우 명령모드로 전환된다.</li>
<li><code>:wq</code> : 작업한 내용을 저장한 후 vi를 종료한다.</li>
</ul>
<h3 id="2--gcc-hw1c-o-hw1">2. $ gcc hw1.c –o hw1</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/8e458028-a53d-467d-8394-efb22936de38/image.png" alt="">
<strong>오류</strong></p>
<ul>
<li><code>hw1.c</code> 파일의 printf를 print로 입력하여 컴파일 오류가 생겼다.</li>
<li>터미널에서 수정하는 법을 몰라서 텍스트 파일을 찾아 수정하였다.
<img src="https://velog.velcdn.com/images/lojhb__m/post/bd880fdb-c26e-4ff6-9e57-ac91ef108779/image.png" alt=""></li>
<li><em>수정 완료된 모습*</em></li>
</ul>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/c03c630e-c0c2-4d7f-83e5-449bcf461218/image.png" alt="">
<strong>명령어 입력 후 컴파일 완료</strong></p>
<p><strong>gcc hw1.c -o hw1</strong></p>
<ul>
<li>한 개의 파일로 작성된 프로그램을 컴파일하는 명령어이다. <code>hw1.c</code> 파일을 컴파일한다.</li>
<li>-o : 실행파일명을 지정하는 옵션이다.</li>
</ul>
<h3 id="3-hw1">3.$ ./hw1</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/3fcfb72d-73b5-459a-94f7-7df7e18dacc6/image.png" alt="">
<strong>프로그램 실행 완료: 출력됨</strong></p>
<h3 id="4--hw1-input">4. $ ./hw1 input</h3>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/3b9fe8fc-106f-4cf8-9034-db941b07bccb/image.png" alt="">
<strong>프로그램 실행 완료</strong></p>
<blockquote>
<p>과제2. 4개의 파일을 vi 에디터로 작성(<code>main.c</code>, <code>hello.h</code>, <code>hello.c</code>, <code>bye.c</code>)</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/d45d72bc-1323-4d26-9b6c-ce113dc5c39c/image.png" alt="">
<strong><code>main.c</code> 파일 생성</strong>
<img src="https://velog.velcdn.com/images/lojhb__m/post/4768054b-2eec-47e5-86cc-bcdefef05172/image.png" alt="">
<strong>문제에 주어진 <code>main.c</code> 파일 입력</strong>
<img src="https://velog.velcdn.com/images/lojhb__m/post/66bfb970-7104-44c5-b737-da667e2479b0/image.png" alt="">
<strong>cat 명령어를 통해 <code>main.c</code> 파일 출력</strong></p>
<p>같은 방법으로 <code>hello.h</code>, <code>hello.c</code>, <code>bye.c</code> 파일을 생성 및 출력한다.</p>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/423d8619-239e-492e-870a-fe1bf6caabcc/image.png" alt="">
<strong>같은 방법으로 <code>hello.h</code> 파일 생성 및 출력</strong>
<img src="https://velog.velcdn.com/images/lojhb__m/post/1aecac4e-7aa7-447b-ba7a-781f3fa74e0c/image.png" alt="">
<strong>같은 방법으로 <code>hello.c</code> 파일 생성 및 출력</strong>
<img src="https://velog.velcdn.com/images/lojhb__m/post/ca15a262-800b-4a61-85f0-57a87b4f758c/image.png" alt="">
<strong>같은 방법으로 <code>bye.c</code> 파일 생성 및 출력</strong>
<img src="https://velog.velcdn.com/images/lojhb__m/post/ca15a262-800b-4a61-85f0-57a87b4f758c/image.png" alt=""></p>
<blockquote>
<p>과제 2-1. 4개의 프로그램을 자동 컴파일 하여 실행 파일 all 을 만들어주는 makefile을 작성 (vi와 makefile 명령어사용)</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/27834956-9f1a-4f0f-bcb1-871eb4da4ffa/image.png" alt="">
<strong>makefile을 생성한다.</strong></p>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/21f08ab8-444d-47a0-b488-a538b3214758/image.png" alt=""></p>
<p><strong>완료된 모습이다.</strong></p>
<blockquote>
<p>과제 2-2. make 명령어를 실행한 후 실행 결과를 캡쳐</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/691dc1c8-fbb6-4b30-8bf5-2d0028e479fc/image.png" alt=""></p>
<p><strong>완료된 모습이다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 2480]]></title>
            <link>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-2480</link>
            <guid>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-2480</guid>
            <pubDate>Sun, 02 Feb 2025 10:11:08 GMT</pubDate>
            <description><![CDATA[<p><strong>문제</strong></p>
<blockquote>
<p>1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.</p>
</blockquote>
<ol>
<li>같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.</li>
<li>같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.</li>
<li>모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.</li>
</ol>
<p><strong>3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.</strong></p>
<p><strong>입력</strong></p>
<blockquote>
<p>첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.</p>
</blockquote>
<p><strong>출력</strong></p>
<blockquote>
<p>첫째 줄에 게임의 상금을 출력 한다.</p>
</blockquote>
<p><strong>소스코드</strong></p>
<pre><code class="language-python">A, B, C = map(int, input().split())

if A == B and B == C:
    result = 10000 + A * 1000
elif A == B or A == C:
    result = 1000 + A * 100
elif B == C:
    result = 1000 + B * 100
elif A &gt; B and A &gt; C:
     result = A * 100
elif B &gt; A and B &gt; C:
     result = B * 100
elif C &gt; A and C &gt; B:
     result = C * 100

print(result)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 10039]]></title>
            <link>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-10039</link>
            <guid>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-10039</guid>
            <pubDate>Sun, 02 Feb 2025 09:47:00 GMT</pubDate>
            <description><![CDATA[<p><strong>문제</strong></p>
<blockquote>
<p>상현이가 가르치는 아이폰 앱 개발 수업의 수강생은 원섭, 세희, 상근, 숭, 강수이다.
어제 이 수업의 기말고사가 있었고, 상현이는 지금 학생들의 기말고사 시험지를 채점하고 있다. 기말고사 점수가 40점 이상인 학생들은 그 점수 그대로 자신의 성적이 된다. 하지만, 40점 미만인 학생들은 보충학습을 듣는 조건을 수락하면 40점을 받게 된다. 보충학습은 거부할 수 없기 때문에, 40점 미만인 학생들은 항상 40점을 받게 된다.
학생 5명의 점수가 주어졌을 때, 평균 점수를 구하는 프로그램을 작성하시오.</p>
</blockquote>
<p><strong>입력</strong></p>
<blockquote>
<p>입력은 총 5줄로 이루어져 있고, 원섭이의 점수, 세희의 점수, 상근이의 점수, 숭이의 점수, 강수의 점수가 순서대로 주어진다.</p>
</blockquote>
<p>점수는 모두 0점 이상, 100점 이하인 5의 배수이다. 따라서, 평균 점수는 항상 정수이다. </p>
<p><strong>출력</strong></p>
<blockquote>
<p>첫째 줄에 학생 5명의 평균 점수를 출력한다.</p>
</blockquote>
<p><strong>소스코드</strong></p>
<h4 id="첫-번째-시도---실패">첫 번째 시도 - 실패</h4>
<pre><code class="language-python">A = int(input())
B = int(input())
C = int(input())
D = int(input())
E = int(input())

if A &lt; 40:
  A = 40
elif B &lt; 40:
  B = 40
elif C &lt; 40:
  C = 40
elif D &lt; 40:
  D = 40
elif E &lt; 40:
  E = 40

total = A + B + C + D + E
average = int(total / 5)

print(average)</code></pre>
<ul>
<li>if를 쓴 후 습관적으로 elif를 쓰게 되는 것 같다. 어처구니 없는 실수라고 생각한다.<h4 id="두-번째-시도---성공했으나-비효율적인-코드라고-판단됨">두 번째 시도 - 성공했으나 비효율적인 코드라고 판단됨</h4>
<pre><code class="language-python">A = int(input())
B = int(input())
C = int(input())
D = int(input())
E = int(input())
</code></pre>
</li>
</ul>
<p>if A &lt; 40:
  A = 40
if B &lt; 40:
  B = 40
if C &lt; 40:
  C = 40
if D &lt; 40:
  D = 40
if E &lt; 40:
  E = 40</p>
<p>total = A + B + C + D + E
average = int(total / 5)</p>
<p>print(average)</p>
<pre><code>#### 세 번째 코드 - 성공, 지금 작성할 수 있는 가장 효율적인 코드라고 생각 됨

```python
def score(num):
  if num &lt; 40:
    num = 40
  return num

A = int(input())
B = int(input())
C = int(input())
D = int(input())
E = int(input())

A = score(A)
B = score(B)
C = score(C)
D = score(D)
E = score(E)

total = A + B + C + D + E
average = int(total / 5)

print(average)</code></pre><ul>
<li>함수를 사용하여 반복되는 과정을 함수화하였다.<h4 id="함수---def-키워드">함수 - def 키워드</h4>
</li>
<li>def &lt;함수명(매개변수)&gt;:
&lt;함수 내용(들여쓰기를 해야 한다)&gt;</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 백준 10817]]></title>
            <link>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-10817</link>
            <guid>https://velog.io/@lojhb__m/Python-%EB%B0%B1%EC%A4%80-10817</guid>
            <pubDate>Sun, 02 Feb 2025 09:34:14 GMT</pubDate>
            <description><![CDATA[<p><strong>문제</strong></p>
<blockquote>
<p>세 정수 A, B, C가 주어진다. 이때, 두 번째로 큰 정수를 출력하는 프로그램을 작성하시오. </p>
</blockquote>
<p><strong>입력</strong></p>
<blockquote>
<p>첫째 줄에 세 정수 A, B, C가 공백으로 구분되어 주어진다. (1 ≤ A, B, C ≤ 100)</p>
</blockquote>
<p><strong>소스코드</strong></p>
<pre><code class="language-python">A, B, C = map(int, input().split())
if B &gt;= A and A &gt;= C:
    print(A)
elif C &gt;= A and A &gt;= B:
    print(A)
elif A &gt;= B and B &gt;= C:
    print(B)
elif C &gt;= B and B &gt;= A:
    print(B)
else:
    print(C)</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] 리눅스 사용법 1주차]]></title>
            <link>https://velog.io/@lojhb__m/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@lojhb__m/Linux-%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%82%AC%EC%9A%A9%EB%B2%95-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sun, 02 Feb 2025 08:24:47 GMT</pubDate>
            <description><![CDATA[<blockquote>
<ol>
<li>상대경로를 사용하여 /usr/bin 디렉토리로 이동하고, 결과를 pwd 명령어로 확인</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/5f2a0fd8-4d8c-4f06-9770-f4182ade3bae/image.png" alt=""></p>
<p><strong>pwd</strong>: 현재 위치한 디렉토리의 위치를 출력한다.
<strong>cd</strong>: 현재 위치한 디렉토리의 위치를 변경한다. 즉, 원하는 디렉토리로 이동한다.</p>
<ul>
<li>/../usr/bin : 상대 경로명으로 이동한다. </li>
<li>.. : 부모 디렉토리를 의미한다.</li>
</ul>
<blockquote>
<ol start="2">
<li>절대경로를 사용하여 홈 디렉토리로 이동하고, ping 디렉토리를 생성 후 상대경로를 사용하여 ping 디렉토리로 이동 후, pwd로 결과 확인</li>
</ol>
</blockquote>
<h4 id="1-절대경로를-사용하여-홈-디렉터리로-이동">1. 절대경로를 사용하여 홈 디렉터리로 이동</h4>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/2d69b49e-2baa-4b52-bab9-4c0a6416c58c/image.png" alt=""></p>
<p><strong>cd</strong></p>
<ul>
<li>~: 홈 디렉토리를 의미한다. <strong>cd ~</strong> 는 홈 디렉토리로 이동하는 것을 의미한다.</li>
<li>cd /home/<span style="color:blue">username</span>: 절대 경로명으로 이동한다. 홈 디렉토리를 절대 경로명으로 이동한 것이다.</li>
</ul>
<h4 id="2-ping-디렉토리-생성-후-상대-경로를-사용하여-ping-디렉터리로-이동-후-pwd로-결과-확인">2. ping 디렉토리 생성 후 상대 경로를 사용하여 ping 디렉터리로 이동 후, pwd로 결과 확인</h4>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/9ae4e033-f4e0-420e-a2e3-8ed905db3550/image.png" alt="">
<strong>mkdir</strong> </p>
<ul>
<li>디렉토리를 생성한다. 이미 존재하는 파일의 이름과 동일한 이름의 디렉토리는 생성이 불가하다.</li>
</ul>
<p><strong>여러 오류의 이유</strong></p>
<ul>
<li>디렉토리 생성까지는 정상적으로 완료했으나, 디렉토리 생성 후에 자신의 위치는 생성한 디렉토리(ping)이므로 오류가 생겼다. pwd 명령어를 통해 자신의 위치를 확인한 후 깨달았고, 홈 디렉터리로 이동하여 하위 디렉터리인 ping 디렉터리로 이동하였다.</li>
</ul>
<blockquote>
<ol start="3">
<li>cat을 사용하여 tmp1 파일을 생성하고, tmp1에 저장된 내용을 출력(내용은 자유)</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/7951214d-46dc-4655-8b07-6a1e19b94373/image.png" alt="">
<strong>cat</strong></p>
<ul>
<li>파일 내용의 연결 및 파일 내용을 출력하는 명령어이다. 여러 파일을 연결해 출력 가능하다.</li>
<li>cat [파일이름] : 위 파일 내용을 출력한다.</li>
<li>cat &gt; [파일이름] : [파일이름] 파일을 생성한다. crtl+d를 눌러 텍스트 입력을 마친다.</li>
<li>cat &gt; tmp1 : tmp1이라는 파일이 없으므로 생성하였다. </li>
<li>cat tmp1 : tmp1 파일 내용을 출력한다.</li>
</ul>
<blockquote>
<ol start="4">
<li>tmp1 파일을 이용하여 sample이라는 이름의 심볼릭 링크 파일을 생성하고, cat 명령어로 sample 파일에 저장된 내용을 출력</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/0aa946aa-1ff4-40f8-ab7a-7f5853629cdf/image.png" alt="">
<strong>파일 링크</strong></p>
<ul>
<li>기존에 있는 파일에 새로운 파일명을 붙여 링크를 연결하는 것이다.</li>
<li>하드링크: 기존에 파일에 새로운 파일명을 추가로 생성하는 것이다. 원본 파일과 동일한 inode(포인터와 유사)를 가진다.</li>
<li>심볼릭 링크: 원본 파일을 가리키는 새로운 파일을 생성하는 것이다. 윈도우의 바로가기와 유사하다.</li>
<li>inode: 파일에 대한 정보를 가지고 있는 특별한 구조체이다. 포인터와 유사하다. 파일의 이름이 다르지만 inode 번호가 같다면 같은 파일이다.</li>
</ul>
<p><strong>ln [원본파일명] [링크파일명]</strong></p>
<ul>
<li>파일의 링크를 생성하는 명령어이다.</li>
<li>ln-s : 심볼링 링크를 생성한다. inode 번호가 다르게 부여된다.</li>
</ul>
<blockquote>
<ol start="5">
<li>“ls”, “ls –a”, “ls –l”명령어를 각각 실행하고 차이점 서술하기</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/c14e3b44-3a80-4c24-b92b-95469d557a8a/image.png" alt="">
<strong>ls</strong> : 현재 위치한 디렉터리의 내용을 출력한다.</p>
<ul>
<li>ls : 현재 위치한 디렉터리의 파일과 디렉터리 이름만 출력한다.</li>
<li>ls -a : 숨겨진 파일과 디렉터리, 현재 위치한 디렉터리의 파일과 디렉터리 이름을 출력한다.</li>
<li>ls -l : 현재 위치한 디렉토리의 파일과 디렉터리의 자세한 정보를 표시한다.</li>
</ul>
<blockquote>
<ol start="6">
<li>ping 디렉토리에 test1 서브 디렉토리를 만들고, test1 디렉토리로 이동</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/e059d871-253b-41a0-a630-b280da07abf9/image.png" alt=""></p>
<ul>
<li><blockquote>
<ol start="7">
<li>tmp1 파일을 test1 서브디렉토리 아래에 aaa라는 이름으로 바꾸어서 복사하고, ls 명령어를 사용하여 실행 결과 출력</li>
</ol>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/4d3be538-ca39-40f8-9d67-7cda4c13a03c/image.png" alt="">
<strong>cp [옵션] [경로1(복사할 파일)] [경로2(복사할 위치)]</strong></p>
<ul>
<li>파일이나 디렉터리를 복사할 수 있다.</li>
<li>cp -r :디렉터리를 복사할 때 하위 디렉터리까지 모두 포함하여 복사한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/5e18b011-964c-46ac-bce0-9f431e1428c1/image.png" alt=""></p>
<p><strong>tmp1 파일을 test1디렉터리에 aaa 파일로 복사하였다.</strong></p>
<blockquote>
<ol start="8">
<li>ping 디렉토리에서 cp –r 명령어를 사용하여 test1 디렉토리 전체를 새로운 서브 디렉토리인 test3으로 복사</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/lojhb__m/post/b5342a09-af15-498b-b4ab-29893269e57d/image.png" alt="">
<img src="https://velog.velcdn.com/images/lojhb__m/post/27549b4e-b7bb-4a8b-aa4f-8dacdba47205/image.png" alt="">
<strong>ping 디렉터리에 test1 디렉터리 전체를 test3을 새로 만들며 복사하였다.</strong></p>
]]></description>
        </item>
    </channel>
</rss>