전체 글

전체 글

    [lob] gate -> gremlin

    1. intro 사실 옛날옛적, 그러니까 십 몇여년 전에 대부분의 문제를 풀었었다. 다시 해킹 공부를 하기로 마음먹은 뒤에는 일반적인 방법으로 풀고 싶지 않았고, 조금이라도 나에게 도움이 되는 방법으로 풀고 싶었다. 그래서 코드 파일을 보지 않고 gdb를 통한 어셈블러 코드만 보고 문제를 풀었었고, 이 write up 들도 모두 그렇게 글을 써내려갈 예정이다. 물론 시스템이, 컴파일러가 바뀌면서 지금의 어셈블러 코드와 다른 부분이 다소 있긴 하지만, 핸드레이에 도움이 된 것은 확실하다. 누군가 이 글을 본다면 비슷한 방법으로 도전해보는 것도 좋을 것 같다. 2. code 및 분석 2.1 C code /* The Lord of the BOF : The Fellowship of the BOF - gremli..

    [lob] 들어가기 전에 - shellcode 제작.

    1. intro 문제를 풀기 전에 shellcode 제작부터 조금 알아보자. 물론 이미 인터넷에는 많은 shellcode가 올라와있고, pwntools에서는 무려 자동으로 만들어주기까지 한다. 하지만 이를 이해하면 어셈블리어 공부와 더불어 다른 shellcode 작성을 위한 기초가 된다. 이 글에서는 lob만을 위한 shellcode를 작성할 예정이다. 2. shellcode란 보통 shell을 실행시켜주기 위한 기계어의 집합을 이야기한다고 생각할 수 있는데, 단순히 shell만 실행시켜주는 것이 아닌 특정 동작을 하기 위한 모든 code라고 이해하는 것이 좋다. 그 이유는 간혹 문제에서 shell을 따는 것이 아닌 flag를 바로 읽어야하거나, 바인드 / 리모트 셀과 같이 포트를 열어주는 동작 등을 해..

    assembly code 기초

    1. 서론 많은 프로그래밍 언어 중 단연 최고는 어셈블리어라고 생각한다. 그 이유는 우리가 여러 언어로 코딩을 하더라도 결국 컴퓨터가 알아들을 수 있는 기계어로 가기 전 어셈블리어를 거치기 때문이다. 2. 문법 어셈블리어는 다시 2가지 문법을 가지고 있다. 아래 테이블만 알면 충분하다. Intel 방식 AT&T 방식 명령어 mov movb, movw, movl 인자 순서 dest, src src, dest 레지스터 eax %eax 상수 0h $0x0 간접 주소 [eax] (%eax) 개인적으로 AT&T 방식이 조금 더 직관적이기에 이를 사용한다. 2. 명령어 아래 정도만 알면 충분하며, 이외에는 아래 기초 명령어에서 확장된 명령어라고 생각한다. 특징은 일단 참고만 하자. 2.1. 데이터 이동 2.1.1...

    [lob] the Lord Of Buffer overflow를 시작하며

    hackerschool에서 제공하는 buffer overflow 모의 해킹 시스팀이다. +해커스쿨 커뮤니티+ by HACKERSCHOOL.org www.hackerschool.org 만들어진지 오래 되었으며, 32 bit 환경인 구버전 os로 만들어졌기 때문에 최근의 문제들과는 많이 다르다. 그래서 사실 buffer overflow를 이미 접해보았다면 풀지 않아도 무방한 수준이다. 그래도 만일 누군가 buffer overflow를 시작한다면 망설임 없이 추천해줄 수 있는 시스템 중 하나이다. 개인적으로 이미 모든 문제를 푼 지 오래 됐고 다시 정리하는 수준에서 글을 쓰려 한다. 서두에 작성한 것 처럼 os 버전도 많이 낮고, 지금은 거의 사용되지 않는 32 bit 환경이기에 굳이 다시 봐야하나 라는 생각..

    docker <-> host 파일 전송

    1. 서론 컨테이너를 생성하고 실행했으면, 문제 파일을 해당 os 내에서 풀어야하는데 파일은 어떻게 줘야할까. docker는 쉽게 파일을 주고 받을 수 있는 cp 명령어를 가지고 있다. 2. host -> docker 매우 간단하다. host 쪽에서 터미널을 열어 아래와 같이 실행하면 된다. docker cp [경로를 포함한 파일 명] [컨테이너 ID]:[컨테이너의 붙여넣을 경로] 예를 들어 호스트에 있는 text 파일을 컨테이너의 root 폴더에 복사하려면 아래와 같다. C:\docker> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d0c6d974ffc 10.04:latest "/bin/bash" 11 hours ago Up 10..

    system hacking을 위한 docker 설치 및 사용법

    1. 서론. 지금까지 kali linux가 멋져보여 이를 사용해 모든 pwnable 문제를 풀고 있었다. 하지만 가면 갈수록 libc version matching 및 분석의 어려움을 느낌과 동시에 최근 ctf 트렌드 상 docker 사용이 필수적인 것 같아 이에 대해서 조금 알아보았고, 별도 linux 환경을 마련하는 것보다 훨씬 효율적이라고 판단하여 이를 사용하기로 했다. 다만 여러 문서를 참고해봐도 구축 방법에 대한 아주 상세한 설명이 대부분이지 단순히 사용하는 방법에 대해서는 별로 설명이 없어서 글을 쓰게 되었다. docker는 간단히 설명하자면 가상 os의 일종이며, 한번만 구축하고나면 쉽고, 빠르고, 간편하게 여러 os를 사용할 수 있게 된다. 2. 사용 방법 2.1 설치 결국 한국인은 윈도우..

    Return to csu

    최근에 꽤나 재미있는 기법을 알게되어 그 기록을 남긴다. 느낀점은 결국 ret address 변조가 가능하면 니 컴퓨터 = 내 컴퓨터 1. 서론 만일 rop 시 적절한 gadget이 구해지지 않는 경우에는 어떻게 하면 좋을까? 예를 들면 read 함수에서 rsi 값은 입력 받는 크기를 가지고 있는데, 이 값이 항상 0이고 pop rsi gadget이 없다면 어떻게 해야할까. 이런 경우에 return to csu 기법을 사용할 수 있다. 2. 원리 2.1. 기본 원리 사실 프로그램을 실행하면 main 함수부터 실행되는 것 같지만, 그 전에 실행되는 함수들이 있다. 이는 프로그램 실행 전, 실행을 위한 일련의 동작인데 예를 들자면 코드를 메모리에 넘겨주거나 인자를 넘겨주거나 하는 역할을 한다. 이에 대부분의..

    one gadget 사용법

    1. 서론 one gadget, one shot gadget 등으로 불리며, libc 파일 내에서 execve(/bin/sh,0,0) 과 같은 셀을 실행시켜주는 hex code가 나열된 위치를 출력해주는 프로그램이다. 즉, return 시 onegadget 주소로 jmp하면 셀이 실행된다는 것이다. 물론 libc 파일 내에서 직접 하나씩 찾아도 되지만, 노가다를 자동화해줬다는 점에서 큰 도움이 된다. pwn · GitHub Topics · GitHub GitHub: Where the world builds software GitHub is where over 83 million developers shape the future of software, together. Contribute to the op..

    함수 호출 규약.

    레지스터에 대한 기초를 이해하고 난 뒤에 봐야하는 글. https://wyv3rn.tistory.com/144 system hacking을 register 기초 1. register란 간단히 요약하자면, 프로그램이 실행되면 기본적으로 ram에 필요한 데이터들이 적재되는데, 연산을 포함한 실행은 register가 담당하게 된다. 즉, 프로그램이 실행되면 특정 동작을 위 wyv3rn.tistory.com 1. 서론 각 레지스터들이 데이터 연산 시 어떻게 사용되는지는 위 글과 같이 보았는데, 프로그램 실행 시 레지스터는 과연 무슨 역할을 할까? 2. 함수 호출 규약 함수를 호출할 때 파라미터 즉, 인자를 어떤 방식으로 전달할지 정해놓은 규약이다. 2.1 32 bit 함수 호출 규약 3가지 방식이 있는데, 결국..

    system hacking을 register 기초

    1. register란 간단히 요약하자면, 프로그램이 실행되면 기본적으로 ram에 필요한 데이터들이 적재되는데, 연산을 포함한 실행은 register가 담당하게 된다. 즉, 프로그램이 실행되면 특정 동작을 위한 명령어들을 ram에 적재, 적재된 순서대로 register가 값을 가져가 연산. 그 결과를 다시 ram에 적재. 하는 식으로 프로그램은 작동한다. 2. register 종류와 역할 각 register는 사실 각각의 역할이 있다. 기억하면 좋겠지만 사실 분석 시 조금 더 도움이 되는 수준이라 기억하지 않아도 전혀 문제 없다. 아래는 hello 문자열을 출력하는 간단한 프로그램을 gdb로 열어 start 명령어 직후 레지스터에 들어간 값 들이다. $rax : 0x00555555556004 → 0x00..