Security
FC3 dark_eyes - hell_fire : remoteBOF, GOT overwrite, mprotect
FC3 dark_eyes - hell_fire : remoteBOF, GOT overwrite, mprotect
2017.05.08GOT overwrite / Remote BOF / [ stdin buf ] Stack layouttemp1024 Byte 12 Byte saved_sfp4 Byte 여기서부터 아래 1024 사용 가능.단, main의 sfp는 제외.buffer256 Byte 8 Byte sfp ret ... strcpy(buffer, temp)니까 결과적으로 1024만큼 쓸 수 있다.입력을 fgets로 처리한다. fgets로 받는 경우 EOF 또는 개행문자(0x0a)를 입력하지 않는 경우 계속 입력을 대기하기 때문에 끝에 \n을 보내주어야 한다. argv로 받는 경우 공백(0x20)은 " "로 묶어서 받아야 하며 0x00은 받을 수 없지만, fgets는 개행문자와 EOF만 인식하므로 공백이나 0x00이 있어도 상관 없다..
[webhacking.kr] 24 : php extrace / str_replace 우회
[webhacking.kr] 24 : php extrace / str_replace 우회
2017.03.09이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
FC3 gate - iron_golem - dark_eyes
FC3 gate - iron_golem - dark_eyes
2017.02.03FC3에 적용된 메모리 보호 기법Stack Dummy : ODown Privileage of bash : ORandom Stack : ORandom Library : XRandom Program Binary Mapped : XASCII Armored Address Space : O mapping address의 첫번째 1Byte가 0x00이라서 library address를 입력하고 나면 이후 parameter 삽입이 불가능하다. phrack의 어떤 문서에서 이렇게 소개되어 ASCII Armor라고 부르는 것 같지만, 요즘 ASCII Armor는 Radix 64를 의미하는 경우가 더 많은 듯.Non-Executable Stack : ONon-Executable Heap : OStack Smashing P..
LOB xavius → death_knight : remote BOF, rawbf
LOB xavius → death_knight : remote BOF, rawbf
2017.01.30xavius - throw me awayremote BOF다. 소켓프로그래밍은 오랜만인데, 그래도 코드가 복잡하지는 않다. 서버 프로그램은 서버에서 돌아가는 거니까, 호스트에서 환경변수 등을 사용할 수는 없지만, 256바이트나 사용할 수 있으니까 그냥 버퍼에 집어넣는게 좋겠다. parent는 while로 계속 돌아가고, child가 recv수행하고 나서 return하므로 child를 사용해 익스플로잇 하게 된다. 근데 recv 직후 close(client_fd) 해서 클라이언트와의 연결이 끊어진다. 따라서 client에 데이터를 전송할 수 없다. 리버스 쉘을 사용하거나, 출력 내용을 저장하도록 해야한다. 리버스 쉘 연결을 대기하도록 쉘코드를 짜기는 귀찮아서 그냥 후자로 진행했다. 주의 )쉘코드가 실행되면..
LOB succubus ~ nightmare → xavius : strcpy / stdin과 fgets
LOB succubus ~ nightmare → xavius : strcpy / stdin과 fgets
2017.01.28succubus - here to stay / strcpystrcpy의 PLT 주소로 리턴해야만 한다. ret이후 4byte를 제외한 공간을 사용할 수 있다.ret+4byte를 제외한 이유는 이전 문제처럼 풀지 않도록 하기 위해서 인 듯. strcpy의 PLT 주소는 0x08048410 PLT-GOT resolve 과정에 문제가 있는게 아니라, main에서 strcpy로 리턴하면서 src와 dest를 내 마음대로 정할 수 있다는게 문제.strcpy의 dest에 retAddr이 있는 곳을 넘겨 수정하면 내가 원하는 곳으로 리턴할 수 있다.(strcpy를 이용하면 FSB처럼 메모리의 어떤 공간에 접근해서 그 부분에 데이터를 쓸 수 있다.)strcpy를 call하고 난 직후 stack의 최상단에 dest, s..
LOB giant ~ zombie_assassin → succubus : ROP
LOB giant ~ zombie_assassin → succubus : ROP
2017.01.18giant - one step closerargv[1][47] == '\xbf' || argv[1][47] == '\x40' 이면 exitstack, library로 return이 불가능하다. 마지막에 memset(buffer, 0, 44); 한다. buffer랑 sfp까지 초기화. 그래도 ret 이후는 남아있다. 당장 생각나는 방법은 shared library의 header를 수정해 library mapping address를 0x40이 아닌 다른 곳으로 바꾸는 것인데... windows의 image base에 대응되는 LOAD 값이 shared library의 경우 0x00000000으로 나온다는게 문제. (readelf -l )linux는 windows와 달리 library에 정해진 mapping ..
LOB darkknight ~ bugbear → giant : ldd와 nm으로 함수 mapping 주소 찾기
LOB darkknight ~ bugbear → giant : ldd와 nm으로 함수 mapping 주소 찾기
2017.01.16darkknight - new attackerargv[1][47] == '\xbf' 이면 exit 한다. 즉 stack으로 return 못한다.RTL 사용하면 된다./bin/my-pass 문자열 삽입은 환경변수를 사용했다. bugbear - new divideret에 들어가는 주소가 execve의 주소여야만 한다. execve인지 검사하기 위해 execve의 주소를 얻는데 ldd와 nm을 사용한다.보통 함수의 주소를 구하기 위해 gdb로 실행한 다음 print 명령을 이용하지만 다음과 같은 방법으로도 가능하다. ldd로 shared library가 mapping되는 주소를 구한다.nm [-D]으로 함수의 offset을 구한 다음 이를 mapping 주소와 더한다. shared library는 fPIC 옵..
LOB golem → darkknight : strncpy size overflow
LOB golem → darkknight : strncpy size overflow
2017.01.12golem - cup of coffee void problem_child(char *src){ char buffer[40]; strncpy(buffer, src, 41); printf("%s\n", buffer); } main(int argc, char *argv[]){ check argc
John the ripper
John the ripper
2016.12.25이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
LD_PRELOAD를 이용한 so injection과 hooking. + wrapping function
LD_PRELOAD를 이용한 so injection과 hooking. + wrapping function
2016.12.19`` LD_PRELOAD``는 prefix로 `` LD_``가 붙은, ld.so에 속하는 환경변수로,windows의 `` AppInit_Dlls`` 레지스트리와 비슷한 역할을 한다.`` LD_PRELOAD``에 설정된 shared object는 libc를 비롯한 다른 모든 shared object보다 먼저 로딩된다.`` LD_PRELOAD``에 설정된 shared library의 함수 중에 이후 로딩된 libc의 함수 이름과 동일한 함수가 있다면 먼저 로딩된( = `` LD_PRELOAD``에 설정된) shared library의 함수를 호출하게 된다. 그래서 결과적으로 보면 자동으로 후킹을 수행하는 것과 같다. 타인 소유 파일에도 동작한다.secure-execution mode로 실행되면 제약이 걸린다..
ptrace - Linux injection ( code injection / so injection )
ptrace - Linux injection ( code injection / so injection )
2016.12.12리눅스는 윈도우의 ``c CreateRemoteThread()``같은 API를 제공하지 않기 때문에, injection에 ``c ptrace()``를 이용한다.2016/12/25 - [System/LINUX & UNIX] - ptrace 타인의 권한으로 실행된 프로세스에는 TRACEME와 ATTACH가 불가능하기 때문에 동작하지 않는다.타인 소유 파일을 내가 실행하는 경우는 동작한다. code injection특정 실행파일에서 원하는 정보를 추출하거나 원하는 동작을 하게 하는 데 유용하게 쓰일 수 있다.code injection을 통해 target 프로세스가 ``c system("echo Code inject");``을 호출하게 해 "Code inject" 문자열을 출력하도록 해보았다. Ubuntu 15..
FSC level3
FSC level3
2016.11.28문자열 check 루틴이 어딘지는 알겠는데,어디 저장되는지 찾아야함. 204 200 4 이렇게 ebx+8이 가리키는 곳에 더하는데이것들은 훼이크고 **(ebx+8)-4하면 문자열 있는 193A84나옴.-4나오는 시점이 진짜임. 거서부터 문자열처리를 시작한다. 카운트 값이 저장되는 곳은 null check2 후에ebx+64 -> **(ebx+8) -> **(ebx+8)+200 // ecx를 사용.후에 eax랑 ebx+64에 이 카운트 값이 들어가고나중에 ebx+64랑 ebx+68이랑 ADD해서, 처리해야 하는 문자 1개 얻음. 조건분기 2에서 *(ebx)과 *(ebx+64)를 비교한다. 둘 다 **은 문자열인데, *값은 다르다.뭐 중요한건 아닌거같다. 훼이크인듯 조건분기 3이 중요. 여기서 문자열의 개수가..