본문 바로가기

전체 글267

[BOJ] 2022 SISS 2학기 스터디 - 4주차 #5568 : 카드 놓기 (자료구조 Silver 4) [문제] [코드 및 결과] #include #include #include using namespace std; int n, k; bool check[10]; vector v; set s; void solve(int cnt, string str) { if (cnt == k) { s.insert(stoi(str)); } for (int i = 0; i < n; i++) { if (check[i] == true) { continue; } check[i] = true; string result = str; result += to_string(v[i]); solve(cnt + 1, result); check[i] = false; } } int main() {.. 2022. 10. 2.
[Dreamhack System Hacking Advanced] STAGE 4 - 혼자 실습 보호되어 있는 글 입니다. 2022. 9. 25.
[Dreamhack System Hacking Advanced] STAGE 4 - 함께 실습 Exploit Tech: overwrite _rtld_global 프로그램에서 리턴 명령어를 수행하면 라이브러리와 로더에서 다양한 함수를 호출하면서 정상 종료한다. 이 과정에서 읽고 쓸 수 있는 영역에 존재하는 함수 포인터를 호출하기 때문에 임의 주소 쓰기 취약점이 있다면 해당 포인터를 덮어써서 프로그램의 실행 흐름을 조작할 수 있다. 코드 분석 다음은 이번 실습에서 사용할 코드이다. // Name: ow_rtld.c // Compile: gcc -o ow_rtld ow_rtld.c #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int main() { long addr; long data; int i.. 2022. 9. 25.
[Dreamhack System Hacking Advanced] STAGE 4 Background: _rtld_global 이번에는 프로그램을 종료하는 과정을 이용한 공격 기법을 알아보기에 앞 라이브러리의 코드를 분석하면서 어떤 방식으로 프로세스를 종료하는지 알아보도록 하자. 다음 코드는 종료하는 과정을 알아보기 위한 예제로, 컴파일해두자. // Name: rtld.c // Compile: gcc -o rtld rtld.c int main() { return 0; } _rtld_global __Gl_exit 바로 위에서 컴파일한 예제 코드는 별다른 코드를 실행하지 않고 프로그램을 종료한다. 프로그램을 종료할 때에는 우리가 모르는 많은 코드들이 내부적으로 실행되는데, 디버깅으로 한번 살펴보자. 먼저 다음과 같이 main 함수 내 리턴하는 명령어에 BP를 설정하고, step into를.. 2022. 9. 25.
[BOJ] 2022 SISS 2학기 스터디 - 3주차 #1269 : 대칭 차집합 (자료구조 Silver 4) [문제] [코드 및 결과] #include #include using namespace std; int main() { int N, M, num; map m; cin >> N >> M; for (int i = 0; i > num; if (m[num] == true) { m.erase(num); } else { m[num] = true; } } cout num; if (m[num] == true) { m.erase(num); } else { m[num] = true; } N과 M을 입력받아 N+M만큼 반복하는데, 수를 입력 받을 때마다 이 수가 map에 없으면 m[num]을 true로 바꿔주고, 이미 그 값이 tr.. 2022. 9. 25.
[Dreamhack System Hacking Advanced] STAGE 3 - 혼자 실습 보호되어 있는 글 입니다. 2022. 9. 18.
[Dreamhack System Hacking Advanced] STAGE 3 - 함께 실습 Exploit Tech: Master Canary 마스터 카나리는 로더에서 할당한 TLS 영역에 존재하고, 해당 페이지는 읽기 및 쓰기 권한이 있다. 이번에는 함수에서 카나리를 스택 버퍼에 삽입할 때 참조하는 마스터 카나리를 덮어쓰는 실습을 할 예정이다. 다음은 이번 실습에서 사용할 예제 코드이다. // Name: mc_thread.c // Compile: gcc -o mc_thread mc_thread.c -pthread -no-pie #include #include #include #include void giveshell() { execve("/bin/sh", 0, 0); } void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } vo.. 2022. 9. 18.
[Dreamhack System Hacking Advanced] STAGE 3 Background: Master Canary 스택 카나리에 대해서 깊게 파해쳐보자. 이해가 잘 안되면 기초과정의 Stack Canary 다시 보기..!! Thread Local Storage Thread Local Storage Thread Local Storage (TLS)는 스레드의 저장 공간을 의미한다. ELF 바이너리를 살펴보면, 각각의 목적을 가진 섹션에서 데이터를 관리하고 있다. ex) .text, .data 등... 이와 달리 TLS 영역은 스레드의 전역 변수를 저장하기 위한 공간으로, 로더(Loader)에 의해서 할당된다. 다음은 로더에서 TLS 영역을 할당하고 초기화하는 함수인 init_tls의 코드이다. static void * init_tls (void) { /* Construct .. 2022. 9. 18.
[Dreamhack System Hacking Advanced] STAGE 2 - 혼자 실습 보호되어 있는 글 입니다. 2022. 9. 18.