전체 글 58

[SCTF 2023] BOF103 - writeup

또버플로우 문제. 이번에는 함수의 매개변수를 활용해야 한다. 코드부터 보자. #include #include unsigned long long key; void useme(unsigned long long a, unsigned long long b) { key = a * b; } void bofme() { char name[16]; puts("What's your name?"); printf("Name > "); scanf("%s", name); printf("Bye, %s.\n", name); } int main() { system("echo 'Welcome to BOF 103!'"); bofme(); return 0; } 2번 문제와 마찬가지로 전역변수에 '/bin/sh' 문자열을 입력해야하는데, 해..

War Game/CTF 2023.08.22

[SCTF 2023] BOF102 - writeup

다음 문제도 마찬가지로 스택에서의 BOF를 다룬 문제이다. 한 문제만에 난이도가 꽤 올라가긴 했는데, 역시 코드부터 살펴보도록 하자. #include #include char name[16]; void bofme() { char payload[16]; puts("What's your name?"); printf("Name > "); scanf("%16s", name); printf("Hello, %s.\n", name); puts("Do you wanna build a snowman?"); printf(" > "); scanf("%s", payload); printf("!!!%s!!!\n", payload); puts("Good."); } int main() { system("echo 'Welcome t..

War Game/CTF 2023.08.22

[SCTF 2023] BOF101 - writeup

Hackers' Playground로 명칭이 변경되었지만, 익숙한 SCTF 명칭으로 사용하도록 하겠다. 간단한 Stack Buffer Overflow 문제이다. scanf, strcpy와 같이 사용자로부터 입력받은 값을 변수에 저장할 때에, 값을 저장하는 변수의 가용 공간을 고려하지 않고 사용자의 입력값 전체를 대입하는 과정에서 할당받은 범위를 벗어나 그 이후의 영역에까지 값을 작성해버리는 취약점이다. 먼저 코드를 살펴보도록 하자. #include #include #include #include void printflag(){ char buf[32]; int fd = open("/flag", O_RDONLY); read(fd, buf, sizeof(buf)); close(fd); puts(buf); } ..

War Game/CTF 2023.08.22

[Rev] Abex' CrackMe 1 w/ DLL Injection

리버싱 초심자들에게 필수 코스인 Abex CrackMe 1단계 (CD ROM 그 문제)를 대상으로 간단한 DLL Injection을 이용하는 방법으로 해결한 풀이를 발견해 정리해봤다. DLL Injection을 처음으로 시도해보는 컨셉이기에 DLL 내용 자체가 대단하진 않고 이러한 방식으로 DLL을 짜서 공격을 수행해볼 수 있다 정도의 체험을 해봤다는 느낌으로 봐주길 바란다. 0x40103D에 로드된 함수의 실행 결과에 따라 ESI 값과 비교하여 성고 또는 실패 다이얼로그를 띄우는 코드로 점프하는 분기가 0x401026에 담겨있다. DLL을 이용해 저 부분의 코드를 조작할 수 있다면 디버거에 의한 개입 없이 프로그램을 무력화할 수 있게된다. 물론 이 경우, DLL의 목표는... 0x401026의 opco..

War Game/misc 2023.05.22

[Network] 스위치와 브릿지를 기깔나게 구분해보자

CS 분야에 엄지발가락이라도 담가봤다면 아마 허브와 스위치를 구분할 줄 모르는 사람은 없을 것이다. 통상적으로 허브를 말하면 '더미 허브'를 의미하는 경우가 일반적인데, 이러한 더미 허브는 ARP와 같은 프로토콜을 이용하지 못 하기 때문에 허브는 자기 자신과 연결된 장비들의 MAC 주소를 저장하지 않고 있다. 때문에 패킷이 들어온 포트를 제외한 나머지 모든 포트로 이를 브로드캐스트하는 방식으로 작동한다. 반면에, 스위치는 허브보다 똑똑하게 동작하는 친구이다. 여기에서는 허브와 비교를 위해 동일하게 L2 레벨에서 접근해보자. 스위치는 ARP를 통해 스위치에 연결된 장비들의 MAC 주소와 포트를 연결지어 기억하고 있다. 때문에 패킷이 들어게 되면 사전에 작성해둔 ARP Table을 바탕으로 패킷의 수신지와 ..

Notes/Network 2023.05.19

함수 호출 규약 정리 Function Calling Convention

어느 함수에서 다른 함수를 호출하는 상황을 생각해보자. 기존 함수에서 현재 스택의 상태로 복귀할 수 있도록 현재의 스택 포인터가 가리키고 있는 위치를 기억하고(Caller의 스택 프레임 상태), 리턴 주소(Caller가 Callee를 호출한 주소값)를 어딘가에 저장해둘 필요가 있겠다. 함수 호출 규약이란 간단히 말해 이러한 정보를 어떻게 저장하고 로드할 것인가에 대한 약속이라고 생각하면 된다. 물론 이러한 과정은 컴파일러에 의해 처리되는 것이 일반적이기 때문에 사용자는 컴파일러의 configuration에서 본인이 원하는 규약을 선택해주기만 하면 된다. ( MSVC기준으로 언어별로 자동 선택되는 것인줄 알았는데, 컴파일러에서 컴파일중인 장치의 아키텍처를 보고 적절한 호출 규약을 알아서 선택하게 된다고 한..

Notes/System 2023.05.18