[Rev] Abex' CrackMe 1 w/ DLL Injection
·
War Game/misc
리버싱 초심자들에게 필수 코스인 Abex CrackMe 1단계 (CD ROM 그 문제)를 대상으로 간단한 DLL Injection을 이용하는 방법으로 해결한 풀이를 발견해 정리해봤다. DLL Injection을 처음으로 시도해보는 컨셉이기에 DLL 내용 자체가 대단하진 않고 이러한 방식으로 DLL을 짜서 공격을 수행해볼 수 있다 정도의 체험을 해봤다는 느낌으로 봐주길 바란다. 0x40103D에 로드된 함수의 실행 결과에 따라 ESI 값과 비교하여 성고 또는 실패 다이얼로그를 띄우는 코드로 점프하는 분기가 0x401026에 담겨있다. DLL을 이용해 저 부분의 코드를 조작할 수 있다면 디버거에 의한 개입 없이 프로그램을 무력화할 수 있게된다. 물론 이 경우, DLL의 목표는... 0x401026의 opco..
[Network] 스위치와 브릿지를 기깔나게 구분해보자
·
Notes/Network
CS 분야에 엄지발가락이라도 담가봤다면 아마 허브와 스위치를 구분할 줄 모르는 사람은 없을 것이다. 통상적으로 허브를 말하면 '더미 허브'를 의미하는 경우가 일반적인데, 이러한 더미 허브는 ARP와 같은 프로토콜을 이용하지 못 하기 때문에 허브는 자기 자신과 연결된 장비들의 MAC 주소를 저장하지 않고 있다. 때문에 패킷이 들어온 포트를 제외한 나머지 모든 포트로 이를 브로드캐스트하는 방식으로 작동한다. 반면에, 스위치는 허브보다 똑똑하게 동작하는 친구이다. 여기에서는 허브와 비교를 위해 동일하게 L2 레벨에서 접근해보자. 스위치는 ARP를 통해 스위치에 연결된 장비들의 MAC 주소와 포트를 연결지어 기억하고 있다. 때문에 패킷이 들어게 되면 사전에 작성해둔 ARP Table을 바탕으로 패킷의 수신지와 ..
함수 호출 규약 정리 Function Calling Convention
·
Notes/System
어느 함수에서 다른 함수를 호출하는 상황을 생각해보자. 기존 함수에서 현재 스택의 상태로 복귀할 수 있도록 현재의 스택 포인터가 가리키고 있는 위치를 기억하고(Caller의 스택 프레임 상태), 리턴 주소(Caller가 Callee를 호출한 주소값)를 어딘가에 저장해둘 필요가 있겠다. 함수 호출 규약이란 간단히 말해 이러한 정보를 어떻게 저장하고 로드할 것인가에 대한 약속이라고 생각하면 된다. 물론 이러한 과정은 컴파일러에 의해 처리되는 것이 일반적이기 때문에 사용자는 컴파일러의 configuration에서 본인이 원하는 규약을 선택해주기만 하면 된다. ( MSVC기준으로 언어별로 자동 선택되는 것인줄 알았는데, 컴파일러에서 컴파일중인 장치의 아키텍처를 보고 적절한 호출 규약을 알아서 선택하게 된다고 한..
[Web] XSS-2
·
War Game/dreamhack.io
'/vuln' 페이지에 접속하면 URL 상에 파라미터로 가 삽입되어 있음에도 팝업창이 표시되지 않는다. XSS를 우회하는 로직이 들어있는 것 같다. 아마 전에 봤던 것처럼 script 태그 사용이 막혀있기 때문일 것으로 생각된다. 결과적으로 "script" 문자열을 포함하지 않으면서 자바스크립트 구문을 삽입할 수 있는 환경을 만들어야 한다. 이전에도 비슷한 문제를 풀어봤으니 가장 먼저 떠오른 것은 img나 iframe 태그였다. 제일 처음 시도해봤던 구문은 아래와 같았다. 아차 싶어 다음과 같이 수정해 다시 시도해봤다. 그러나 여전히 동작하지 않는다. memo 페이지에 접근할 때마다 자동으로 출력되는 "Hello" 스트링만 출력되어 있더라.. 그러던 중에 아래와 같은 사이트를 발견하였다. XSS 필터링을..
[Web] command-injection-1
·
War Game/dreamhack.io
오랜만에 웹으로 돌아왔다. 사실 이름만 보고 포너블인줄 알았는데 파일 받고나서 보니 웹이더라 입력 필드에 바로 때려봤더니 뱉어내고 있다. 브라우저에서 바로 뱉어내는 걸로 보아 HTML 소스를 뜯어보니 알파벳과 로마 숫자만 받아들이고 있다. 해당 부분의 코드를 지워보자. 이제 다시 시도해보자. 얍 음.. 다 푼 것 같은데? FLAG = 'DH{pingpingppppppppping!!}
[pwn] cmd_center
·
War Game/dreamhack.io
또 bof 다. 이제 이 정도 쯤은 식은 죽 먹기지.. 가볍게 왼손만 써서 후딱 풀고 치워버리자. (라고 쓰여있는데요?) 힌트가 적혀있긴 한데.. 무슨 말인지 한 개도 못 알아먹겠다. 코드부터 살펴보자. #include #include #include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); } int main() { char cmd_ip[256] = "ifconfig"; int dummy; char center_name[24]; init(); printf("Center name: "); read(0, center_name, 100); if( !strncmp(cmd_ip, "ifconfig", 8)) { syste..
[pwn] shell_basic -하- (orw 쉘코드를 완성해보자)
·
War Game/dreamhack.io
김피탕은 맛있고 gpt는 신이다. objdump도 GNU 재단에서 관리하는 것으로 알고 있는데 왜 objdump는 프리 인스톨되어있고, objcopy는 내가 알아서 깔아야 하는 것인가.. :/ 내친 김에 직접 작성한 어셈블리어 코드를 쉘 코드로 변환하려면 어떻게 해야하는지도 물어봤다. 이 친구라면 내가 모르는 뭔가 새로운 걸 알려줄 수도 있지 않을까 드림핵 문제 페이지 힌트에 나와있는 것과 동일하게 objcopy와 xxd를 사용해서 변환하는 방식을 추천해주고 있다. 왕도를 따라가보자. 드림핵에서 제공하는 xxd 사용방법은 단순히 xxd FILE.bin 의 형태였는데, 이를 실행하면 다음과 같은 형태의 파일을 만날 수 있다. 반면에 Chat김피탕에서는 -i 옵션을 부여하고 *.h 확장자를 가지는 별도의 파..
[pwn] shell_basic -상- (orw 쉘코드를 작성해보려고 노력해보자)
·
War Game/dreamhack.io
orw 쉘 코드는 open, read, write의 머릿글자를 딴 것으로, 파일을 열어(Open) 내용을 읽은 뒤(Read), 그 내용을 화면에 출력한다는(Write) 것을 의미한다. 쉘 권한을 획득하여 일반적인 권한으로는 접근하기 어려운 파일에 접근해 그 내용을 읽어오는 쉘 코드라고 생각하면 되겠다. shell_basic에서 제공하는 코드는 사용자가 입력한 쉘코드를 입력받아 그대로 실행해주는 역할을 수행한다. 쉘 권한을 따내기 위한 작업은 필요하지 않고, 직접 적절한 쉘 코드를 짜서 vm 내에 존재하는 파일에 담긴 flag를 읽어보라는 의미가 되겟따. orw 쉘코드 작성 방법은 링크된 드림핵 강의를 참고하자. 어셈블리어를 처음부터 작성하는 것은 아직 많이 서툴테니 강의를 차근차근 따라가며 작성해보도록 ..
[Network] NAT - PAT와 포트포워딩을 구분지을 수 있을까?
·
Notes/Network
친구와 마인크래프트에서 만나 멀티플레이를 하기 위해서 서버를 열려고 한다. 서버에 친구를 초대하기 위해서는 우선 서버를 열기 위해 마인크래프트 버킷을 세팅하고 우리집 공유기의 25565포트로 들어오는 TCP 패킷을 내 컴퓨터로 전송하도록 공유기 어드민 페이지에서 설정해주어야 한다. 우리는 이 과정을 포트포워딩이라고 부른다. 하나의 공인 ip로 들어오는 요청을 포트 번호 별로 구분지어 사용하는 포트포워딩과 유사하게 우리는 하나의 공인 ip를 보다 효율적으로 사용하기 위해 라우터나 스위치 단계에서 자체적인 주소 체계 (사설 ip)를 만들어 사용한다. LAN을 구성하는 장치들에 사설 ip를 할당하는 프로토콜은 DHCP (Dynamic host Configuration Protocol)라고 부르며, 사설 ip와..
[Web] File-Download-1
·
War Game/dreamhack.io
아래와 같이 서버에 위치한 파일의 경로를 입력하면 해당 파일의 내용을 읽어와 memo에 기록해 보여주는 사이트이다. 이렇게 파일명을 넣고 memo 페이지로 들어가보면... 루트 디렉토리에 있는 flag.py를 읽어오게 하려면 " ../flag.py "를 입력해야 하는데 튕겨낸다. 코드를 살펴보자, #!/usr/bin/env python3 import os import shutil from flask import Flask, request, render_template, redirect from flag import FLAG APP = Flask(__name__) UPLOAD_DIR = 'uploads' @APP.route('/') def index(): files = os.listdir(UPLOAD_DI..