RSA 맨날 까먹는 거 같다.
RSA?
공개키 암호화 알고리즘 중 하나이다. 공개 키, 비밀 키를 사용하기 때문에 비대칭 암호라고도 한다. Asymmetric.
Key
Trap door one way function의 방식이다. 이게 정말 신기하지 않나? 수학 전공은 아니고, 현암응도 안 들었지만 이런 방식이 있다는 게 넘 신기하다.
암튼,
키를 생성하는 방법은 두 가지가 있다.
-
- 소인수분해
- N=pq이다.
-
- 이산대수
- gx mod p
이중에서 RSA의 키생성은 1번째를 이용한다. 서술하자면, 매우 큰 소수 p,q를 고르고, n=pq와 k=O(n)를 구한다(오일러 함수 약자 찾기가 귀찮아서 대문자 O로 대체) 여기서 ed=1 (mod O(n))이다. 이때 e가 public, d가 private key이다.
오일러 함수
어디서는 오일러의 피 함수?라고 하네. 난 걍 오일러 함수(totient func)으로 하겠다. 위에서 설명한 것에 대한 보충인데 오일러 함수는 1부터 n까지의 양의 정수 중에 n과 서로소인 수의 개수를 근으로 내는 함수이다. gcd(n,k)=1인 근의 개수를 세면 된다.
+) 아 파이를 피라고 쓴 거구나.
소수 p,q(mod n)에 대해서 오일러 파이 함수 공식은 O(n)=(p-1)(p-1) (mod n)이다.
메시지 암호화
c=m^e (mod n)
m=c^d (mod n)
간단하죠? m=m^(ed)가 되는데 ed=1이니까 복호화가 된다.
def gcd(a,b):
while b!=0:
a,b=b,a%b
return a
def dec(pk,c):
key, n =pk
m=[chr((char**key)%n) for char in c]
return ''.join(m)
def enc(pk,m):
key, n=pk
c=[(ord(char)**key)%n for char in m]
return c
def get_private_key(e, tot):
k=1
while (e*k)%tot != 1:
k+=1
return k
def get_public_key(tot):
e=2
while e<tot and gcd(e, tot)!=1:
e += 1
return e
n = p*q
totient = (p-1)*(q-1)
e = get_public_key(totient)
d = get_private_key(e, totient)
c = enc((e,n), m)
m = dec((d,n),c)
내 깃블로그는 hexo가 아니지만 소학회가 NexT를 쓴다(NexT는 꽤나 유명한? 테마) SEO 최적화가 어려운 건 아니지만, 삽질을 억울하게 많이 해서 기록해보려 한다.
plugin 설치
표준 링크, robots.txt 등 크롤링을 위한 플러그인을 몇개 설치해야 한다.
npm install hexo-generator-robotstxt --save
npm install hexo-generator-feed --save
npm install hexo-generator-seo-friendly-sitemap --save
블로그 루트 디렉토리의 config.yml
sitemap:
path: sitemap.xml
tag: false
category: false
feed:
type: rss2
path: rss2.xml
limit: 20
robotstxt:
useragent: "*"
allow:
- /
sitemap:
블로그 홈 디렉토리에 있는 config.yml에 위 내용을 추가해준다.
여기서 맨 상단에 url이 커스텀 도메인이 맞는지 꼭!! 확인해줘야 한다. 삽질 원인 중 하나는 이 Url이 커스텀 도메인이 아니라 깃페이지 링크였다.
theme 디렉토리의 config.yml
일단 다른 블로그에서는 해당 config.yml에 SEO 세팅이 좀 달랐던 거 같은데 NexT는 찾아보면..
# ---------------------------------------------------------------
# SEO Settings
# See: https://theme-next.js.org/docs/theme-settings/seo
# ---------------------------------------------------------------
...
# Google Webmaster tools verification.
# See: https://developers.google.com/search
google_site_verification:
이런 부분이 존재한다. 일단 킵해두고..

구글 서치 콘솔에 들어가서 도메인을 입력하자.

위 화면의 3번 아래에 어떠한 레코드가 나올 것이다. 포맷은 google-site-verification=key
여기의 Key를 아까 yaml에 있는 google_site_verification에 복사하여 넣고 배포 -> 확인을 누른다. 이렇게 하면 다른 테마보다 오히려 SEO 설정이 쉬워진다.

이제 콘솔창 좌측 사이드바에서 Sitemaps를 누르면 사이트맵을 추가할 수 있는 창이 뜬다. 여기에 rss2.xml과 sitemap.xml을 추가해준다.
사실 어려운 내용은 아니었으나 커스텀 도메인을 config.yml url로 두지 않아서 생긴 게 크다.
정말 간만의 포너블 공부.. mac 사고 포너블 세팅을 미루다 미루다가 깃블로그 만든 김에 슈슈슉 해버리자 다짐했다.
free
함수로 청크 해제 -> ptmalloc2는 이를 tcache나 bins에 추가/관리
tcache나 bins를 어떠한 List라고 했을 때, free
는 청크를 추가하는 함수, malloc
은 청크를 꺼내는 함수이다. 임의의 청크에 대해 free
는 두 번 적용이 가능하다. 왜냐면 프리했다가 말록한 거 다시 프리할 수 있으니까.
만약 청크가 중복되면 duplicated 되었다고 하는데, 이 duplicated free list를 활용하면 임의 주소에 청크를 할당할 수 있다고 한다(어떻게?) 그래서 이 임의 주소에 할당한 청크 값을 읽거나 작성하는 공격을 진행할 수 있다.
단순히 요약하자면, 같은 청크를 중복해서 해제할 수 있으면 DFB로 분류한다.
Double Free Bug
ptmalloc2
에서 발생하는 버그이며, 공격자가 임의 주소 쓰기/읽기, 코드 실행 등으로 활용될 수 있다.
DFB는 보통 코드상에 아래 방법으로 살펴볼 수 있다.
- dangling pointer가 생성되는가?
- 이를 대상으로 Free 호출이 가능한가?
이 double free bug로는 duplicated free list 생성이 가능하다. ptmalloc2
에서 Free list의 각 청크는 fd와 bk로 연결된다.
- fd
- 자신보다 나중에 해제된 청크
- bk
- 자신보다 먼저 해제된 청크
해제된 청크는 각각의 공간을 그냥 데이터 저장에만 사용한다. 때문에 어떤 청크가 Free list에 중복되어 포함된다면, 첫번째 재할당에서 fd와 bk를 조작하여 임의 주소를 삽입할 수 있다.
// Name: dfb.c
// Compile: gcc -o dfb dfb.c
#include <stdio.h>
#include <stdlib.h>
int main() {
char *chunk;
chunk = malloc(0x50);
printf("Address of chunk: %p\n", chunk);
free(chunk);
free(chunk); // Free again
}
위 코드에서 malloc으로 청크 꺼내오고, 이 청크 free를 두 번 진행한다.
Mitigation for Tcache DFB
static
패치된 Tcache의 코드를 살펴보자.
tcache_entry
typedef struct tcache_entry {
struct tcache_entry *next;
+ /* This field exists to detect double frees. */
+ struct tcache_perthread_struct *key;
} tcache_entry;
해당 구조체에 double frees를 탐지하기 위한 key 포인터가 추가되었다. 이 구조체는 해제된 Tcache 청크들이 갖는 구조이다. fd가 Next로 대체된다.
tcache_put
tcache_put(mchunkptr chunk, size_t tc_idx) {
tcache_entry *e = (tcache_entry *)chunk2mem(chunk);
assert(tc_idx < TCACHE_MAX_BINS);
+ /* Mark this chunk as "in the tcache" so the test in _int_free will detect a
+ double free. */
+ e->key = tcache;
e->next = tcache->entries[tc_idx];
tcache->entries[tc_idx] = e;
++(tcache->counts[tc_idx]);
}
해제한 청크를 tcache에 추가하는 함수가 tcache_put이다. 왼쪽에 +로 된 부분을 보면, e->key에는 tcache를 넣도록 되어 있다. 이때 tcache의 타입은 key의 포인터로 선언했던 tcache_perthread_struct이다.
tcache_get
tcache_get (size_t tc_idx)
assert (tcache->entries[tc_idx] > 0);
tcache->entries[tc_idx] = e->next;
--(tcache->counts[tc_idx]);
+ e->key = NULL;
return (void *) e;
tcache_get은 tcache에 연결된 청크를 재사용할 때 사용하는 함수이다. e->key를 Null로 설정한다.
_int_free
청크를 해제할 때는 위 _int_free 함수를 호출한다. 이부분이 중요한데, 청크의 Key값을 참조하여 tcache값이 담겨 있으면 DF로 취급하여 abort시킨다.
+ if (__glibc_unlikely (e->key == tcache))
+ {
+ tcache_entry *tmp;
+ LIBC_PROBE (memory_tcache_double_free, 2, e, tc_idx);
+ for (tmp = tcache->entries[tc_idx];
+ tmp;
+ tmp = tmp->next)
+ if (tmp == e)
+ malloc_printerr ("free(): double free detected in tcache 2");
+ /* If we get here, it was a coincidence. We've wasted a
+ few cycles, but don't abort. */
+ }
Tcache Duplication
위에서 살펴보았던 보호 기법을 우회하여 트리거하는 코드이다.
// Name: tcache_dup.c
// Compile: gcc -o tcache_dup tcache_dup.c
#include <stdio.h>
#include <stdlib.h>
int main() {
void *chunk = malloc(0x20);
printf("Chunk to be double-freed: %p\n", chunk);
free(chunk);
*(char *)(chunk + 8) = 0xff; // manipulate chunk->key
free(chunk); // free chunk in twice
printf("First allocation: %p\n", malloc(0x20));
printf("Second allocation: %p\n", malloc(0x20));
return 0;
}
free를 하고, chunk+8이 Key의 위치이기 때문에 이부분을 Null로 바꿔준다. 이후에 free를 하면 double free bug를 트리거할 수 있다.
21 Aug 2025
•
Web3
위 글 읽어볼거임
https://www.mdpi.com/1911-8074/18/1/38
내가 이해할 수 있게 의역하였고, 내용도 많이 축약했다.
abstract
DeFi는 탈중앙화된 금융 시스템을 말한다. Web3에서 유동되는 가상자산이기에 이 DeFi에서의 Risk management 필요성이 대두되었다. 해당 논문에서는 주요 추적 플랫폼을 평가하기 위한 유틸리티 기반 프레임워크를 제안한다. 설문 조사 및 인터뷰를 결합하여 플랫폼 기능을 식별하고, found significant differences across these platforms with respect to compliance features, advanced analytics, and user experience. 여기서 플랫폼 간의 상당한 차이점이 있었으며, 우리는 유틸리티 기반 모델을 사용하여 priority, risk management needs를 조정할 수 있다.
Introduction
DeFi는 cryptocurrency sectors에서 가장 빠르게 성장하는 분야이다. 디파이 플랫폼은 사용자가 digital assets을 빌리고, 빌려주고, 거래하고, 스테이킹할 수 있게 해준다. 디파이는 많은 이점이 있지만, 몇가지 위협도 존재한다. smart contract vulnerable areas, price swings, market manipulation, liquidity issues, and management uncertainty 등이 존재한다. flash load attack이나 smart contract vulnerabilities 등 많은 손실이 존재 했기에 DeFi transactions 추적과 possible threats를 찾는 risk management tools and systems가 필요하다. 게다가 이 decentralized struture은 규제 감독을 복잡하게 하고, AML, KYC compliance를 복잡하게 한다.
그동안 DeFi에서 리스크 관리를 위해 numerous DeFi tracking systems and plaforms이 등장하였다. 이것은 디파이 환경에서 트랜잭션을 트래킹하고, 포트폴리오를 관리하는 적절한 Tool을 선택함으로써 potential risks and possibilities를 이해시킬 수 있다.
이 DeFi risk와 관련해서 다양한 연구가 진행되고 있는데, smart contract audit, liquidity management 등이 급히 논의되고 있다. 근데 이제 논문에서는 DeFi 프로토콜에서 transactional tracking과 anomaly detection에 대한 연구가 거의 없다고 한다. 때문에 해당 논문이 제시한 기여점은:
- utility-based evaluation model 제안 : 정확성과 응답성을 결합한 새 프레임워크를 제안한다. 이때 정확성과 응답성은 각각 의심스러운 활동을 얼마나 오탐 없이 잡아내는지, 얼마나 real-time으로 경고가 나오는지이다.
- DeFi leading analytic platforms에 대한 비교 분석 수행 : Chainalysis, Elliptic, Nansen, Dune Analytics, DeBank, Etherscan에 대해 compliance tools, advanced analytics, user interface 측면에서 평가하였다.
- 설문조사와 인터뷰를 합하여 사용자 선호도 조사
이전 연구에 대한 언급은 내가 공부하려는 AML, KYC 등에 대해서만 짚었다.
해당 논문의 핵심 과제는 다음 질문과도 같다. How can risks in DeFi transactions be effectively managed(거래를 효과적으로 관리하는 방법), and what role do existing platforms play in mitigating these risks to ensure the stability, security, and adoption of decentralized financial systems(기존 플랫폼이 리스크 완화..등 다양한 방면에서 어떤 역할을 하는지)?
AML, KYC는 블록체인의 거래가 본질적으로 가명이기에 준수하기 어렵다. 이외에도 스마트 컨트랙트에서, DeFi 환경에서 여러 취약점이나 위협들이 논의되고 있다. 실제로도 최근 BadgerDAO 등 DeFi에서 일어난 공격들을 선제적으로 관리할 수 없었다.
DeFi에서 이런 포괄적 리스크 관리 프레임워크가 필요한 이유는 :
- DeFi 프로토콜은 인터렉션이 촘촘하기에 생태계 안정성이 중요하다.
- 사용자 자금이 보장되어야 하기 때문이다(번역 이게 맞나)
- DeFi에서는 사용자 신뢰가 매우 중요하다.
그동안의 리스크 관리는 매우 단편적이다. 전체 범위의 DeFi risk를 관리할 수 있는 프레임워크를 만드는 것이 관건이다.
Overview of DeFi
해당 단락은 내가 필요한 부분만 발췌해서 작성하였다.
DeFi 생태계에서 lending, borrowing, trading, staking, liquidity provision에 대한 서비스를 제공한다. 그리고 DeFi 프로토콜에서는 중개인 없이 앞서 나열한 서비스를 제공할 수 있도록 lending and borrowing arrangements를 구성한다. 시장 수요와 공급이 interest rates를 만든다. Lending protocol인 Aave, Compound, MakerDAO 등은 차용자(borrower)가 담보를 사용하여 암호화폐로 대출 받고 이자를 받을 수 있게 한다.
DeFi는 보통 분산형 거래소(이하 DEX) 간의 거래를 말하며 Uniswap, CurveDAO, PancakeSwap 등이 이에 속한다. 여기서 사용하는 contract는 기존 거래소보다 여러 이점이 있다.
staking은 네트워크 운영하기 위해 암호화폐를 특정 지갑에 Lock up하는 DeFi 기능이다. 자세히는 staking이 주로 PoS 방식 블록체인 네트워크에서 트랜잭션 검증 및 블록 생성을 위한 기능으로 사용된다.
(작성중)투비컨티뉴드..
포스트라고 하기엔 대충이지만
- UTM 설치
- ISO 다운 (필요한 아키텍처로)
- UTM에서 가상환경 생성 후 에뮬레이터 로 설치
이러면 이제 엄청나게 느리지만 amd 우분투를 하나 만들 수 있다.
와 잠만 진짜 충격적으로 느리네.
VScode로 ssh 연결되나 함 보자.
vm에 sudo apt-get install openssh-server
응 실패다 dkpg 오류 뜨는데.. 너무 느려서 트러블슈팅 하는 것보다 server로 다시 깔았다. 아예 ssh로만 써야겠다.
참고한 글 : M1M2-환경에서-Pwnable-환경-구성하기
- emulator로 ubuntu server 설치
- 초기 config 설정
- Openssh server 설치
- 설치 다 되면 재부팅을 해야함 -> 이때 iso 파일 꺼내기
- Vscode에 remote ssh extension 설치

- 연결~
하면 되는데 우분투 서버 설치가 너무 오래 걸린다..
다 설치하면 마저 쓰는 걸로
자고 일어나서 다시 실행해보니까 됐다. 포너블 설치할 스크립트 하나 두자
chedahub/pwn_set/blob/main/pwnset20.sh
여기서 코드 가지고 왔다.
#!/bin/bash
export LC_CTYPE=en_US.UTF-8
export LC_ALL=C.UTF-8
source ~/.bashrc
cd ~
sudo apt update -y
sudo apt-get update -y
# vim
sudo apt-get install vim -y
# gdb, gcc
sudo apt-get install gdb -y
sudo apt-get install gcc -y
sudo apt-get install gcc-multilib g++-multilib -y
echo "set disassembly-flavor intel" >> ~/.gdbinit
# netcat
sudo apt-get install netcat -y
# git
sudo apt-get install git -y
# python3, pwntools
sudo apt-get install python3 python3-pip python3-dev libssl-dev libffi-dev build-essential -y
sudo apt-get install libc6-i386 libc6-dbg make -y
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade pwntools
sudo apt-get install libcapstone-dev -y # to rop
# pwndbg
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
./setup.sh
cd ..
# checksec
git clone https://github.com/slimm609/checksec.sh
sudo cp checksec.sh/checksec /usr/local/bin/
# ROPgadget
sudo pip3 install ropgadget
# OneGadget
sudo apt-get install ruby-full -y
sudo gem install one_gadget
# seccomp-tools
sudo gem install seccomp-tools
# pwninit
sudo apt install openssl
sudo apt install pkg-config
sudo apt-get install cargo -y
sudo apt-get install -y liblzma-dev
cargo install pwninit
sudo cp ~/.cargo/bin/pwninit /usr/local/bin/
# visual studio code
sudo apt-get install curl -y
sudo sh -c 'curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg'
sudo sh -c 'echo "deb [secarch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'
sudo apt update
sudo apt install code -y
이럼 또 한참 걸린다(이런미친)
자 오류가 떴다. 고치자 ㅋ
$sudo rm /var/lib/apt/lists/lock
$sudo rm /var/cache/apt/archives/lock
$sudo rm /var/lib/dpkg/lcok*
$sudo dpkg --configure -a
$sudo apt update
이랬더니 오류 났다. nano로 주석 처리 해야 된대서
sudo nano /etc/apt/sources.list
이러면 nano 창이 뜰 텐데 deb file:/cdrom
으로 시작하는 줄을 주석처리를 한다(#으로 처리하면 된다) 이후에 다시 시스템 업데이트를 하자.
sudo apt update
sudo apt upgrade -y
이러고 다시 스크립트 실행 ㄱㄱ
설치는 됐는데 1804도 일단 필요할 거 같아서 얘는 도커로 넣으려고 한다. ‘
https://github.com/superkojiman/pwnbox
이걸로 가지고 왔다.
git clone https://github.com/superkojiman/pwnbox
sudo apt install jq
sudo ./run.sh my_ctf
하고 열심히 기다리고 다시 또 ip addr 가져와서 ssh 연결해주면 된다.
재접속 및 삭제는 아래
sudo docker start my_ctf && ./my_ctf-attach.sh
sudo ./my_ctf-stop.sh