system hacking ๐Ÿ“ฑ/shellocde

shellcode (2)

Kortsec1 2020. 12. 18. 02:14

์นด๋…œ์™ˆ : shellcode so yeezy

 

1ํŽธ์— ์ด์–ด์„œ system call ํ˜ธ์ถœ ๋ถ€๋ถ„๋งŒ์„ ๋”ฐ๋กœ shellcode๋ฅผ ๋งŒ๋“ค์–ด๋ด…์‹œ๋‹ค.

 

<hello_4>

 

์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ๋” ํŽธํ•œ intel ๋ฌธ๋ฒ•์œผ๋กœ ์ฝ”๋”ฉํ•ด ๋ณผ๊ฒŒ์š”.

 

hello.asm hello.o hello
assembly source file assembler (nasm) object file linker (ld) executable file

 

 

<hello.asm>

     1  BITS 32
     2
     3  global _start
     4
     5  section .text
     6  _start:
     7          ; write(4, "hello world!" addr, 13)
     8          mov eax, 4
     9          mov ebx, 1
    10          push 0x0a
    11          push 0x21646c72
    12          push 0x6f77206f
    13          push 0x6c6c6568
    14          mov ecx, esp
    15          mov edx, 13
    16          int 0x80
    17
    18          ; exit(0)
    19          mov eax, 1
    20          mov ebx, 0
    21          int 0x80

 

BITS 32 : 32bit ํ”„๋กœ๊ทธ๋žจ ์ž„์„ ๋ช…์‹œ

global _start : Linker ๋กœ ํ•˜์—ฌ๊ธˆ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค๋•Œ _start ํ•จ์ˆ˜๊ฐ€ entry point ์ž„์„ ๋ช…์‹œ

section .text : text์„น์…˜์— ๋‹ค์Œ์„ ์ž…๋ ฅ

mov {destination}, {source} : ํ›„์ž์˜ ๊ฐ’์„ ์ „์ž์— ๋ณต์‚ฌ

push {data} : stack์— data๋ฅผ ์ €์žฅ

int 0x80 : system call ํ˜ธ์ถœ

 

 

eds000n.github.io/syscalls-x86.html

 

Linux Syscall Reference

 

eds000n.github.io

 

system call write ํ•จ์ˆ˜๋Š” ์ด 4๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

eax ebx ecx edx
writeํ•จ์ˆ˜์˜ syscall ๋ฒˆํ˜ธ fd (ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ) *buf (๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ) len (๋ฌธ์ž์—ด์˜ ๊ธธ์ด)
4 1 &(๋ฌธ์ž์—ด) 13

 

์—ฌ๊ธฐ์„œ ecx์— ์–ด๋–ป๊ฒŒ ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๋ฅผ ๋„ฃ๋Š”์ง€ ๋ด…์‹œ๋‹ค. (์ฝ”๋“œ10~14)

 

  1. push๋ฅผ ํ†ตํ•ด "hello world!\n"๋ฅผ ์Šคํƒ์ƒ์— ์˜ฌ๋ฆฌ๊ธฐ
  2. mov ecx, esp๋ฅผ ํ†ตํ•ด ecx์— ํ•ด๋‹น์Šคํƒ์˜ ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌ 

 

1๋ฒˆ ๊ณผ์ •์„ ํ†ตํ•ด stack์—๋Š” "hello world!\n"๋ฌธ์ž์—ด์ด ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋˜๊ณ , esp๋Š” ์ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

(esp๋ ˆ์ง€์Šคํ„ฐ๋Š” ์Šคํƒ ๋๋ถ€๋ถ„์˜ ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ ์žˆ์Šต๋‹ˆ๋‹ค.)

=====================================

= "hello world\n" → 0x68656c6c6f20776f726c64210a

= little endian ๋ฐฉ์‹์œผ๋กœ 4byte์”ฉ ๋Š์–ด์„œ pushํ•ฉ๋‹ˆ๋‹ค.

=                                                        ← push

= 0x68656c6c | 0x6f20776f | 0x726c6421 | 0x0000000a

= ์™œ๊ทธ๋Ÿฐ๊ฑด์ง€๋Š” ๋‹ค๋“ค ์•„์‹ค๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

=   ๋‡Œ ์žฌ๋ถ€ํŒ…์„ ์œ„ํ•œ ์ฐธ์กฐ๋ฌธ์„œ

======================================

์ด๋ ‡๊ฒŒ stack์˜ ์ฃผ์†Œ๊ฐ€ ๋‹ด๊ธด esp๋ฅผ ecx์— ๋„ฃ์–ด์คŒ ์œผ๋กœ์จ, ๋ฌธ์ž์—ด์˜ ์ฃผ์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ์ •์ƒ์ ์ธ ์ข…๋ฃŒ๋ฅผ ์œ„ํ•ด exit ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

 

eax ebx
exit ํ•จ์ˆ˜์˜ syscall ๋ฒˆํ˜ธ error_code
1 0

 

๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด ๋ฐ˜๊ฐ‘๊ฒŒ ์„ธ์ƒ์—๊ฒŒ ์ธ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ objdump๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ธฐ๊ณ„์–ด์ฝ”๋“œ๋ฅผ ์ญ‰ ๋ฝ‘์•„๋‚ผ ์ฐจ๋ก€ (๊ณ ๊ฒƒ์ด ๋ฐ”๋กœ shellcode)

 

<hello_5>

 

 

์ €๋Š” ๊ฐ„๋‹จํ•œ python ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด๋ดค๋Š”๋ฐ ๊ด€๋ จ ๋ชจ๋“ˆ์ด ์žˆ๋Š”์ง€ ์ฐพ์•„๋ด์•ผ๊ฒ ๋„ค์š”..^^;;

์ƒ๋‹นํžˆ ๋ฌด์‹ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋†”์„œ ๋ถ€๋„๋Ÿฝ์ง€๋งŒ, ํ˜น์‹œ ์‚ฌ์šฉํ•˜์‹ค๋ถ„ ๊ณ„์‹œ๋‹ค๋ฉด.. ๊ฐํžˆ ์˜ฌ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

import os

os.system("objdump -d hello > temp")
f = open('temp', 'r')

shellcode = ""
data = f.read().split('\n\n')

for i in range(2, len(data)):
    tmp = data[i].split('\t')

    tmp2 = ""
    for j in range(len(tmp)/2):
        tmp2 = tmp[j*2+1]
        tmp2 = tmp2.split(' ')
        
        code = ""

        for k in range(len(tmp2)):
            code += tmp2[k]

        for k in range(len(code)/2):
            shellcode += "\\x" + code[k*2:k*2+2]

os.system("rm temp")
print "shellcode len : " + str(len(shellcode)/4)
print shellcode

 

3๋ฒˆ์งธ ์ค„ objdump -d {ํŒŒ์ผ๋ช…}์„ ์ ์ ˆํžˆ ๋ณ€๊ฒฝํ•˜์—ฌ python2 ๋กœ ์‹คํ–‰์‹œ์ผœ ๋ณด๋ฉด

์•„๋งˆ ์š”๋กœ์ผ€ ์ž˜ ๋‚˜์˜ฌ๊ฒ๋‹ˆ๋‹ค.

shellcode len : 48
\xb8\x04\x00\x00\x00\xbb\x01\x00\x00\x00\x6a\x0a\x68\x72\x6c\x64\x21\x68\x6f\x20\x77\x6f\x68\x68\x65\x6c\x6c\x89\xe1\xba\x0d\x00\x00\x00\xcd\x80\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80

 

 

์ฒซ shellcode๋ฅผ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค

์ด์ œ ์ง์ ‘ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด๋Ÿฌ ๊ฐ€๋ณด์ฃ 

 

 

<hello_5>

 

๋ณ€์ˆ˜ shellcode์— ๊ฐ์ž ๋งŒ๋“  shellcode๋ฅผ ๋„ฃ์–ด์ฃผ์‹œ๊ณ 

์ปดํŒŒ์ผ์„ ๊ฑฐ์นœ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰์‹œํ‚ค๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ hello world!

 

์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์€ gcc ์ปดํŒŒ์ผ ์˜ต์…˜์— -z execstack ์˜ต์…˜์„ ๊ผญ ๋„ฃ์–ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ shellcode๊ฐ€ stack์ƒ์— ์˜ฌ๋ผ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์˜ต์…˜์ด ์—†๋‹ค๋ฉด ๋ณดํ˜ธ๊ธฐ๋ฒ•์— ์˜ํ•ด ์‹คํ–‰์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

<hello_6>

GNU_STACK์˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ž˜ ๋ณด๋ฉด ๋ณดํ˜ธ๊ธฐ๋ฒ•์„ ๊บผ์ฃผ์—ˆ์„๋•Œ E(์‹คํ–‰๊ถŒํ•œ)๊ฐ€ ์ถ”๊ฐ€ ๋˜์—ˆ์Œ์„ ๋ณผ์ˆ˜ ์žˆ์ฃ ?

 

 

 

 

 

์ด๋ ‡๊ฒŒ ์„ฑ๊ณต์ ์œผ๋กœ shellcode๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค... ๋ผ๊ณ  ํ• ์ค„ ์•Œ์•˜๋‹ค๋ฉด ๊ฒฝ๊ธฐ๋„ ์˜ค์‚ฐ.

๋งŒ๋“  shellcode๋ฅผ ์‹ค์ œ ๊ณต๊ฒฉ์— ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด ๋ณด์‹œ๋ฉด ์•„๋งˆ ์ž‘๋™์ด ๋˜์งˆ ์•Š์„๊ฒ๋‹ˆ๋‹ค.

 

๊ทธ ์ด์œ ๋Š” shellcode์† 0x00๋•Œ๋ฌธ์ธ๋ฐ์š”.

๋‹ค๋“ค ์•„์‹œ๋‹ค์‹œํ”ผ 0x00์„ ๋งŒ๋‚˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌธ์ž์—ด์˜ ๋์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋’ค ์ฝ”๋“œ๊ฐ€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

 

 

ํ•œ๋ฒˆ ๋ณผ๊นŒ์š”

 

<hello_7>

 

๊ธธ์ด๊ฐ€ 48์ด ์•„๋‹Œ, 2๋ผ๊ณ  ๋‚˜์˜ค์ฃ ?

์ด๋ฅผ ์šฐ์งค๊ณ ...

 

to be continued..

'system hacking ๐Ÿ“ฑ > shellocde' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

shellcode (0x2f ์—†์• ๊ธฐ)  (0) 2020.12.19
shellcode (4)  (0) 2020.12.19
shellcode (3)  (0) 2020.12.18
shellcode (1)  (0) 2020.12.17