Shellcode 작성 김영성.

Slides:



Advertisements
Similar presentations
Datamining Lab 이아람.  How to count the matches The cat ate the bird.  Token : 5/Type : 4.
Advertisements

윤준혁 (12), 이주연 (13), 박혜원 (14), 안혜경 (15) 허니버터칩으로 알아본 SNS 의 영향 력.
1 ‘ 우리나라의 주요공업 ’ - 정도웅, 주민혁, 안수진, 백경민, 엄다운, 박경찬 -.
- 1 - 정보 보안 개론과 실습 시스템 해킹과 보안 팀원 : 박진영 한동섭 · 권혁진.
수유부의 약물복용 시 주의점 발표자 조기성. 모유 수유의 장점 모유 수유의 장점은 ? 위장관 질환 발생감소 영아 돌연사 발생감소 아토피 질환 발생감소 정서적 안정.
일 시 : (목) 장 소 : 문산종합사회복지관장) 파주시문산종합사회복지관 기관안내.
서울시 ‘찾아가는 동 주민센터’ 사업 시행 이후 지역사회의 변화
Basic of Buffer Over Flow
박주현 Exploit Helpers 안녕하세요 포너블을 도와주는 exploit helpers에 대해 발표하게된 박주현이라고 합니다.
공부할 내용 조상들이 살던 곳 자연과 잘 어울리는 한옥 지방에 따라 서로 다른 집의 모양 섬 지방의 집
사랑, 데이트와 성적 자율성 :데이트 성폭력!!! 성폭력예방교육 전문강사 / 여성학 전공 신 순 옥.
1636 쇼핑몰.
CRT 뽀개기 신영진.
2012사회복지현장실습 고윤지.
퇴계와 율곡의 사회사상 비교 남 일 재 동서대학교 교수/ 정치학 박사 1. 퇴계 이황과 율곡 이이의 약전(略傳)
제3장 사회 복지 발달사.
문헌정보학과, 사서만 있는 줄 아니? 10. Mushroom
501. 군인들의 세상 502. 민정 이양과 한일회담 이선용.
2015년 하반기 소방교육 자 유 전 공 학 부 (금) 안녕하십니까 자유전공학부 행정실 입니다.
쌍용차 회생계획안을 통한 투기자본(=먹튀자본) 수강과목: 회 계 학 원론 담당교수: 박 성 환 교수님
제4장 어셈블리어.
실습 7-3 gdb 분석을 통해 취약 프로그램의 힙 버퍼 오버플로우 개념 이해하기
Lecture #12 인터럽트 Interrupt.
버퍼 오버플로우 by 강희원,김무혁.
Lecture #7 어셈블리어 (4) 매크로 어셈블리어 시스템프로그래밍.
제 7 장 링커와 로더 설계.
System Call Linux Kernel 수업 3번째.
제 1 장 마이크로프로세서의 기본동작.
Lecture # 어셈블러 설계.
논리의 표현 진법과 숫자 표현 2진수와 10진수 문자의 표현
2 80×86 시스템에 대한 이해.
버퍼 오버플로우에 대한 대책과 발전된 공격 안전한 함수 사용 버퍼 오버플로우에 취약한 함수 사용하지 않기
아동복지 제9장.
Software Exploit and Kernel Protection
제 18 강 데이터 타입 타입, 변환, 캐스팅 shcho.pe.kr.
+ 가상 메모리 -> 물리 메모리 Selector Offset DIR Page Segmetatation
Lecture #8 어셈블리어 (5) 매크로 어셈블리어 시스템프로그래밍.
버퍼 오버플로우 시스템보안 인터넷공학전공 권영락.
리버스 엔지니어링 안녕하십니까? 리버스 엔지니어링 발표를 맡은 정창하입니다. 지금부터 리버스 엔지니어링 발표를
어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS 이 종 태
Chapter 06 명령어와 번지지정 방식.
Operating System 5주차 - System Call Analysis -
제 6 장 8086 어셈블러 설계.
8086 프로세서의 구조 및 동작 방식 시스템 프로그래밍 - Lecture #2 신라대학교 컴퓨터공학과 시스템 프로그래밍.
BOF of 2.6 Kernel ! 박수완 / Su-Wan, PARK [ L1nkC] 숭실대학교 정보보호동아리 ACK
제3장 8086 프로세서의 내부구조.
인천대학교 보안동아리 OneScore 김영성, 최창원, 이철원, 김현준, 박기완, 김하림, 김민영.
명품 C++ 프로그래밍 1장. C++ 시작.
Buffer Overflow
제13장 장애인 복지.
Computer System Architecture
3-16. 디지털 시계.
발표자료는 다음링크에서 다운로드 받으실 수 있습니다.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 09. C언어의 핵심! 함수!
정치개혁의 가능성 논의 권력구조 개편을 통하여 본 -개헌을 통한 정부형태의 변화를 중심으로 [한국정치론] 윤성이 교수님
Copyrightⓒ ohta. All Rights Reserved.
치료 레크레이션 프로그램 (지적 장애 대상) 과 목: 학 과: 학 번: 이 름: 제 출 일 자 담 당 교 수:
HW 1: Buffer Overflow.
3조 권기태 윤주영 은화령 이형찬 이송민 김동욱 한승묵
노년기 발달 장안대 행정법률과 세류반 정 오 손
FTZ 과제풀이 Level 11,12 HyunJae Lee
태국 문학 욜라다 왓짜니 싸란차나 팟차라와라이 끼따야펀 르앙다우 타니다.
세일즈의 원칙과 기술.
평생 저축해도 강남 아파트 못산다 학 과 : 회계학과 1학년 B반 과 목 : 회계학원론 담당교수: 박성환 교수님
경영학의 상황학파에 대해서… 경제학과 3학년 최준용 회계학과 4학년 진현빈
워밍업 실뭉치 전달게임.
10장. 컴퓨터 구조에 대한 세 번째 이야기 작성자: 윤성우.
음파성명학 최종욱.
자바 가상 머신 프로그래밍 Chapter 3. 메소드 작성하기 Pslab 오민경.
C프로그래밍 도구 컴퓨터공학과 강성인.
Presentation transcript:

Shellcode 작성 김영성

CONTENTS INDEX 1 필요지식 2 Shellcode 작성방법 3 Shellcode 작성

CONTENTS 1] 필요지식 1 스택 2 레지스터 3 스택프레임 4 어셈블리 구조와 기본명령어 5 Systemcall

01│ Stack, Register, StackFrame contants 01

02│ 기본 어셈블리어 contants 01

2] Shellcode 작성방법 1. 원하는 코드를 C언어로 작성 2. 코드를 어셈블리어로 변환( gcc –s ) 3. 생성된 어셈블리어를 참조하여 필요한 부분만 이용하여 따로 작성 ( 문자열 상수의 경우 참조가 안되므로, 상대적인 주소로 바꿔줘서 작성 ) 4. 작성한 어셈블리어 코드를 바이너리 코드로 변경했을 때, NULL 이 포함되어있으면 NULL이 포함되지 않게 수정 (ex) movb 0x00, $eax -> xor $eax, $eax 5. ShellCode 작성 contants 01

3] Shellcode 작성 CONTENTS 1 C언어 코드 작성, 어셈변환 2 필요한 부분만 어셈블리어 재작성 2 필요한 부분만 어셈블리어 재작성 3 NULL이 포함된 바이너리 바꿔주기

01│ C언어 코드 작성, 어셈변환(1) main() { write(1,"I'm Willy in Null@Root\n",23); } [willy@Null@Root]$ gcc test21.c -o test21 -mpreferred-stack-boundary=2 -static [willy@Null@Root]$ gdb -q test21 (gdb) disassemble main Dump of assembler code for function main: 0x80481dc <main>: push %ebp 0x80481dd <main+1>: mov %esp,%ebp 0x80481df <main+3>: push $0x17 0x80481e1 <main+5>: push $0x808b1c8 0x80481e6 <main+10>: push $0x1 0x80481e8 <main+12>: call 0x804c390 <__libc_write> 0x80481ed <main+17>: add $0xc,%esp 0x80481f0 <main+20>: leave 0x80481f1 <main+21>: ret 0x80481f2 <main+22>: nop 0x80481f3 <main+23>: nop End of assembler dump. contants 01

01│ C언어 코드 작성, 어셈변환(2) (gdb) disassemble __libc_write Dump of assembler code for function __libc_write: 0x804c390 <__libc_write>: push %ebx 0x804c391 <__libc_write+1>: mov 0x10(%esp,1),%edx 0x804c395 <__libc_write+5>: mov 0xc(%esp,1),%ecx 0x804c399 <__libc_write+9>: mov 0x8(%esp,1),%ebx 0x804c39d <__libc_write+13>: mov $0x4,%eax 0x804c3a2 <__libc_write+18>: int $0x80 0x804c3a4 <__libc_write+20>: pop %ebx 0x804c3a5 <__libc_write+21>: cmp $0xfffff001,%eax 0x804c3aa <__libc_write+26>: jae 0x804cab0 <__syscall_error> 0x804c3b0 <__libc_write+32>: ret End of assembler dump. contants 01

02│ 필요한 부분만 어셈블리어 재작성(1) contants 01

02│ 필요한 부분만 어셈블리어 재작성(2) [willy@Null@Root]$ cat test23.s .LC0: .string "I'm Willy in Null@Root\n" .globl main main: movl $0x04, %eax movl $0x01, %ebx movl $.LC0, %ecx movl $0x17, %edx int $0x80 <--- write()를 위한 인터럽트 movl $0x01, %eax movl $0x00, %ebx int $0x80 <--- exit(0)을 위한 인터럽트 ret contants 01

02│ 필요한 부분만 어셈블리어 재작성(3) .globl main main: jmp strings start: popl %esi movl $0x04, %eax movl $0x01, %ebx movl %esi, %ecx movl $0x17, %edx int $0x80 movl $0x01, %eax movl $0x00, %ebx strings:call start .string "I'm Willy in Null@Root\n" contants 01

02│ 필요한 부분만 어셈블리어 재작성(4) char shell_code[] = 0804841c <main>: 804841c: eb 20 jmp 804843e <strings> 0804841e <start>: 804841e: 5e pop %esi 804841f: b8 04 00 00 00 mov $0x4,%eax 8048424: bb 01 00 00 00 mov $0x1,%ebx 8048429: 89 f1 mov %esi,%ecx 804842b: ba 17 00 00 00 mov $0x17,%edx 8048430: cd 80 int $0x80 8048432: b8 01 00 00 00 mov $0x1,%eax 8048437: bb 00 00 00 00 mov $0x0,%ebx 804843c: cd 80 int $0x80 0804843e <strings>: 804843e: e8 db ff ff ff call 804841e <start> 8048443: 49 dec %ecx 8048444: 27 daa 8048445: 6d insl (%dx),%es:(%edi) 8048446: 20 57 69 and %dl,0x69(%edi) 8048449: 6c insb (%dx),%es:(%edi) 804844a: 6c insb (%dx),%es:(%edi) 804844b: 79 20 jns 804846d <__do_global_ctors_aux+0xd> 804844d: 69 6e 20 4e 75 6c 6c imul $0x6c6c754e,0x20(%esi),%ebp 8048454: 40 inc %eax 8048455: 52 push %edx 8048456: 6f outsl %ds:(%esi),(%dx) 8048457: 6f outsl %ds:(%esi),(%dx) 8048458: 74 0a je 8048464 <__do_global_ctors_aux+0x4> char shell_code[] = "\xeb\x20\x5e\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\x89\xf1\xba\x17\x00\x00\x00" "\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xdb\xff\xff\xff" "I'm willy in Null@Root\n"; contants 01

03│ NULL 이 포함된 바이너리코드 바꿔주기(1) contants 01

03│ NULL 이 포함된 바이너리코드 바꿔주기(2) 0804841c <main>: 804841c: eb 17 jmp 8048435 <strings> 0804841e <start>: 804841e: 5e pop %esi 804841f: 31 c0 xor %eax,%eax 8048421: 31 db xor %ebx,%ebx 8048423: 31 d2 xor %edx,%edx 8048425: b0 04 mov $0x4,%al 8048427: b3 01 mov $0x1,%bl 8048429: 89 f1 mov %esi,%ecx 804842b: b2 17 mov $0x17,%dl 804842d: cd 80 int $0x80 804842f: b0 01 mov $0x1,%al 8048431: 31 db xor %ebx,%ebx 8048433: cd 80 int $0x80 08048435 <strings>: 8048435: e8 e4 ff ff ff call 804841e <start> 804843a: 49 dec %ecx 804843b: 27 daa 804843c: 6d insl (%dx),%es:(%edi) 804843d: 20 57 69 and %dl,0x69(%edi) 8048440: 6c insb (%dx),%es:(%edi) 8048441: 6c insb (%dx),%es:(%edi) 8048442: 79 20 jns 8048464 <__do_global_ctors_aux+0x4> 8048444: 69 6e 20 4e 75 6c 6c imul $0x6c6c754e,0x20(%esi),%ebp 804844b: 40 inc %eax 804844c: 52 push %edx 804844d: 6f outsl %ds:(%esi),(%dx) 804844e: 6f outsl %ds:(%esi),(%dx) 804844f: 74 0a je 804845b <strings+0x26> contants 01

03│ NULL 이 포함된 바이너리코드 바꿔주기(3) [willy@Null@Root]$ cat test42.c char print_code[] = "\xeb\x17\x5e\x31\xc0\x31\xdb\x31\xd2\xb0\x04\xb3\x01\x89\xf1" "\xb2\x17\xcd\x80\xb0\x01\x31\xdb\xcd\x80\xe8\xe4\xff\xff\xff" "I'm willy in Null@Root\n"; main() { int *ret; ret = (int *)&ret + 2; (*ret) = (int)print_code; } [willy@Null@Root]$ gcc test42.c -o test42 [willy@Null@Root]$ ./test42 I'm willy in Null@Root contants 01

Shell을 띄우기 위해서는? main() { char *name[2]; name[0] = "/bin/sh"; -> System(), exec(), execve() ….등 쉘을 띄울 수 있는 함수를 이용 main() { char *name[2]; name[0] = "/bin/sh"; name[1] = NULL; execve(name[0],name,NULL); } contants 01

참고자료 *** How to make shellcode in linux for beginners *** by Willy in Null@Root contants 01

THANK YOU