반응형

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <malloc.h> int main() { printf("Welcome to poison null byte 2.0!\n"); printf("Tested in Ubuntu 14.04 64bit.\n"); printf("This technique can be used when you have an off-by-one into a malloc'ed region with a null byte.\n"); uint8_t* a; uint8_t* b; uint8_t* c; uint8_t* b1; uint8_t* b2; uint8_t* d; printf("We allocate 0x100 bytes for 'a'.\n"); a = (uint8_t*) malloc(0x100); printf("a: %p\n", a); int real_a_size = malloc_usable_size(a); printf("Since we want to overflow 'a', we need to know the 'real' size of 'a' " "(it may be more than 0x100 because of rounding): %#x\n", real_a_size); /* chunk size attribute cannot have a least significant byte with a value of 0x00. * the least significant byte of this will be 0x10, because the size of the chunk includes * the amount requested plus some amount required for the metadata. */ b = (uint8_t*) malloc(0x200); printf("b: %p\n", b); c = (uint8_t*) malloc(0x100); printf("c: %p\n", c); uint64_t* b_size_ptr = (uint64_t*)(b - 8); /* this technique works by overwriting the size metadata of a free chunk */ free(b); printf("b.size: %#lx\n", *b_size_ptr); printf("b.size is: (0x200 + 0x10) | prev_in_use\n"); printf("We overflow 'a' with a single null byte into the metadata of 'b'\n"); a[real_a_size] = 0; printf("b.size: %#lx\n", *b_size_ptr); uint64_t* c_prev_size_ptr = ((uint64_t*)c)-2; printf("c.prev_size is %#lx\n",*c_prev_size_ptr); b1 = malloc(0x100); printf("b1: %p\n",b1); printf("Now we malloc 'b1'. It will be placed where 'b' was. " "At this point c.prev_size should have been updated, but it was not: %lx\n",*c_prev_size_ptr); printf("Interestingly, the updated value of c.prev_size has been written 0x10 bytes " "before c.prev_size: %lx\n",*(((uint64_t*)c)-4)); printf("We malloc 'b2', our 'victim' chunk.\n"); b2 = malloc(0x80); printf("b2: %p\n",b2); memset(b2,'B',0x80); printf("Current b2 content:\n%s\n",b2); printf("Now we free 'b1' and 'c': this will consolidate the chunks 'b1' and 'c' (forgetting about 'b2').\n"); free(b1); free(c); printf("Finally, we allocate 'd', overlapping 'b2'.\n"); d = malloc(0x300); printf("d: %p\n",d); printf("Now 'd' and 'b2' overlap.\n"); memset(d,'D',0x300); printf("New b2 content:\n%s\n",b2); printf("Thanks to http://www.contextis.com/documents/120/Glibc_Adventures-The_Forgotten_Chunks.pdf " "for the clear explanation of this technique.\n"); }


요약


3개를 할당한 뒤 두번째 chunk를 해제하고 size를 null byte Overwrite한 뒤 원래 b의 크기였던 0x200보다 작은 크기로 두 개를 할당해주고


새로 할당했던 것중 먼저 했던 걸 해제해주고 c를 해제해주게 되면 b2를 overlapping할 수 있게 된다. (forget)


즉, d를 새로 할당하게 되면 b2가 overlapping된 상태로 할당이 된다.



Glibc_Adventures-The_Forgotten_Chunks.pdf


'공부' 카테고리의 다른 글

[IDA] C++ Class 변환  (0) 2017.08.09
[QEMU] iptime emulating  (2) 2017.07.26
64비트 Calling Convention  (0) 2017.05.09
GCC Stack Boundary  (0) 2017.04.27
정보보안기사 정리  (0) 2017.04.20
블로그 이미지

KuroNeko_

KuroNeko

,
반응형


 Linux

Window 

 RDI

 RCX

 RSI

 RDX

 RDX

 R8

 RCX

 R9

 R8

Stack

 R9

Stack



이 순서대로 Argument 가 들어간다.


리눅스는 Argument를 레지스터에 최대 6개까지 지원해주고 나머지는 스택에 Push하는 방식이다


Window는 4개만 지원하고 나머지는 스택에 push하는 방식이다.


즉 64bit ROP짤 때 각각 pop [reg] ret를 찾아서 call chain하면 되겠다

'공부' 카테고리의 다른 글

[QEMU] iptime emulating  (2) 2017.07.26
[how2heap] poison_null_byte  (0) 2017.05.09
GCC Stack Boundary  (0) 2017.04.27
정보보안기사 정리  (0) 2017.04.20
[C++] 프로그램 관리자 권한 요구  (0) 2017.01.04
블로그 이미지

KuroNeko_

KuroNeko

,

GCC Stack Boundary

공부 2017. 4. 27. 16:30
반응형

Ubuntu 16.04에서 gcc로 컴파일 하게 되면 함수의 프롤로그와 에필로그에 ecx를 통한 esp 변조를 하는 것을 볼 수 있는데


이는 SSE계열의 함수들을 위해서 미리 예약해두는 공간이라고 한다.


sse계열의 함수는 고속 복사를 위해서 128비트 단위로 복사를 진행해서 기존의 push ebp, mov ebp, esp와 같은 형태로는 에러가 날 수 있다.


만약 sse계열 함수를 사용하지 않는다면 gcc 에 옵션을 줘서 해결할 수 있는데 옵션은 아래와 같다.


gcc -o hou hou.c -mpreferred-stack-boundary=(2 ~ 12)


여기서 boundary를 계산할 떄는 2^(num)으로 계산되고 스택에서는 최소 4바이트를 push해야하기에 boundary값의 min은 2가 들어간다.


'공부' 카테고리의 다른 글

[how2heap] poison_null_byte  (0) 2017.05.09
64비트 Calling Convention  (0) 2017.05.09
정보보안기사 정리  (0) 2017.04.20
[C++] 프로그램 관리자 권한 요구  (0) 2017.01.04
[how2heap] house_of_spirit  (0) 2016.12.28
블로그 이미지

KuroNeko_

KuroNeko

,

정보보안기사 정리

공부 2017. 4. 20. 00:56
반응형

http://kit2013.tistory.com/209

'공부' 카테고리의 다른 글

64비트 Calling Convention  (0) 2017.05.09
GCC Stack Boundary  (0) 2017.04.27
[C++] 프로그램 관리자 권한 요구  (0) 2017.01.04
[how2heap] house_of_spirit  (0) 2016.12.28
[how2heap] unsafe unlink  (0) 2016.12.26
블로그 이미지

KuroNeko_

KuroNeko

,

[Git] Gitolite 설치

Project 2017. 3. 21. 13:40
반응형

GIT 서버 구축,

 

참, 만만하게 볼 건 없는 것 같다. GIT은 쉬운 툴이고 사용하기도 편리하다는 GIT의 소개와는 달리,

머가 참 구축하기 힘든지....

 

GIT 서버를 구축하면서 현재 당면한 어려움은 인증 부분인 것 같다.( 머 이상이 있는 데, 정확한 분석은 되지 않고,

두리뭉실 "인증 부분이 잘 안되는 건가봐"라는 생각을 하고 있다.)

 

몇 번 설치하고 제거하고를 반복 하면서, 인증 메커니즘에 이해가 되려고 한다.

다시 한 번 시도하여 성공적인 소스서버를 구축하리라!!!

 

 

1. GIT 설치, GITOLITE 설치

 

  우선 GIT 서버 관리는 Gitolite를 이용하여 하려고 한다.

 

  준비된 서버의 OS는 Ubuntu이다.

 

    $ cat /etc/*-release | uniq

  버전 정보가 출력된다.

 

  설치된 버전은 Ubuntu 12.04.4 LTS이다.

 

  GIT 설치는 다음과 같이 한다.

 

    $ sudo apt-get install git-core

 

  버전 확인은 다음과 같이 한다.

 

    $ git --version

 

  현재 설치된 버전은 1.7.9.5가 설치되어 있다. 현재 1.8.5.3.까지 나온 것으로 알려져 있지만, Ubuntu에서는 배포판으로 1.7.9.5 버전을 사용하는 것으로 보인다.

 

  Git을 처음 설치하면, 사용자 정보를 입력해야 한다.

 

    $ git config --global user.name "Warren Beon"

    $ git config --global user.email warren@2x4soft.com

 

    * 이름과 이메일 주소는 각자 자신의 것을 사용한다.

 

 

2. Git 계정 생성

 

  이 챕터는 Gitolite설치/설정에 대해 꽤나 잘 나와있는 블로그에서 발췌했다.

  (펌: http://whatwant.tistory.com/331)

 

 

  Git의 Repository를 운영하기 위한 계정을 생성을 한다: git-repo

  Gitolite를 관리하기 위한 관리자 계정을 생성한다: git-admin

 

    (작업 계정)

    $ sudo adduser git-repo

    $ sudo adduser git-admin

 

  SSH 환경에서 여러 개발자들을 지원해 주기 위해서는 Linux 계정을 그 숫자 만큼 만들어 줘야 한다.

  이 방법은 대표 계정을 만들고, 여러 사용자를 지원하기 위한 방법이다.

 

  현재 작업 중인 계정에서 다른 계정에 접근하기 위해 SSH의 Public-key를 등록한다.

  Git과 무관하게 git-repo, git-admin에 쉽게 접근하기 위해서 하는 작업이다.

 

    (작업 계정)

    $ ssh-keygen (: 키 생성, 암호를 넣지 않는다!!)

 

    $ ssh-copy-id -i ~/.ssh/id_rsa.pub git-repo@localhost (: 키등록)

    $ ssh-copy-id -i ~/.ssh/id_rsa.pub git-admin@localhost (: 키등록)

 

 

3. Gitolite 다운로드 및 설치

 

  Gitolite설치는 repository를 저장하는 git-repo 계정에 설치를 한다.

 

    (작업 계정)

    $ ssh git-repo@localhost (: git-repo 계정으로 진입)

 

    (git-repo 계정)

    $ git clone https://github.com/sitaramc/gitolite.git (: 다운로드 gitolite)

    $ ./gitolite/install (: 설치)

 

  Gitolite의 관리자 계정의 공개키가 필요하다. 따라서 git-admin을 gitolite의 관리자 계정용으로 만들어 놓았고,

  git-admin에서 키를 생성한다.

 

    (git-admin 계정)

    $ ssh-keygen

 

    $ scp ~/.ssh/id_rsa.pub git-repo@localhost:/home/git-repo/.ssh/git-admin.pub

 

  git-admin의 공개키를 git-repo계정으로 전송한다.

 

  전송이 완료되었으며, gitolite setup을 수행시킨다.

 

    (git-repo 계정)

    $ ./gitolite/src/gitolite setup -pk ./.ssh/git-admin.pub

 

  위와 같이 수행하면,

  /home/git-repo/repositories라는 폴더가 생성되며, 폴더 내부에 gitolite-admin.git이라는 저장소가 생성된다.

 

  gitolite의 설정은 설정용 저장소를 만드는 것이고 gitolite의 gitolite-admin.git 저장소의 내용을 수정하고 Push하여 Gitolite를 설정을 한다.

 

  따라서 gitolite의 설정은 gitolite를 관리용으로 만든 계정 git-admin에서 설정을 하게된다.

 

  git-admin계정으로 login하여 gitolite-admin.git 저장소를 clone해 본다.

 

    (git-admin 계정)

    $ cd

    $ mkdir repositories

    $ cd repositories

    $ git clone git-repo@localhost:/gitolite-admin.git

 

 

<레퍼런스>

  - http://whatwant.tistory.com/331

  - git-scm.com/book/ : git-scm에서 제공하는 git 설명서

 

 

 

 

 

 

 

 

 출처 : http://blog.daum.net/un4given/17

블로그 이미지

KuroNeko_

KuroNeko

,
반응형

전에 하던 SSDT 후킹은 64비트에서 실패해버렸고..



먼저 다른 기능을 구현하자고 해서 지금 만들고 있는게,


File/Folder Open history Logger 인데.. 처음에는 간단하게 Global Hooking을 해서 저장하려고 했다.


근데 더 좋은 방법이 떠올랐는데 그게 바로 Filter Driver 가 되겠다.



WDK를 설치했으면 아마도 File Mini Filter라고 visual studio에 생겼을 건데 그 템플릿을 토대로 소스코드를 짜기 시작했다만,


일단 기능은 구현은 끝내놨었다. 근데 문제가 드라이버와 User-mode Application과의 통신이였는데,


가뜩이나 네트워크 공부는 안해놨었고 IOCP는 개념만 알고 있었고(통신하는데 IOCP가 쓰인단다;;)


오늘 하루 아주 커널 드라이버와 통신으로 내 멘탈을 아작 내버렸다.


여차저차 해서 결국 구현하긴 했다만 이걸 또 클래스화 시켜서 확장이 쉽게 하도록 할 계획이다.

블로그 이미지

KuroNeko_

KuroNeko

,
반응형

쉽다. angr로 코딩해서 돌려주면 되는데 양이 많다.


어쨋든 아래의 소스코드를 참조하면 된다.


#!/usr/bin/env python

import angr

for i in range(1, 102):
	p = angr.Project("./prob" + str(i))

	offset = 0
	with open("./prob" + str(i), "rb") as f:
		buf = f.read()
		offset = buf.index("\x83\xF8\x01\x75\x0C") + 5
	print hex(offset)

	arg1 = angr.claripy.BVS("arg1", 8*8*90) # 90 bytes
	st = p.factory.entry_state(args=["./prob" + str(i), arg1])
	pt = p.factory.path(st)
	ex = p.surveyors.Explorer(start=pt, find=0x400000 + offset)
	ex.run()
	print ex.found[0].state.se.any_str(arg1)


'Write up > CTF' 카테고리의 다른 글

[Codegate 2019] writeup  (0) 2019.01.29
[RCTF 2017] RCalc  (0) 2017.05.22
[Codegate2017 Pre] BabyMISC  (0) 2017.02.11
[Codegate2017 Pre] BabyPwn  (0) 2017.02.11
[RC3 2016] IMS-easy (150pt) *수정  (0) 2016.11.20
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

IDA로 까보면 아래와 같이 3개의 stage로 나뉘어 져있다.




먼저 Stage1을 까보면 아래와 같이 되있다.




Base64의 Collision을 일으키면 통과된다.


간단하니 구글 검색만 해도 나온다





Stage2는 길이가 달라지면 통과가 된단다.


Base64는 =로 Padding을 하니까 =를 넣어주면 통과된다.,





마지막으로 Stage3인데 필터링을 우회하면 된다.


preg_comp함수로 cat 이나 flag나 말고도 다른걸 막아뒀는데 head나 tail을 안막아놨으니


head fla* 를 base64로 인코딩해서 넣어주면 클리어가 되겠다.

'Write up > CTF' 카테고리의 다른 글

[RCTF 2017] RCalc  (0) 2017.05.22
[Codegate2017 Pre] EasyCrack101  (0) 2017.02.11
[Codegate2017 Pre] BabyPwn  (0) 2017.02.11
[RC3 2016] IMS-easy (150pt) *수정  (0) 2016.11.20
[CSAW_2014] Xorcise(Pwnable500)  (0) 2016.07.30
블로그 이미지

KuroNeko_

KuroNeko

,