시스템 해킹 한 번 했었는데, 그때 공부를 했어도 제대로 이해 못하고 넘어간 부분이 많아서 이번 방학 때 다시 공부하기로 했다. 이번에는 꼭 이해할 수 있으면...!이미 아는 개념들은 빠르게 넘어가고 이해 안 되거나 중요하다고 생각되는 영역들만 보고 넘어가겠다.Shel

가장 많이 들었고, 그나마 이해를 하고 있는 영역이다.Stack Buffer Overflow: 스택의 버퍼에서 발생하는 오버플로우Buffer: 데이터가 목적지로 이동되기 전에 보관되는 임시 저장소Buffer Overflow: 할당된 버퍼의 크기를 넘어서 데이터 저장 -

Stack Buffer Overflow를 막는 보안기법이다. 스택 카나리를 함수 시작할 때 버퍼와 반환 주소 사이에 저장하고, 함수가 끝날 때 카나리 값이 변조됐는지 확인한다. Stack Canary 1.1 개념 함수 시작과 끝에 위의 코드가 추가됨을 알 수 있다.

개념 1.1. NX(No-eXecute) 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법 참고: NX = XD(인텔, eXecute Disable), NX(AMD), DEP(윈도우, Data Execution Prevention), X

개념 1.1. PIC(Position-Independent Code) 메모리의 어느 주소에 적재되어도 코드의 의미가 훼손되지 않는 코드. (ex) 공유 오브젝트) 그래서 pic은 상대참조를 한다. 그러면 바이너리가 무작위 주소에 매핑돼도 제대로 실행될 수 있다. 1

Out of Bounds배열의 속성: 연속된 메모리 공간을 차지하며 그 크기는 (요소의 개수 \* 요소 자료형의 크기)배열의 길이: 요소의 개수OOB: 인덱스 값이 음수이거나 배열의 길이를 벗어날 때 발생.임의 주소 읽기임의 주소 쓰기out_of_bound2.1. 보안

개념Format String Bug(FSP): 포맷 스트링 함수를 잘못 사용하여 발생하는버그printf, scanf, fprintf, fscanf, sprintf, sscanf처럼 함수 이름이 f(formatted)로 끝나고, 문자열을 다루는 함수들은 포맷 스트링을 처

개념Memory allocator프로세스는 실행 중에 메모리를 동적으로 할당하고, 할당한 메모리를 쓰고 나면 해제하는데 이 과정이 매우 빈번하게 일어남.그래서 운영체제의 Memory Allocator는 이 과정이 빠르고 메모리 낭비 없이 이루어지도록 구현된다.리눅스는

개념 Double Free Bug(DFB): 같은 청크를 두 번 해제할 수 있는 버그 이를 활용하면 duplicated free list를 만드는 것이 가능한데, 이는 청크와 연결리스트의 구조 때문에 가능하다. free list의 각 청크들은 fd, bk로 연결된다.

후 드디어 double free bug를 이해하고 넘겼다. 중간에 여행 다녀오느라 공백이 길어서 다시 이해하는데 시간을 많이 쓰기도 했지만... 겁먹지 않고 일단 내가 아는대로 해결해봐야 하는 것 같다.

삘 받은 김에 쭉 하자개념Injection: 악의적인 데이터를 프로그램에 입력하여 실행되도록 하는 방법Command Injection: 명령어를 실행해주는 함수를 잘못 사용하여 발생하는 취약점. 인젝션 중에서도 사용자의 입력을 시스템 명령어로 실행하게 하는 것1.1.

후...드디어 마지막이다2023년부터 시작해서 2025년에 되어서야 끝났지만, 2년의 기간동안 많이 배우고 성장한 것 같아서 나름 뿌듯하다! ^^개념로컬 파일 시스템에 접근하는 서비스를 제공할 때는 접근할 수 있는 파일의 경로에 제한이 있어야 한다. path trave

, a2: s(input), a3: s의 길이a3의 길이를 8로 나눈 나머지에 따라 switch문을 통과한다.그대로 구현하면 된다.각 label이 복잡해보이지만 잘 보면 모두 일정한 형태를 띄고 있다.si에 어떤 값을 xo

main이번 문제는 추가 함수가 main에 없다.문제에서 flag_enc 함수를 실행시키라고 했으니 찾아보자.flag_encflag_enc를 어디서 실행하는지 찾아보니main에서 실행이 된다. 그런데 왜 디컴파일을 하면 c 코드에는 없을까?var_4는 for문에서 i다

main문제 설명처럼 func_0부터 func_927까지 순차적으로 실행시켜서 플래그를 얻으면 된다.근데 어떻게...?gdb_script이전에 배운 gdb_script에 대해서 기억이 났다. (감사합니다, 선배님...)받은 자료들 다시 보면서 공부하는데 머리 터지는 줄

main저장되어 있지 않다.함수 내에 들어가도 딱히 뭐가 없다.x32랑 x64로는 열리지 않는다.gdb동적디버깅을 할 수단이 pwndbg뿐이므로 0x401612에 bp를 걸고 실행한다.그러면 이렇게 rax에 저장이 된 것을 볼 수 있다.

main얘도 마찬가지로 함수를 호출하고 그 리턴값으로 플래그를 넘긴다.하지만 ida로는 확인이 불가하다.보통 함수의 리턴값은 레지스터(rax)에 저장되어 전달된다.리턴 직후에 bp를 걸고 확인하면 rax에 플래그가 전달된 것을 볼 수 있다.

main현실시간으로 1년이 지나야 flag를 출력해주는 프로그램이다. 이를 패치하여 1년이 지나지 않아도 플래그를 출력하도록 해야 한다.0x2237 = 24\*365 즉, 1년만큼의 시간이 지나면 while문을 빠져나온다.patchwhile문 조건을 <= 0으로

main(ida로 디컴파일 했을 때 명칭이 main도 아니였다. 임의로 수정한거다)저 함수들을 몇 개 열어봤는데 아무리 봐도 분석하라고 준 건 아닌 것 같다.그래서 일단 몇 개를 시험삼아 넣어봤다. 왜냐하면 else문에서 틀린 답을 wrong이라고 주기 때문에 힌트를
main 셔플된 문자열을 출력해주고 원래 문자열과 입력받은 문자열을 비교한 후 플래그를 출력해준다. 셔플방식은 다음과 같다. gdb gdb에서 s[16] = 0에 bp를 걸고 s를 확인했다. 그런데 이 방식으로 하면 segmentation fault가 발생한다

main10개의 스테이지를 해결해야 flag를 얻을 수 있다.스테이지 클리어 여부는 sub_1407에서 결정한다. (check로 수정)check저 INFO 값이 ptr의 값이다.이 함수에서 ptr이 쪼개진다.찾아보면 (little-endian 기준)byte1: 뒤에서
main check 함수를 통해 input을 확인한다. input의 길이는 64 check 이 조건들을 다 만족시키면 check_not이 리턴된다. check\_not check\_add check\_dec check\_mul check\_la 이 함수

main내가 입력할 수 있는 건 seconds. 알맞은 seconds를 입력하면 get_flag 함수가 실행된다.문제는 rand()값을 어떻게 구하느냐이다.첫 번째 if문에서 플래그의 앞자리 28개를 출력하고, 두 번째 if문에서 플래그의 뒤 36자리를 출력한다.각각에
mainbyte_40DF랑 byte_413F 모두 값이 저장되어 있지 않아서 벙찔 수 있지만 메모리를 살펴보면0x40A0: rot00x40DF: byte_40DF = rot630x4100: result00x413F: byte_413F = result631단계2단계3단계
mainfuncexploit.py

main문제에서 프로그램이 잠을 자서 결과값을 얻을 수 없다고 한다.결과값을 우리가 구하는게 아니라 잠을 못 자게 프로그램을 수정해야 한다.sleep모든 함수들을 열어보면 sleep을 가진 딱 하나의 함수를 찾을 수 있다.호출: sub_1552 -> sub_14D2저
main encode 함수를 역연산하여 raw를 얻어야 한다. encode 여기서 핵심은

암호화 과정을 복호화해야 한다.mainv5와 v6을 n.txt를 통해 받아옴. sub_12FE를 통해 얻은 값을 곱해 v10을 생성. n1 = v10 (v5 바탕으로 생성)n2는 v6 바탕으로 생성flag를 s에 저장. encode 함수를 통해 변환 후 out.bin에

flag를 그리는 루틴을 분석하고 가려진 flag가 보이게 해야 한다.exe 실행idaida로 확인하면 일부 함수들이 draw line 함수를 호출한다.어디서 호출하나 살펴보니왠지 저 2B80을 다 없애면 될 것 같다.\-> 실제로 다 nop으로 교체하고 실행하면 가려

Python(pickle)의 Deserialize 취약점을 이용해 플래그를 획득하라고 한다.https://2nan.tistory.com/109 (pickle 모듈) : 파이썬 자료형을 그대로 파일에 저장하는 모듈deserialize 취약점이란?<참고>ht
근본 중의 근본 문제다. 너무 반갑다.사실 다른 어려운 문제들도 시도해봤었는데 손도 못 대겠고 일주일씩 시도해도 감이 안 와서 1단계부터 차근차근 푸는 중이다.어렵다고 느껴진다면 쉬운 것부터 차근차근 해보면 좋겠다. 솔직히 그동안 해킹이 어렵고 멀게만 느껴졌던게 어려운
mainbase 배열을 랜덤으로 만들고 compar 함수에 따라서 정렬한 다음에 해당 결과값을 똑같이 입력해주면 된다.comparsub_16A3벡터 v = (x,y,z)벡터 u = (a,b,c)둘의 내적값을 벡터 v, u의 크기로 나눈 것과 같다. 즉, 두 벡터 사이의
mainconvertP~Y: 0~9F~O: 0~9<~E: 0~9그 외: -0X28('(')swap_strings0와 s\[arr2i] swapxor단순 xor문제 난이도를 올리는 요소arr1이 길이가 23이라고 해서 arr2도 그럴 것이라는 생각을 버려라arr2에
main드림핵 사이트에서 참고자료를 열면 암호화 해시 함수가 뜬다.https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%99%94\_%ED%95%B4%EC%8B%9C\_%ED%95%A8%EC%88%98참고해서 함수들을 살
main 입력값을 check 함수를 통해 확인한다. check 입력값의 길이는 8의 배수 (null까지 포함해서) 8바이트씩 잘라서 change 함수를 이용한다. 마지막에는 unk 값과 비교한다. change python으로 정리하면 역연산
이 문제는... 제목 보자마자 기억이 났다.작년 여름방학 동아리 과제였는데 못 풀었었다. 풀이를 봐도 이해가 안 됐었는데 그때보다는 발전했을지! 검증해보자 :)maintable 파일을 읽어서 table 변수에 저장input 파일을 읽어서 input 변수에 저장chang

문제 풀이 핵심 int -> hex 변환 MD5 hash의 구조를 아는가? main md5_hash라는 걸 알아내는게 핵심이었다. md5_hash 처음에 v5, v6 등의 변수들은 int 형으로 저장되어 있다. 이를 hex로 변경 시, 어디서 많이 본 값들이 나