CHAPTER 01 자료구조 개요
·
Data Structure
1.1 소프트웨어와 자료구조 소프트웨어 : 특정 기능을 담당하는 단일 또는 복수의 프로그램 프로그램은 처리할 대상인 자료(데이터)와 처리 절차인 알고리즘으로 구성되며, 프로그램을 설계하는 작업을 프로그래밍 또는 코딩이라고 부른다. ​ 자료구조 : 프로그램을 통해 대량의 데이터를 효과적으로 저장하고 처리하기 위한 방법론 또는 자료구조 그 자체 형태에 따라 선형 자료구조(배열, 스택, 큐, 리스트)와 비선형 자료구조(트리, 그래프), 구현 방법에 따라 배열 방식과 연결 리스트 방식으로 구분 그 외 정렬, 탐색, 해싱 등의 관련 알고리즘도 자료구조의 학습 범위에 포함된다. 1.2 소프트웨어 개발 주기 소프트웨어는 요구사항, 문제 분석, 기능 설계, 구현, 검증의 5단계에 걸쳐 개발되고 단계를 순환하면서 개선된..
백준 2164 카드 2 (실버 4)
·
BOJ/Python
문제 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다. 예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다. N이 주어졌을 때, 제일 마지막에 남게 되는 카드를 구하는 프로..
백준 1654 랜선 자르기 (Class 2 실버 3)
·
BOJ/Python
문제 집에서 시간을 보내던 오영식은 박성원의 부름을 받고 급히 달려왔다. 박성원이 캠프 때 쓸 N개의 랜선을 만들어야 하는데 너무 바빠서 영식이에게 도움을 청했다. 이미 오영식은 자체적으로 K개의 랜선을 가지고 있다. 그러나 K개의 랜선은 길이가 제각각이다. 박성원은 랜선을 모두 N개의 같은 길이의 랜선으로 만들고 싶었기 때문에 K개의 랜선을 잘라서 만들어야 한다. 예를 들어 300cm 짜리 랜선에서 140cm 짜리 랜선을 두 개 잘라내면 20cm는 버려야 한다. (이미 자른 랜선은 붙일 수 없다.) 편의를 위해 랜선을 자르거나 만들 때 손실되는 길이는 없다고 가정하며, 기존의 K개의 랜선으로 N개의 랜선을 만들 수 없는 경우는 없다고 가정하자. 그리고 자를 때는 항상 센티미터 단위로 정수길이만큼 자른다..
[CodeEngn] Basic RCE L04
·
Hacking/Reversing
exe 파일을 디버깅하지 않고 실행해 보았다. 이번엔 IDA에서 디버깅을 했다. 함수의 기능을 확인할 수 있었다. 이제 IDA에서 디버깅해보자. basic RCE 3처럼 Function name에서 확인하려 했으나 함수의 이름이 나타나 있지 않았다. 그래서 함수의 import 화면을 실행했다. 실행해보니 의심되는 함수 IsDebuggerPresent 함수가 있어 더블클릭한 뒤 x를 눌러 실행했다. jz에 중단점을 두고 실행해 보았다. EAX(return)값이 1이고, 분기점이 왼쪽으로 가 call이 실행되어 "디버깅 당함"이 출력되는 것을 확인할 수 있었다. jz 중단점 전에 EAX 값을 0으로 바꿔서 확인해 보았다. 오른쪽 분기점으로 실행되어 예상했던 대로 "정상"이 출력되는 것을 확인할 수 있었다. ..
[CodeEngn] Basic RCE L03
·
Hacking/Reversing
문제 파일을 실행해 보았다. 원래는 실행 파일이 있는 폴더에 MSVBVM50.dll 파일을 설치한 뒤에 실행하면 된다고 하는데, 나는 실행이 되지 않았다. https://boksbooks.tistory.com/67 Msvbvm50.dll 다운로드 및 오류 해결법 Msvbvm50.dll Msvbvm50.dll 에러가 발생하면 문제가 생긴 파일이 있는 위치에 파일을 복사하여 넣거나 파일을 새로 생성해야 합니다. 여기에서는 파일을 다운로드 받아서 시스템 폴더에 넣거나 다이 boksbooks.tistory.com 해당 글을 참고해도 실행이 되지 않아서 코드를 훑어보아 해결하기로 했다. 스트링 비교 함수는 두 글자를 비교(cmp)를 하고 Error 혹은 Success 문자를 출력하는 분기점(jz)을 포함하고 있을..
[CodeEngn] Basic RCE L02
·
Hacking/Reversing
다운받아 실행해 보려 했으나 역시 실행파일이 손상되어 실행이 되지 않았다. 따라서 HxD를 통해 바이너리 코드를 분석해 보았다. 파일이 손상되지 않았다면 함수의 이름이 되었을 것으로 추청되는 흔적들을 찾을 수 있었다. Nope과 Yeah로 조건문이 있었을 것으로 미루어 짐작해 본다. CrackMe#1과 Yeah, you did it! CrackMe#1이 있는 것으로 보아 CrackMe#1과 조건문을 통해 비교하는 것 같다. 그 뒤를 보면 비밀번호로 추정되는 것을 확인할 수 있다. 그 아래도 확인하면 Rule도 볼 수 있다. It's very easy라고 적혀있는 부분이 조금 ...ㅋㅋㅋ 성공했다
[CodeEngn] Basic RCE L01
·
Hacking/Reversing
IDA를 통해 파일을 열어보기 전에 1.exe를 실행해 보았다. 아무런 작업을 하지 않은 상태에서 확인을 눌러 보았다. IDA를 통해 실행한 뒤에 GetDriveTypeA의 값을 입력받는 곳에서 수정을 통해 값을 CD-ROM에 해당하는 것으로 입력하면 될 것 같다. IDA 실행 화면이다. GetDriveTypeA 함수를 실행한 뒤에 eax와 esi를 비교해서 둘이 같은지를 살펴본다. 둘이 같다면 Ioc_40103D로 이동해서 CD-ROM으로 인식한다. GetDriveTypeA 함수를 찾아보았다. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getdrivetypea GetDriveTypeA function (fileapi.h)..
[Dreamhack] Reverse Engineering Stage 5 - Exercise: Helloworld
·
Hacking/Reversing
서론 간단한 예제인 HelloWorld.exe를 분석해보는 실습이다. 예제는 1초를 대기하고 Hello, world!를 출력하는 프로그램이다. /* File: hello-world.cpp Build opts: - /MT -> Library Static Linking - /DYNAMICBASE:NO -> Disable ASLR - /od -> Disable Optimization */ #include #include char* str; int main() { int delay = 1000; Sleep(delay); // 1000ms(1초)를 대기합니다. str = (char*)"Hello, world!\n"; printf(str); return 0; } 정적 분석 IDA로 파일 열기 신뢰할 수 없는 프로그..
[Dreamhack] Reverse Engineering Stage 5 - Tools: IDA
·
Hacking/Reversing
IDA The Interactive Disassembler (IDA) : Hex-Rays 사에서 제작한 디스어셈블러이다. IDA의 메인 기능은 디스어셈블이지만 이 외에도 여러 환경에서의 디버깅과 다양한 아키텍처 디컴파일과 같이 여러가지 기능을 제공한다. 이 때문에 바이너리를 분석해야 하는 리버스 엔지니어링 업무에는 대다수 IDA를 이용한다. IDA에는 다양한 라이센스가 존재하는데 기업에서 보편적으로 사용하는 IDA Pro는 대략 천만원에서 이천만원 사이의 금액대를 갖는다. 리버스 엔지니어링을 처음 공부하는 개인 이용자가 지불하기에는 부담이 큰 금액이기 때문에 Hex-Rays 사는 IDA Freeware를 제공한다. IDA Freeware는 x64 아키텍처에 한해 디컴파일 기능을 지원하며, 상업적 목적 이..
순환 이중 연결 리스트 구현
·
Data Structure
보호되어 있는 글입니다.
백준 2805 나무 자르기 (Class 2 실버 2)
·
BOJ/Python
문제 상근이는 나무 M미터가 필요하다. 근처에 나무를 구입할 곳이 모두 망해버렸기 때문에, 정부에 벌목 허가를 요청했다. 정부는 상근이네 집 근처의 나무 한 줄에 대한 벌목 허가를 내주었고, 상근이는 새로 구입한 목재절단기를 이용해서 나무를 구할것이다. 목재절단기는 다음과 같이 동작한다. 먼저, 상근이는 절단기에 높이 H를 지정해야 한다. 높이를 지정하면 톱날이 땅으로부터 H미터 위로 올라간다. 그 다음, 한 줄에 연속해있는 나무를 모두 절단해버린다. 따라서, 높이가 H보다 큰 나무는 H 위의 부분이 잘릴 것이고, 낮은 나무는 잘리지 않을 것이다. 예를 들어, 한 줄에 연속해있는 나무의 높이가 20, 15, 10, 17이라고 하자. 상근이가 높이를 15로 지정했다면, 나무를 자른 뒤의 높이는 15, 15..
백준 10773 제로 (실버 4)
·
BOJ/Python
문제 나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다. 재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다. 재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다. 재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자! 입력 첫 번째 줄에 정수 K가 주어진다. (1 ≤ K ≤ 100,000) 이후 K개의 줄에 정수가 1개씩 주어진다. 정수는 0에서 1,000,000 사이의 값을 가지며, 정수가 "0" 일 경우에는 가장 최근에 쓴 수를 지우고, 아닐 경우 해당 수를 쓴다. 정수가 "0"일 경우에 지울 수 있는 수가 있음을 보장할..